首先,为什么你们没有人回答这个家伙的问题?有时,由于安全限制/合规性/遗留系统,我们不得不这样做。
我将在这里用伪代码编写一些选项。不确定您的数据库的实时性如何,因此这并非在所有情况下都有效。
要求
为此,数据库必须位于同一服务器实例中。如果没有,您将需要设置联合存储引擎来访问远程数据。正如另一个人所说,MySQL 复制仍然有用,至少可以将数据传输到同一台服务器,从而使同步速度更快,而无需设置联合存储。
参考:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
同步时序
您可以在event
日程
MySQL 将允许您按照特定的计划创建事件来执行您的工作(假设您没有任何外部作业计划工具)。
希望您有某种修改日期,您可以每天查询一次或更严格的间隔查询所有字段modified_at
>= DATE_SUB(NOW( ),INTERVAL ? 小时)
如果您能够添加一列,则可以创建一个名为synced_at
这对服务器时钟差异有更大的抵抗力。然后你可以简单地查询在哪里synced_at
为空或synced_at
<= modified_at
或者,使用触发器
MySQL 支持 INSERT / UPDATE / DELETE 等的 BEFORE 和 AFTER 触发器...您可以使用它们来触发您的逻辑。请记住,每个事务都会造成一些性能损失,这很容易压垮非常活跃的生产服务器。
BEFORE 和 AFTER 之间确实没有很大的区别,除了如果您使用 BEFORE 样式触发器,如果两个表高度同步很重要,您可以抛出一个 sqlstate 来阻止插入到源表中。
同步逻辑
插入/更新/删除模式
这是伪代码,但是......
# new and updated records
INSERT ... ON DUPLICATE KEY UPDATE ...
SELECT FROM source_table
JOIN target_table.id
WHERE target_table.id IS NULL or modified_at > DATE_SUB(NOW(), INTERVAL ..)
# deleted records
插入/更新/删除后触发
与上面相同,只是您一次只操作一条记录,并且您正在镜像触发器语句。例如:源表上的 INSERT TRIGGER 应该只查询目标表上的 INSERT。
核DROP/CREATE/INSERT
简单,但不推荐用于除报告数据库之外的任何其他用途。删除整个表并根据其他记录重建它。