我一直在寻找一个工具来同步来自两个不同数据库的表,并发现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
问题 1 的答案
MySQL 复制存在两个主要问题
MySQL 复制是异步的。这可能会导致复制延迟。这表现为主服务器和从服务器之间通过从服务器 I/O 线程的通信问题。这可以从逻辑上和数字上看出
Seconds_Behind_Master
。Data Drift
。这是一种间歇性情况,主服务器和从服务器由于 MySQL 复制范围之外的因素而无法同步。例如,请注意一种更好地同步复制的方法:使用选项sync-binlog
。设置sync-binlog
为 1 时,mysqld 将对二进制日志中记录的每个条目执行当前二进制日志刷新。这会极大地减慢主服务器的速度。默认情况下sync-binlog
为 0。- 这里有一个问题:对于
sync-binlog=0
,谁负责将二进制日志刷新到磁盘? - 答案(请坐下来听):操作系统!!!
- 有了这样的答案,从服务器就处于非常不利的地位,因为它的 I/O 线程完全受主服务器操作系统的支配。当主服务器操作系统开始将二进制日志更改刷新到磁盘,并且从服务器的 I/O 线程可以检测到下一个传入的 SQL 语句时,该语句就会通过 I/O 线程传送到从服务器。
- Percona 有一个关于处理数据漂移的优秀 PDF
- 这里有一个问题:对于
问题 2 的答案
这里的直接答案是否定的,因为pt-table-sync
设计用于通过选项来检测Slave的I/O线程--sync-to-master
。
问题 3 的答案
这里的直接答案是否定的,因为 MySQL 复制要求知道
- Master 上的当前二进制日志是什么?(
Master_Log_File
来自SHOW SLAVE STATUS\G
) - 从服务器从主服务器的当前二进制日志中读取的最新位置是什么?(
Read_Master_Log_Pos
来自SHOW SLAVE STATUS\G
)
如果你只是希望二进制日志不影响你工作,你可以做以下两件事之一
- 选项 1:在主服务器上,设置
expire-logs-days
改为 3,保留最近 3 天的二进制日志expire-logs-days=3
在/etc/my.cnf 中添加- 无需重启:只需运行
SET GLOBAL expire_logs_days = 3;
- 选项 2:
SHOW SLAVE STATUS\G
在从服务器上运行。获取 的值Relay_Master_Log_File
并使用它来清除主服务器上的二进制日志以更新该日志文件。- 假设你
SHOW SLAVE STATUS\G
在 Slave 上运行 - 你明白了
Relay_Master_Log_File: mysql-bin.000035
- 在 Master 上运行这个:
PURGE BINARY LOGS TO 'mysql-bin.000035';
- 假设你
建议
如果您想对 pt-table-sync 更有信心,请尝试使用 选项--print
并重定向到文本文件而不是 选项--execute
。这将生成通常在主服务器上执行的 SQL。此后,您可以直接在该从服务器上运行 SQL。将其视为 的彩排--execute
。
答案2
但我认为复制的全部意义在于为你处理数据同步
是的,MySQL 复制确实会尝试同步复制的数据库。但是,MySQL 复制很棘手,复制可能会因各种原因而失败。根据我的经验,复制错误很少见,但它们确实会在服务器意外崩溃时发生,例如用户在主服务器上插入大量内容时按下“Control-C”等。MySQL.com 没有提供处理这些问题的良好工具。幸运的是,一些工程师(如 Baron Schwartz(Percona Toolkit(以前称为 Maatkit)的原作者))开发了使 MySQL 管理更容易的工具。
例如,我目前有一个包含 5000 万行的表。由于几周前的服务器崩溃,一些行不同步。我需要找出哪些行不同步,但手动执行会很麻烦。我使用 pt-table-checksum 检查副本上的复制错误,并使用 pt-table-sync 发现副本上缺少哪些行。
如果您正在考虑 MySQL 复制,我强烈建议您研究并使用 Percona Toolkit。如果我们从 Percona Toolkit 开始,我们的 MySQL 数据库管理就会简单得多。
我读了文档但感到困惑:
Percona Toolkit 的文档写得像一本技术手册。遗憾的是,它没有很好地描述如何使用这些工具、它们如何帮助你等。http://www.mysqlperformanceblog.com有一些这方面的信息,但主要集中于 MySQL 的 Percona 分支(这是他们谋生的方式),这需要读者做一些翻译。
答案3
问题 1 的答案
pt-table-sync
(与 一起pt-table-checksum
)可用于纠正复制错误,如数据损坏、某人直接修改从属服务器上的数据、服务器崩溃、模式以错误的顺序更改等。
但是pt-table-sync
,如果数据变化不大的话,也可以不使用复制来保持表近乎实时地同步。
问题 2 的正确答案
当然你也可以在非复制环境中使用它,手动的也提到了这一点。我使用它从 cron 使 3 个 mysql 服务器每 5 分钟“同步”。它们具有相同的数据副本,但有时只会更改(在第一台服务器上),因此出于此目的进行复制会有些过头。
您可以指定要同步的单个数据库或单个表。您可以拥有多个目标服务器。pt-table-sync
使用几种有效的算法来检测数据库表中的更改并仅复制更改(它将更改分为 4 组:删除、替换、插入、更新)。