我一直在寻找一个工具来同步来自2个不同数据库的表,并发现pt-table-sync 。 我阅读文档,感到困惑:他们大多使用涉及复制环境的示例,但我认为复制的重点是为您处理数据同步,因此我的问题是:
如果复制过程应该为您处理数据pt-table-sync那么使用pt-table-sync有什么意义?
我可以在非复制的环境中使用pt-table-sync (在两个彼此没有任何关系的主机之间,它是pt-table-sync --execute host1 host2 host3示例的作用)吗?
如果我必须在复制环境中使用pt-table-sync ,我可以在master上没有bin-logs吗(有一个例子讨论解决pt-table-checksum发现的差异,所以想知道bin-logs是否是绝对必要的)?
MySQL复制受到两个主要问题的困扰
MySQL复制是asynchronous的 。 这可能会引入复制延迟。 这通过从站I / O线程表明了主站和从站之间的通信问题。 这可能会在Seconds_Behind_Master看到。
Data Drift 。 这是一个间歇性的情况,由于MySQL复制领域以外的因素,主站和从站仅仅是不同步的。 例如,请注意一种更好地同步复制的方法:使用选项sync-binlog 。 将sync-binlog设置为1时,mysqld将为您logging在二进制日志中的每个条目执行当前二进制日志的刷新。 这可以减慢主人的速度。 默认情况下, sync-binlog是0。
sync-binlog=0 ,谁负责将二进制日志刷新到磁盘? 这里的直接答案是否定的,因为pt-table-sync被devise为通过--sync-to-master选项来检测从属的I / O线程。
这里的直接答案是否定的,因为MySQL复制需要知道
SHOW SLAVE STATUS\G Master_Log_File ) SHOW SLAVE STATUS\G Read_Master_Log_Pos ) 如果你只是想让你的二进制日志避开,你可以做两件事情之一
expire-logs-days为3,以保留最近3天的二进制日志
expire-logs-days=3 SET GLOBAL expire_logs_days = 3; SHOW SLAVE STATUS\G上运行SHOW SLAVE STATUS\G 采取Relay_Master_Log_File的值。 并用它来清除主服务器上的二进制日志以启动该日志文件。
SHOW SLAVE STATUS\G Relay_Master_Log_File: mysql-bin.000035 PURGE BINARY LOGS TO 'mysql-bin.000035'; 如果你想对pt-table-sync有更多的信心,可以尝试使用--print选项并redirect到一个文本文件,而不是--execute选项。 这将生成通常在主服务器上执行的SQL。 之后,您可以直接在该Slave上运行SQL。 把它看作是 – 执行的彩排。
但是我认为复制的重点就是要照顾到数据的同步
是的,MySQL复制确实尝试同步复制的数据库。 但是,MySQL复制非常棘手,复制可能因各种原因而失败。 根据我的经验,复制错误是很less见的,但是在意外的服务器崩溃期间,当用户在主服务器上的大插入中间点击“Control-C”等时,确实发生了这种错误。MySQL.com不提供很好的工具来处理多这些问题。 幸运的是,一些工程师,如Baron Schwartz(Percona工具包的原始作者(以前称为Maatkit))已经开发了一些工具来简化MySQLpipe理。
例如,我目前有一个5000万行的表。 由于几个星期前的服务器崩溃,less数几行不同步。 我需要发现哪些行不同步,但手动操作会很痛苦。 我使用pt-table-checksum检查副本上的复制错误,并使用pt-table-sync来发现副本上缺less哪些行。
如果您正在考虑MySQL复制,我强烈build议您调查并使用Percona工具包。 如果我们已经开始使用Percona工具包,那么对MySQL数据库的pipe理就简单多了。
我读了文档,感到困惑:
Percona Toolkit的文档就像一个技术手册。 不幸的是,在描述如何使用这些工具方面做得不好,他们是如何帮助你的。http://www.mysqlperformanceblog.com有一些这样的信息,但主要集中在MySQL的Percona fork这就是他们如何谋生),这就要求读者做一些翻译。
回答问题1
pt-table-sync (进一步使用pt-table-checksum )来纠正复制错误,如数据损坏,直接修改从服务器上的数据,服务器崩溃,错误顺序的模式更改等。
然而,如果数据没有太多变化,那么也可以使用pt-table-sync而不进行复制,以便近乎实时地同步表。
正确回答问题2
当然你也可以在非复制的环境下使用它, 手册也提到了它。 我使用它从cron保持3个MySQL服务器“同步”每5分钟。 他们有相同的数据副本,有时(第一台服务器上)更改,所以复制为此目的将是矫枉过正。
您可以指定要同步的单个数据库或单个表。 你可以有几个目标服务器。 pt-table-sync使用几种有效的algorithm检测数据库表中的更改,并仅复制更改(将更改分为4组:删除,replace,插入,更新)。