如何在不同服务器中运行的不同数据库(MYSQL)中的两个表之间同步数据

时间:2016-06-14 17:43:26

标签: mysql database

我有2个不同的mysql数据库(OLD和NEW)在不同的服务器上运行。 OLD数据库有大约10个表,我想要同步3个表数据库NEW。因此,如果在这3个表上发生任何添加/删除/更新,则应在数据库NEW上更新这些条目。 我使用mysql转储创建了新数据库。 但是我想添加一个可以每1小时运行一次的cron作业来同步3个表。

我想编写一个脚本,该脚本将使用时间戳跟踪最后同步的数据,然后将数据从OLD同步到NEW。我确实在服务器之间有连接,但我无法找到实现这一目标的方法。

任何建议或链接将不胜感激。

2 个答案:

答案 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这个工具可以找出哪些行必须复制以及哪一行要删除或更新。但两种模式必须相同

here is the Manual