我可以使用master中的mysql binlog作为slave上的中继日志吗?

时间:2015-09-23 11:56:29

标签: mysql replication recovery mysqlbinlog

我有以下Mysql复制模式:

  

A(主) - > B(主/从) - > C(从)

  • A写入binlog
  • B读取A的binlog应用了relaylog并写入了自己的binlog
  • C从B读取并适用。

如果由于某种原因(A-> B)复制被破坏,我可以复制A的binlog,找到哪个位置对应于B最后执行的语句并重放它。 所有复制链中bin / relay日志中的事务/语句顺序是否相同? (复制使用一个线程,因此它可能是相同的顺序。)

更新:我应该问过:"所有复制链中binlogs中的语句/事务的顺序是否相同?我们可以重播任何主机上的任何日志,并将任何从站(c)重新命名为master(A)" 似乎答案是:"是"。但官方确认或文档(源代码)链接尚未发布。

UPDATE2 :从官方文档到innodb_support_xa

  

为XA事务中的两阶段提交启用InnoDB支持,从而为事务准备导致额外的磁盘刷新。 XA机制在内部使用,对于打开其二进制日志并接受来自多个线程的数据更改的任何服务器都是必不可少的。如果禁用innodb_support_xa,则事务可以按照与实时数据库提交的顺序不同的顺序写入二进制日志,这可以在灾难恢复或复制从服务器上重播二进制日志时生成不同的数据。

2 个答案:

答案 0 :(得分:1)

澄清你的问题。如果复制在A - >之间停止B也许是无法修复的。是否可以从A - >复制;相反。答案是肯定的。

在你的例子中,A& B正在写入binlog。这些日志中的语句顺序是相同的,虽然我找不到证明它的文档,但这是复制的基本原则。如果订单不同,那么数据可能很容易失去同步。你是对的,复制从属线程是单线程的,因此主机B将按顺序读写语句。

然而,如果某些数据直接写入主机'B',那么当然B&根据写的内容,C会有不同的数据'A'。

在进行更改之前,请确保已备份服务器。在B& B上运行'SHOW SLAVE STATUS' C并将输出复制/粘贴到某处作为参考。

要使'C'从'A'复制,您需要在'A'中找到binlog上的位置,这对应于'C'当前正在查看'B'的位置。有几种方法可以做到这一点,包括使用mysqlbinlog工具手动查找查询并从那一点开始。

更快的方法是让'C'用'B'赶上100%。假设复制已在'B'上停止。使用B上的“SHOW SLAVE STATUS”获取以下查询的参数,以便在“C”上运行。

 CHANGE MASTER TO MASTER_HOST = '[Master_Host]',  MASTER_LOG_FILE='[Master_Log_File]',  '[Exec_Master_Log_Pos]';

您可能需要添加其他选项:

 MASTER_USER='__USER__', MASTER_PASS='__PASS__', 

这将告诉主人'C'从'B'开始继续复制。如果你像一个好的dbadmin一样偏执,那么你将使用mysqlbinlog来检查主机'A'上的binlog并确认'C'的新位置的查询/时间戳,并将该点周围的查询与'C'上的数据进行比较确认这是重启复制的重点。类似的东西:

mysqlbinlog  --read-from-remote-server --host=HostA --user.. --password=.. --start-position=[Exec_Master_Log_Pos - 100] --stop-position=[Exec_Master_Log_Pos + 100] Master_Log_File

关于mysqlbinlog的好消息是,它还允许您从另一台服务器读取binlog的副本,并将其转换为可以在本地重放的SQL语句。这在灾难恢复方案中非常有用。

答案 1 :(得分:0)

在正常情况下,如果您的显示从属状态显示您的复制(A> B)被破坏的指针,那么您应该更正它,这样您的从属B就可以了,现在数据将被复制到奴隶C也成功了。

如果由于任何特定原因你不想使用Slave B并且你确信在Slave B复制之前,B中的所有数据都被复制到C并且你知道复制被破坏的指针那么你可以直接在slave C上执行binlogs,现在你可以使用Master A的slave C slave而不是B。

如果问题不同,请详细说明。