同步两个mysql db表

时间:2016-10-06 21:53:46

标签: mysql database

所以,我有两个mysql数据库表:" table_original"和" table_copy"

这是我目前的设置:

每晚,table_original都会从另一台包含信息的服务器进行更新。它要么删除旧的db行,要么添加一个带有唯一post_id的新行(即使删除了行,也不会有两个相同的post_id)。

然后,将某些信息与post_id一起复制到table_copy。因此,两个由post_id链接。

到目前为止,table_original有~20,000行,而table_copy有~40,000。

我刚刚注意到table_copy尚未从第一个表中更新,但只是添加了行而不是删除从第一个表中删除的任何内容。

为了同步它们,我的初始方法是从table_original检查table_copy的每一行,如果post_id存在,则不执行任何操作,如果没有,则从{{1}中删除行}}

我担心的是,table_copy每晚都会更新:较旧的post_id行将被删除和/或添加新行。不幸的是,在完成之前我无法知道正在做什么。意思是,我必须等到db更新才能看到删除和添加的内容。

然后,每次更新第一个表时,我都必须检查第二个表的每一行以更新它们。该表只会变得更大,我担心这种方法可能不是最好的。

你们有什么建议我可以做的?

谢谢!

1 个答案:

答案 0 :(得分:3)

删除table_copy中table_original中不存在的行:

DELETE t1.* FROM table_copy AS t1 
LEFT OUTER JOIN table_original AS t2 USING (post_id)
WHERE t2.post_id IS NULL;

我建议您创建一个包含几行的虚拟表,以便您可以尝试使用此类查询,并在针对实际数据运行之前提高您的信心!

有关多表DELETE语句的更多文档,请参阅http://dev.mysql.com/doc/refman/5.7/en/delete.html

要让它们每晚自动保持同步,请使用触发器:

CREATE TRIGGER copy_on_ins AFTER INSERT ON table_original
FOR EACH ROW
  INSERT INTO table_copy SET post_id = NEW.post_id, other_columns = NEW.other_column;

CREATE TRIGGER copy_on_upd AFTER UPDATE ON table_original
FOR EACH ROW
  UPDATE table_copy SET other_column = NEW.other_column
  WHERE post_id = NEW.post_id;

CREATE TRIGGER copy_on_del AFTER DELETE ON table_original
FOR EACH ROW
  DELETE FROM table_copy WHERE post_id = OLD.post_id;

请参阅http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html

重新评论:

知道哪些post_id被删除是棘手的。由于它们不再存在于数据库中,您需要:

  • 如果您发现仍在数据库中的post_id值之间存在差距,则推断它们曾在那里。但这并不能保证,因为如果插入失败,可能永远不会使用id值。
  • 检查某种日志。有些人使用触发器附加到审计表。或者编写删除帖子以创建日志的应用程序。
  • 使用mysqlbinlog工具阅读删除事件。这有点先进。