【问题标题】:Algorithm to migrate database records迁移数据库记录的算法
【发布时间】:2013-05-09 05:22:59
【问题描述】:

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

记录引用数据库中的文档(带有 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. 上线那天,我会迁移所有剩余的记录。

但是,使用这种模式,跟踪移动的文档(在点 [2] 处)并不容易,因为在此期间其他文档可能会进入关闭状态。

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

【问题讨论】:

  • 2010年之前可以创建一个封闭的文档,不是吗?所以你不能确定你是否移动了同一个文档两次。我错了吗?
  • 您是否跟踪每个文档的关闭/完成日期?
  • @Francesco:我会先移动 2010 年之前创建的所有文档,然后再移动已关闭的文档,但其日期在 2010 年阈值之后。这样,我将避免“旧”重复。
  • @Dan:每个文档都有一个状态,createDate,LastUpdateDate。也许我可以使用 LastUpdateDate 字段来设置阈值。像:“获取所有状态为已关闭且 LastUpdateDate
  • 是否会在上线日期之前使用新数据库(迁移除外)?

标签: data-migration


【解决方案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 插入迁移表。这是暂存区的原则之一,有时(但事实并非如此)您需要一个专用数据库来存储所有此类支持表和视图。

【讨论】:

  • 这是一个很好的方法。它将需要 SSIS 中的一些额外组件(以在阶段表上保存相同的 ID),但至少它简化了验证已导出记录的过程。暂时+1,在接受您的之前等待其他答案。谢谢。
  • @Luca 谢谢,当你完成评估时记得标记为已接受:) Ciao
猜你喜欢
  • 2011-04-21
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2010-11-07
  • 2021-11-14
  • 2016-03-01
相关资源
最近更新 更多