我真的可以用 percona 工具包的 pt-table-sync 做什么?

Max*_*Max 3 mysql synchronization replication percona

我一直在寻找一种工具来同步来自 2 个不同数据库的表,并找到了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是绝对必要的)?

Rol*_*DBA 7

对问题 1 的回答

MySQL 复制存在两大问题

  • MySQL 复制是异步的。这可能会引入复制延迟。这表现在 Master 和 Slave 之间通过 Slave I/O 线程的通信问题。这可以从逻辑上和数字上看出Seconds_Behind_Master

  • Data Drift. 这是一种间歇性情况,由于 MySQL 复制领域之外的因素,主从只是不同步的。例如,请注意一种更好地同步复制的方法:使用选项sync-binlog。当您设置sync-binlog为 1 时,mysqld 将为您在二进制日志中记录的每个条目执行当前二进制日志的刷新。这可以荒谬地减慢Master的速度。默认情况下,sync-binlog为 0。

    • 这里有一个问题:有了sync-binlog=0,谁负责将二进制日志刷新到磁盘?
    • 答案(请坐下):操作系统!!!
    • 有了这个答案,它就将 Slave 置于一个可怕的劣势,因为它的 I/O 线程受 Master 操作系统的支配。当 Master 的 OS 开始将二进制日志更改刷新到磁盘并且 Slave 的 I/O 线程可以检测到下一个传入的 SQL 语句时,该语句将通过 I/O 线程传送到 Slave。
    • Percona 有一个很好的 PDF 处理数据漂移

对问题 2 的回答

这里的直接答案是否定的,因为pt-table-sync它旨在通过选项检测 Slave 的 I/O 线程--sync-to-master

对问题 3 的回答

这里的直接答案是否定的,因为 MySQL 复制要求知道

  • Master上当前的二进制日志是什么?(这是Master_Log_File来自SHOW SLAVE STATUS\G
  • Slave 从 Master 的当前二进制日志中读取的最新位置是什么?(这是Read_Master_Log_Pos来自SHOW SLAVE STATUS\G

如果你只是想让你的二进制日志不碍事,你可以做两件事之一

  • 选项 1:在 Master 上,设置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。并使用它来清除 Master 上的二进制日志以更新该日志文件。
    • 假设你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选项。这将生成通常在 Master 上执行的 SQL。之后您可以直接在该 Slave 上运行 SQL。可以将其视为 的彩排--execute