同步两个mysql db表

rmbxnbpk  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(289)

所以,我有两个mysql db表:“table\u original”和“table\u copy”
以下是我当前的设置:
每天晚上, table_original 从另一个服务器更新信息。它要么删除旧的db行,要么为它添加一个具有唯一post\u id的新行(即使删除了行,也不会有两个相同的post\u id)。
然后,某些信息连同post\u id一起被复制到 table_copy . 因此,两者通过 post_id .
到目前为止 table_original 有20000行 table_copy 大约有40000人。
我注意到了 table_copy 尚未从第一个表中更新,但只添加了行,而没有删除从第一个表中删除的任何内容。
为了同步它们,我最初的方法是检查 table_original 反对 table_copy 如果post\u id存在,则不执行任何操作,如果不存在,则从 table_copy .
我担心的是 table_original 每晚更新:旧的post\u id行将被删除和/或添加新行。不幸的是,我没有办法在做之前知道正在做什么。意思是,我必须等到数据库更新后才能看到删除和添加了什么。
然后,每次更新第一个表时,我都要对照第二个表检查每一行以更新它们。table只会越来越大,我担心这种方法可能不是最好的。
你们建议我怎么办?
谢谢!

thtygnil

thtygnil1#

要删除表\u copy中不在表\u original中的行,请执行以下操作:

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

我建议您创建一个包含几行的虚拟表,这样您就可以尝试使用这种查询,并在对实际数据运行它之前增加对它的信心!
看到了吗http://dev.mysql.com/doc/refman/5.7/en/delete.html 有关多表delete语句的更多文档。
要使它们每晚自动同步,请使用触发器:

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\u id被删除是很棘手的。由于它们已不在数据库中,您需要:
如果您发现仍在数据库中的post\u id值之间存在差距,则可以推断它们曾经存在。但这并不能保证,因为如果插入失败,可能永远不会使用id值。
检查某种日志。有些人使用触发器附加到审计表。或者编写删除日志的应用程序来创建日志。
使用mysqlbinlog工具通读删除事件。这有点先进。

相关问题