我看到Cron同步MySQL表 。 但是我不能使用复制。 我曾经使用percona工具包 ,它完美的工作。 我可以按需运行sync命令,或者通过cron运行它。 它会比较两个表上的校验和,并进行插入,更新,删除等。然而,Perl(DBD :: mysql)和MySQL有一些新的服务器不兼容,我打算运行这个,我不能使用pt-table-同步。 有没有类似的解决scheme使用Perl / DBD以外的东西?
编辑:(更多细节,清晰度)
使用mysqldump --opt <database> <tablename>创build表的转储并将其提供给您的新服务器。 正如你显然有通过TCP / IP访问远程数据库,你可以使用
mysqldump --opt --user=<youruser> --password=<yourpassword> -host <yourhost> \ <yourDB> <yourtable> | mysql -u <newserveruser> -p<password>
要连接到远程数据库,请将其转储并将输出提供给您的新服务器。
如果您没有对远程数据库的直接TCP / IP访问权限,则在设置公钥authentication之后,通过SSH对数据进行隧道传输仍然可以做到几乎相同:
ssh -C -l <remoteuser> <remoteserver> \ 'mysqldump --opt --user=<youruser> --password=<yourpassword> <yourDB> <yourtable>' \ | mysql -u <newserveruser> -p<password>
有关更多详细信息,请参阅mysqldump的文档和SSH的手册页 。
如果您需要更高的带宽效率,请考虑使用mysqldump创build转储,将其存储在源服务器上,并使用rsync在导入前复制/更新目标服务器上的对应项。 由于rsync会在源文件和目标文件上创build滚动校验和,因此在后续运行中可能不需要传输大部分转储的内容。
有一个mysqldump补丁是为了在插入行时使用临时表,并将表重命名为原始表名,以减lesslocking时间,但是我认为它是实验性的,因为它有未解决的问题,并且从未将它们放入主分支。 看到这个讨论的补丁代码和细节。
如果你不能在任何原因下把表放到目的地,你可能会把转储的数据插入到一个新表中(一个快速而脏的方法,但是有些不安全的方法会把mysqldump输出传给sed -e 's/mytable/newtable/g'然后再pipe道到mysql ),然后运行一个UPDATE / DELETE / INSERT循环与这样的联接( 未经testing ,执行完整性检查):
/* set write lock on the table so it cannot be read while updating */ LOCK TABLES mytable WRITE; /* update all rows which are present in mytable and newtable */ UPDATE mytable AS M LEFT JOIN newtable AS N ON M.primarykey = N.primarykey SET M.column1=N.column1, M.column2=N.column2 [...] WHERE N.primarykey Is Not NULL; /* delete all rows from mytable which are no longer present in newtable */ DELETE M FROM mytable AS M LEFT JOIN newtable AS N on M.primarykey = N.primarykey WHERE N.primarykey Is NULL; /* insert new rows from newtable */ INSERT INTO mytable (primarykey, column1, column2, [...]) SELECT (N.primarykey, N.column1, N.column2, [...]) FROM mytable AS M RIGHT JOIN newtable AS N ON M.primarykey=N.primarykey WHERE M.primarykey Is NULL /* release lock */ UNLOCK TABLES;
注意:当然,当你插入/更新数据时,你的数据库的数据是不一致的,但是只要你没有使用事务(MyISAM表不可用),就会发生这种情况 -重新创build表将会产生临时的不一致,就像更新/删除/插入循环一样。 这是由于MyISAM的非primefaces无交易devise的本质。
这听起来像你想要的东西像rubyrep可以同步左侧或右侧,并可以configuration什么types的东西你想要同步的任何一种方式。 但是我认为这是数据库级别而不是表级别。 这可能是修改基于表的同步的一个很好的起点。
另一个select是使用REPLACE INTO,而不是如http://codeinthehole.com/writing/how-to-sync-a-mysql-table-between-two-remote-databases/中所示的删除表
这听起来像你可能无法访问日志,或者我build议从二进制日志中获取命令。
你有没有尝试过使用触发器?
DELIMITER $$ CREATE TRIGGER sync_table1_insert AFTER INSERT ON `table1` FOR EACH ROW BEGIN INSERT INTO table2 (id, value) VALUES (NEW.id, NEW.value); END; $$ DELIMITER ; DELIMITER $$ CREATE TRIGGER sync_table1_update AFTER UPDATE ON `table1` FOR EACH ROW BEGIN UPDATE table2 SET value = NEW.value WHERE id = NEW.id; END; $$ DELIMITER ; DELIMITER $$ CREATE TRIGGER sync_table1_delete AFTER DELETE ON `table1` FOR EACH ROW BEGIN DELETE FROM table2 WHERE id = OLD.id; END; $$ DELIMITER ;