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