问题

问题

我一直在寻找一个工具来同步来自两个不同数据库的表,并发现pt-table-sync。我阅读了文档并感到困惑:他们大多使用涉及复制环境的示例,但我认为复制的全部意义在于为您处理数据同步,因此我的问题:

问题

  1. pt-table-sync如果复制过程应该为您处理数据同步,那么使用的意义何在?

  2. 我可以pt-table-sync在非复制环境中使用吗(在 2+ 个彼此无关的主机之间,这是pt-table-sync --execute host1 host2 host3给出的示例的作用吗)?

  3. 如果我必须pt-table-sync在复制环境中使用,我可以不用它吗bin-logsmaster有一个例子谈论解决发现的差异, 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 组:删除、替换、插入、更新)。

相关内容