我有以下Mysql复制模式:
A(主设备)->B(从设备/主设备)->C(从设备)
- A写binlog
- B读取A的binlog应用relaylog并写入自己的binlog
- C从B读取并应用。
如果复制由于某种原因中断(A->B),我可以复制A的binlog,找到哪个位置对应于B最后执行的语句并重放它。bin/中继日志中的事务/语句的顺序在所有复制链中是否相同?(复制使用一个线程,所以它可能是相同的顺序。)
更新:我应该这样问:“在所有复制链中,binlogs中的语句/事务的顺序是否相同?我们可以在任何主机上重放任何日志并将任何slave(c)重定向到master(A)吗?”似乎答案是:“是的”。但官方确认或文档(源代码)链接尚未发布。
APPLICATE 2:从官方文档到innodb_support_xa:
在XA事务中启用InnoDB对两阶段提交的支持,从而导致额外的磁盘刷新以进行事务准备。XA机制在内部使用,对于任何打开二进制日志并接受来自多个线程的数据更改的服务器都是必不可少的。如果禁用innodb_support_xa,则可以按照与实时数据库提交事务不同的顺序将事务写入二进制日志,当在灾难恢复中或在复制从设备上重放二进制日志时,这可能会产生不同的数据。
3条答案
按热度按时间5vf7fwbs1#
直接回答你的问题,没有。
您的拓扑:
(a)主->(B)副本->(c)副本
每个服务器的每个bin日志都有自己的bin日志文件名和位置,您不能在服务器之间复制bin日志。
如果您希望管理复制拓扑、移动从站和故障转移,则应考虑使用以下方法之一:
你应该找出how MySQL replication got out of sync的根本原因并修复这个问题来防止这个问题,这是没有价值的。
djp7away2#
为了澄清你的问题。如果复制在A -> B之间停止,并且可能是不可修复的。有没有可能从A -> C复制。答案是肯定的。
在你的例子中,A和B都在写binlog。这些日志中的语句顺序是相同的,虽然我找不到文档来证明这一点,但这是复制的基本原则。如果顺序不同,那么数据很容易失去同步。你是对的,复制从线程是单线程的,因此主机B将按顺序阅读和写语句。
然而,如果一些数据被直接写入主机“B”,那么当然B & C将根据写入的内容而具有与“A”不同的数据。
在进行更改之前,请确保已备份服务器。在B & C上运行“SHOW SLAVE STATUS”,并将输出复制/粘贴到某个位置作为参考。
要让'C'从'A'复制,你需要找到'A'的binlog上对应于'C'当前查看'B'的位置。有几种方法可以做到这一点,包括使用mysqlbinlog工具手动查找查询并从该点开始。
一种更快的方法是让“C "100%地赶上”B“。假设复制已在”B“上停止。请在B上使用”SHOW SLAVE STATUS“获取要在”C“上运行的以下查询的参数。
字符串
您可能需要添加其他选项:
型
这将告诉主机“C”从“B”到达的位置开始继续复制。如果你像一个好的dbadmin一样偏执,那么你可以使用mysqlbinlog检查主机“A”上的binlog,并确认“C”在新位置的查询/时间戳,并将该点周围的查询与“C”上的数据进行比较,以确认这是重新启动复制的点。类似于:
型
关于mysqlbinlog的好消息是,它还允许您从另一台服务器读取binlog的副本,并将其转换为您可以在本地重放的SQL语句。这在灾难恢复场景中非常有用。
wyyhbhjk3#
在正常情况下,如果您的show slave status显示的是复制中断的指针(A > B),则应进行更正,这样,您的slave B将恢复正常,现在数据也将成功复制到Slave C。
如果由于任何特定的原因,你不想使用从属B,并且你确定在从属B复制中断之前,来自B的所有数据都已复制到C,并且你知道复制中断的指针,那么你可以直接在从属C上执行binlog,现在你可以使从属C从属于主A而不是B。
如果问题不同,请详细说明。