Data migration 迁移数据库记录的算法

Data migration 迁移数据库记录的算法,data-migration,Data Migration,我需要将20万条记录从一个数据库(oracle)迁移到另一个数据库(SQL Server)。我将使用SSIS(SQL Server集成服务)管理迁移,并且我已经创建了包 记录引用数据库中的文档(带有HBLOB字段)。迁移它们需要相当长的时间,因此我在SSI中引入了变量,以便每次只迁移记录的子集,方法是使用一个将变量作为bundaries的查询。通过这种方式,我可以在上线日期之前开始移动一些历史记录 在开始时,我想通过ID移动,例如,以1'000的第一个块为例,然后是第二个块,依此类推。但这是不可

我需要将20万条记录从一个数据库(oracle)迁移到另一个数据库(SQL Server)。我将使用SSIS(SQL Server集成服务)管理迁移,并且我已经创建了包

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

在开始时,我想通过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.
如果“状态”已关闭->可以安全获取文档
(其他状态为草稿、待定)。
如果“CreatedDate”<2010->则可以在不考虑状态的情况下移动文档。
  • 首先,我可以移动所有“旧”文档(在2010年之前创建)
  • 我将移动状态为“已关闭”的所有文档。
  • 在上线的那天,我将迁移所有剩余的记录
  • 但是,使用此模式不容易跟踪移动的文档(在点[2]),因为其他文档可能同时进入关闭状态


    有谁能建议一个更好的程序来移动这些记录,而不冒重复或丢失任何数据的风险吗?

    尝试使用一个暂存表来跟踪迁移的文档,例如:

    迁移表

    --------------------------------------------------
    | 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])
    --------------------------------------
    
    现在,假设(*)行从“打开”更改为“关闭”,则首先需要将此行迁移到目标DB,并检查迁移:

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

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

    2010年之前可以创建一个已关闭的文档,不是吗?因此,您无法确定要移动同一文档两次。我错了吗?你跟踪每个文档的关闭/完成日期了吗?@Francesco:我会先移动2010年之前创建的所有文档,然后移动关闭的文档,但其日期在2010年阈值之后。这样我就避免了“旧”副本。@丹:每个文档都有一个状态,createDate,LastUpdateDate。也许我可以使用LastUpdateDate字段来设置阈值。例如:“获取状态为closed且LastUpdateDate