复制可以工作,因为写入二进制日志的事件从源读取,然后在副本上处理。根据事件的类型,事件以不同的格式记录在二进制日志中。使用的不同复制格式对应于在源的二进制日志中记录事件时使用的二进制日志格式。二进制日志格式与复制过程中使用的术语之间的相关性如下:
当使用基于语句的二进制日志时,源程序将SQL语句写入二进制日志。通过在副本上执行SQL语句,将源复制到副本。这就是所谓的statement-based复制(可以缩写为SBR),对应MySQL基于语句的二进制日志格式。
当使用基于行的日志记录时,源写入事件到指示各个表行如何更改的二进制日志。通过将表示表行更改的事件复制到副本,可以将源复制到副本。这就是所谓的基于行的复制(可以缩写为RBR).
基于行的日志记录是默认的方法。
您还可以将MySQL配置为混合使用基于语句和基于行的日志记录,这取决于要记录的更改最适合哪一种。这就是所谓的复合格式记录.当使用混合格式日志记录时,默认使用基于语句的日志。根据某些语句和所使用的存储引擎,在特定情况下,日志会自动切换为基于行的。使用混合格式的复制称为mixed-based复制或复合格式复制.有关更多信息,请参见第5.4.4.3节“混合二进制日志格式”.
NDB集群。MySQL NDB Cluster 8.0默认的二进制日志格式为混合
.您应该注意,NDB集群复制总是使用基于行的复制,并且NDB
存储引擎与基于语句的复制不兼容。看到第23.7.2节“NDB集群复制的一般要求”,以查询更多资料。
当使用混合
格式,二进制日志格式部分由所使用的存储引擎和所执行的语句决定。有关混合格式日志记录和控制支持不同日志记录格式的规则的更多信息,请参见第5.4.4.3节“混合二进制日志格式”.
运行中的MySQL服务器的日志格式是通过设置binlog_format
服务器系统变量。可以使用会话或全局作用域设置此变量。控制新设置何时以及如何生效的规则与其他MySQL服务器系统变量相同。为当前会话设置变量只持续到该会话结束,而更改对其他会话是不可见的。全局设置该变量对更改后连接的客户端生效,但对任何当前客户端会话无效,包括更改了变量设置的会话。要使全局系统变量设置永久,以便在服务器重新启动时应用它,必须在选项文件中设置它。有关更多信息,请参见第13.7.6.1节“变量赋值的SET语法”.
在某些情况下,您不能在运行时更改二进制日志记录格式,或者这样做会导致复制失败。看到第5.4.4.2节“设置二进制日志格式”.
改变全球binlog_format
值需要足够的权限来设置全局系统变量。改变会话binlog_format
值需要足够的权限来设置受限制的会话系统变量。看到第5.1.9.1节“系统变量特权”.
基于语句的复制格式和基于行的复制格式有不同的问题和限制。有关它们的相对优点和缺点的比较,请参阅第17.2.1.1节“基于语句和基于行复制的优缺点”.
使用基于语句的复制,在复制存储的例程或触发器时可能会遇到问题。您可以通过使用基于行的复制来避免这些问题。有关更多信息,请参见第25.7节“存储程序二进制日志记录”.