Data migration 迁移数据库记录的算法
我需要将20万条记录从一个数据库(oracle)迁移到另一个数据库(SQL Server)。我将使用SSIS(SQL Server集成服务)管理迁移,并且我已经创建了包 记录引用数据库中的文档(带有HBLOB字段)。迁移它们需要相当长的时间,因此我在SSI中引入了变量,以便每次只迁移记录的子集,方法是使用一个将变量作为bundaries的查询。通过这种方式,我可以在上线日期之前开始移动一些历史记录 在开始时,我想通过ID移动,例如,以1'000的第一个块为例,然后是第二个块,依此类推。但这是不可能的,因为某些文档(在生产系统中)仍然可以更改,因此它们还不能移动 以下是相反的观点:Data migration 迁移数据库记录的算法,data-migration,Data Migration,我需要将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->则可以在不考虑状态的情况下移动文档。
有谁能建议一个更好的程序来移动这些记录,而不冒重复或丢失任何数据的风险吗?尝试使用一个暂存表来跟踪迁移的文档,例如: 迁移表
--------------------------------------------------
| 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