我有2个不同的mysql数据库(OLD和NEW)在不同的服务器上运行。 OLD数据库有大约10个表,我想要同步3个表数据库NEW。因此,如果在这3个表上发生任何添加/删除/更新,则应在数据库NEW上更新这些条目。 我使用mysql转储创建了新数据库。 但是我想添加一个可以每1小时运行一次的cron作业来同步3个表。
我想编写一个脚本,该脚本将使用时间戳跟踪最后同步的数据,然后将数据从OLD同步到NEW。我确实在服务器之间有连接,但我无法找到实现这一目标的方法。
任何建议或链接将不胜感激。
答案 0 :(得分:4)
首先,为什么你们这些家伙都不回答这个问题呢?有时,由于安全限制/合规性/遗留系统,我们必须这样做。
我在这里用伪代码写了一些选项。不确定您的数据库是如何实时的,因此在所有情况下都不会起作用。
为此,数据库必须位于同一服务器实例中。如果没有,您将需要设置联邦存储引擎来访问远程数据。正如另一个人所说,MySQL复制在至少将数据提供给同一服务器时仍然有用,这使得同步更快,而无需设置联合存储。 参考:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
您可以按
进行同步event
时间表
MySQL允许您按照特定的时间表创建活动来执行您的工作(假设您没有任何外部作业调度工具)。
希望您有某种修改日期,您可以在modified_at
> = DATE_SUB(NOW(),INTERVAL?HOUR)
如果你能够添加一个列,你可以创建一个名为synced_at
的列,它会对服务器时钟差异产生更大的抵抗力。然后,您只需查询synced_at
IS NULL或synced_at
< = modified_at
或者,使用触发器
MySQL支持INSERT / UPDATE / DELETE等BEFORE和AFTER触发器......您可以使用它们来触发逻辑。请记住,每次交易都会对性能造成一定的损失,这很容易使非常活跃的生产服务器崩溃。
BEFORE和AFTER之间确实没有太大区别,除非你使用BEFORE样式触发器,你可以抛出一个sqlstate来防止插入到源表中,如果两个表高度同步很重要的话。
INSERT / UPDATE / DELETE模式
这是伪代码但是......
# 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 / UPDATE / DELETE后触发
与上面相同,您只是一次操作一条记录,并且您正在镜像触发器语句。例如:源表上的INSERT TRIGGER应该只在目标表上查询INSERT。
核DROP / CREATE / INSERT
简单但不建议用于报告数据库以外的任何其他内容。删除整个表并从其他记录重建它。
答案 1 :(得分:0)
如果你不想使用MySQL复制,你也可以使用Percona的工具 pt-table-sync这个工具可以找出哪些行必须复制以及哪一行要删除或更新。但两种模式必须相同