迁移数据库记录的算法

时间:2013-05-08 07:27:00

标签: data-migration

我需要将200'000条记录从一个数据库(oracle)迁移到另一个数据库(SQL Server)。我将使用SSIS(SQL Server Integration Services)管理迁移,并且我已经创建了该包。

记录引用数据库中的文档(带有HBLOB字段)。它们需要相当长的时间才能迁移,因此我在SSIS中引入了变量,以便通过使用将变量作为子集的查询每次只迁移一个记录子集。通过这种方式,我可以在上线之前开始移动一些历史记录。

一开始我虽然按ID移动,例如取第一块1'000然后第二块等等。但这是不可能的,因为一些文件(在生产系统中)仍然可以改变,因此它们不能被移动。

这里有禁忌症:

If "Status" is closed   -> the document can be safely taken 
                           (other statuses are draft, pending).
If "CreatedDate" < 2010 -> the document can be moved without taking care of status.
  1. 首先,我可以移动所有“旧”文档(在2010年之前创建)。
  2. 我会将所有文件的状态设置为“已关闭”。
  3. 上线当天,我将迁移所有剩余的记录。
  4. 然而,使用这种模式并不容易跟踪移动的文件(在第[2]点),因为其他文件可以在此期间进入状态。

    有人可以建议更好的程序来移动这些记录而不会冒重复或丢失任何数据的风险吗?

1 个答案:

答案 0 :(得分:1)

尝试使用跟踪迁移文档的临时表,例如:

迁移表

--------------------------------------------------
| MigratedDocId | MigrationTimeStamp    |  Other |
--------------------------------------------------
| 1             | anydate               |  blah  |
--------------------------------------------------
| 2             | anyotherdate          |  blah  |

假设你有一个文件ID(或任何其他PK),这里是主表

--------------------------------------
| DocID    | Status  |  CreationDate |
--------------------------------------
| 1        | closed  |  2011         | (migrated according to [2])
--------------------------------------
| 2        | closed  |  2012         | (migrated according to [2])
--------------------------------------
| 3        | open    |  2011         | (*)
--------------------------------------
| 4        | any     |  2009         | (migrated according to [1])
--------------------------------------

现在,假设(*)行从打开更改为关闭,您需要首先将此行迁移到目标数据库,然后检查迁移:

    SELECT * FROM MAINTABLE
    WHERE STATUS = 'closed'
    AND M.DOCID NOT IN ( SELECT MIGRATEDDOCID FROM MIGRATIONTABLE )

您可以以任何方式改进查询,可能使用JOIN或使用EXCEPT(我更喜欢第二个),但这是获取(*)行的最简单方法。然后在迁移后将DocID插入迁移表。这是临时区域的原则之一,有时(但事实并非如此),您需要一个专用的DB来存储所有这类支持表和视图。