我们有两个节点节点 A 和 B 的主到主复制,两者都在虚拟环境中。最初,节点 A 出现中断(磁盘空间问题)并停止复制。应用程序级流量已转移到节点 B 并重新定位节点 A 数据存储并腾出可用空间。
节点 A 已成功启动并启动。复制已开始,在与节点 A 同步时节点 B 中出现错误,并且节点 B 中的 bin 日志已损坏。根本原因仍然是个谜。但是分析日志可能会发现一些重复的条目,下面是错误日志信息:
[ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236).
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position', Error_code: 1236
111014 20:25:48 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.001067', position 183468345.
在这种情况下我们如何处理复制?我们是否可以跳过当前的 bin-log 并使用下一个可用的 bin-log 及其位置开始复制。将节点 B 与节点 A 同步是否是个好主意:
CHANGE MASTER TO
MASTER_HOST='XX.XX.XXX.XXX',
MASTER_USER='replicate',
MASTER_PASSWORD='slave',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.001025',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
我提出这种情况的主要原因是,我不想恢复数据库并从头开始构建它,其中节点 B 中的数据库备份约为 80 GB。如何修复复制?
这里有两点需要说明:
1)不可能这个词是一个死的赠品。
Client requested master to start replication from impossible position
. 这基本上是什么意思:恰好二进制日志的文件大小和二进制日志的位置是相同的。slave想要从mysql-bin.001067位置读取183468345。由于消息中出现了“不可能”这个词,这表明master二进制日志mysql-bin.001067小于183468345字节。要再次进行复制,请跳到下一个二进制日志:
NewPos 依赖于 MySQL 的版本。
2)您可以考虑使用 Percona 的数据同步工具。
我已经使用这些工具大约 2 年了,它们可以帮助您找出主从之间表的差异,即使主表上的表是 InnoDB 并且从站上的同一个表是 MyISAM(前提是表具有相同的表结构)。
运行这些工具时必须打开复制。
BTW Percona 有一套新的工具,叫做Percona Toolkit。他们放弃了自己的 MAATKIT 工具来制作更好的工具。这些工具可能被称为pt-table-checksum和pt-table-sync。
需要更多信息(如我对问题的评论中所述),但我将首先给出关于同步节点的一般警告。
如果您尝试将节点 B 与节点 A 同步,请确保您有一个最近的备份,以防同步出错。