MySQL SBR 与 RBR

Mar*_*k D 2 mysql replication

假设 MySQL 5.5 中基于语句的复制和基于行的复制的混合复制。它在 master-master 场景中究竟是如何工作的?

收到查询的 master 是否执行,然后将语句写入 binlog,然后中继到 slave 执行?还是 master 只是简单地写下应该更新的内容,然后 slave 接收更改?

它还指出,在 MySQL 5.5 中 SBR 是默认设置,但在需要时会切换到 RBR。我怎么知道什么时候需要它?有没有办法强制它只对一个查询 UPDATE 或 INSERT 使用 SBR?

Aar*_*own 6

MySQL 中的主/主复制没有什么特别之处——它是双向的主/从,其中每个服务器只是另一个服务器的从属。否则,它的行为与“常规”主/从拓扑完全相同。关于如何保护此配置免受重复主键的影响,有一些建议,例如设置auto_increment_offsetand auto_increment_increment,仅写入一个主(运行主动/被动),并确保log_slave_updates已设置。

所以,master/master 只是两个方向上的 master/slave。您的下一个问题是关于复制一般如何工作,您应该阅读以下内容:复制实施细节

总之:

  1. 在 master 上执行查询
  2. 成功执行后,查询本身 (SBR) 或受影响行的二进制表示 (RBR) 与一些元数据一起写入本地二进制日志。
  3. 在从站上,有一个 I/O 线程运行,它连接到主站并传输主站的二进制日志并将它们写入称为中继日志的本地文件。
  4. 在从站上,SQL 线程读取中继日志并执行包含的语句(SBR)/应用行(RBR)

您可以在 SHOW SLAVE STATUS 和进程列表中看到 I/O 线程和 SQL 线程都处于活动状态。

在 MySQL 5.5 中,默认是基于语句的复制。(请参阅复制格式

您所指的是混合二进制日志格式,它通常使用 SBR,但在 SBR 被认为不安全的许多情况下切换到 RBR,因为该语句有可能在主站和从站上产生不同的结果。这些在文档中有清楚的描述。

因为 SBR 是默认设置,为了使用 MIXED,您必须显式设置它以my.cnf进行持久更改:

binlog_format = MIXED
Run Code Online (Sandbox Code Playgroud)

或通过执行动态

-- Set binary log format globally
mysql> SET GLOBAL binlog_format = MIXED;
-- set binary log format just for this session
mysql> SET SESSION binlog_format = MIXED;
Run Code Online (Sandbox Code Playgroud)

如果要binlog_format为特定语句设置 ,可以通过在会话中设置 binlog_format(如上所示)然后执行您的语句。但是,您必须拥有 SUPER 权限才能执行此操作,而任何应用程序都不应该拥有此权限。真的,除了某些管理任务,几乎没有理由这样做,混合复制应该是您的选择。