一种方法是使用replication.
我们创建了旧的生产数据库,这是用于数据迁移的奴隶之间的复制方案。当我们开始迁移时,我们暂时关闭了复制,并使用从数据库作为迁移的数据源;旧的生产系统仍然运作。
迁移脚本完成并且我们的一致性检查已运行后,我们重新启用了从旧生产系统到复制从属系统的复制。复制完成后,我们在生产过程中挂上了“维护维护”标志,重新运行数据迁移脚本和一致性检查,将系统指向新数据库,并取下“维护”标志。
有停机时间,但它是几分钟,而不是数小时。
这取决于您的数据库模式,以便识别更改/新数据。
如果您的模式不适合查询新的或已更改的记录,并且您不想添加新列以跟踪此情况,最简单的解决方案是创建单独的表以跟踪迁移状态。
例如:
TABLE: USERS (your normal, replicated table)
----------------------
USER_ID
NAME
ADDRESS
.....
TABLE: USERS_STATUS (keeps track of changes, only exists on the "slave")
-----------------
USER_ID
STATUS
DATE
你可以通过在用户表中的触发器插入填充此表,删除和更新 - 为每个动作,您可以设置一个独立的状态。
这使您可以快速查找自运行第一个迁移脚本后发生更改的所有记录,并且只迁移这些记录。
由于您没有修改生产环境,触发器仅在“从属”环境中触发,因此不应在生产环境中引入任何性能或不稳定性问题。
非常感谢您的回复。我已经考虑过相同的方法,但问题是 - 这只适用于添加新行的表。如何知道行是否被删除或数据集中间的某处发生了变化? – Mathew 2013-02-08 13:34:28
要跟踪数据集中的更改,我通常在每个数据集中都有版本控制列。在每次更改(UPDATE)时,此值都会递增。您可以轻松比较生产数据库和迁移数据库之间的数据。对于已删除的行,恐怕在停机时间内您必须进行一些比较。基于PKs,应该不会花太长的时间才能找出生产中已删除的行,并在迁移的DB上删除它们。 – 2013-02-08 13:59:53