13

我有以下 Mysql 复制模式:

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

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

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

更新:我应该问这样的问题:“binlog 中的语句/事务的顺序在所有复制链中是否相同?我们可以在任何主机上重放任何日志并将任何从属设备(c)重新指向主设备(A)”似乎答案是是的”。但尚未发布官方确认或文档(源代码)链接。

UPDATE2:从官方文档到innodb_support_xa

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

4

3 回答 3

8

直接回答你的问题,不。

您的拓扑:

(a) 主 -> (b) 副本 -> (c) 副本

  • A = Master,必须启用 bin-log
  • B = A 的副本,必须启用log_slave_updates
  • C = B的副本

每个服务器的每个 bin-log 都有自己的 bin-log 文件名和位置,您不能在服务器之间复制 bin-log。

如果您希望管理复制拓扑、移动从属设备和故障转移,您应该考虑使用以下方法之一:

  1. 带有 GTID 的 MySQL 5.6
  2. MHA
  3. 编排器

更新:

您应该从根本上导致mysql 复制不同步并修复该问题以防止此问题,这毫无价值。

于 2015-10-09T15:31:22.310 回答
1

澄清你的问题。如果复制在 A -> B 之间停止并且可能无法修复。是否可以从 A -> C 复制。答案是肯定的。

在您的示例中,A 和 B 都在写入 binlog。这些日志中的语句顺序将是相同的,虽然我找不到文档来证明这一点,但这是复制的基本原理。如果顺序不同,那么数据很容易不同步。你是对的,复制从属线程是单线程的,所以主机 B 将按顺序读取和写入语句。

但是,如果将某些数据直接写入主机“B”,那么根据写入的内容,B & C 当然会与“A”有不同的数据。

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

要从“A”复制“C”,您需要在“A”的二进制日志中找到与“C”当前正在查看“B”的位置相对应的位置。有几种方法可以做到这一点,包括使用 mysqlbinlog 工具手动查找查询并从该点开始。

更快的方法是让'C' 100% 赶上'B'。假设复制已经在“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”上的二进制日志并确认“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 语句。这在灾难恢复场景中非常有用。

于 2015-10-11T11:43:28.547 回答
0

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

如果由于任何特定原因您不想使用 Slave B,并且您确定在 Slave B 复制中断之前,所有来自 B 的数据都已复制到 C 并且您知道复制中断的指针,那么您可以直接执行 binlogs在从机 C 上,现在您可以使从机 C 成为主 A 而不是 B 的从机。

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

于 2015-09-23T12:16:50.453 回答