我过去使用的一种方法是使用复制。
我们在旧的生产数据库和用于数据迁移的从属数据库之间创建了一个复制方案。开始迁移时,我们暂时关闭了复制,使用从库作为迁移的数据源;旧的生产系统仍在运行。
一旦迁移脚本完成,并且我们的一致性检查已经运行,我们重新启用从旧生产系统到复制的从属系统的复制。复制完成后,我们在生产中挂起“停机维护”标志,重新运行数据迁移脚本和一致性检查,将系统指向新数据库,并取下“停机维护”标志。
有停机时间,但只是几分钟,而不是几小时。
这确实取决于您的数据库架构,以便轻松识别更改/新数据。
如果您的架构不适合轻松查询以查找新的或更改的记录,并且您不想添加新列来跟踪这一点,最简单的解决方案是创建单独的表来跟踪迁移状态。
例如:
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
您可以通过 USERS 表上的触发器填充此表以进行插入、删除和更新 - 对于这些操作中的每一个,您都设置了单独的状态。
这使您可以快速找到自运行第一个迁移脚本以来发生更改的所有记录,并且只迁移这些记录。
因为您没有修改生产环境,并且触发器仅在“从属”环境中触发,所以您不应在生产环境中引入任何性能或不稳定问题。