16.2.1 复制格式

复制之所以有效,是因为从源读取了写入二进制日志的事件,然后在副本上对其进行了处理。根据事件的类型,事件以不同的格式记录在二进制日志中。使用的不同复制格式对应于将事件记录在源的二进制日志中时使用的二进制日志记录格式。二进制日志记录格式与复制期间使用的术语之间的相关性是:

  • 使用基于语句的二进制日志记录时,源会将 SQL 语句写入二进制日志。将源复制到副本可以通过在副本上执行 SQL 语句来进行。这称为基于语句的复制(可以缩写为 SBR),它对应于基于 MySQL 语句的二进制日志记录格式。

  • 使用基于行的日志记录时,源会将事件写入二进制日志,以指示如何更改单个 table 行。通过将 table 示对 table 行所做的更改的事件复制到副本,可以将源复制到副本。这称为基于行的复制(可以缩写为 RBR)。

  • 您还可以配置 MySQL 以同时使用基于语句的记录和基于行的记录,这取决于哪种记录最适合记录更改。这称为混合格式日志记录。使用混合格式日志记录时,默认情况下使用基于语句的日志。根据某些语句以及所使用的存储引擎,在特定情况下,日志会自动切换为基于行的日志。使用混合格式的复制称为基于混合的复制或混合格式的复制。有关更多信息,请参见第 5.4.4.3 节“混合二进制日志记录格式”

在 MySQL 5.7.7 之前,基于语句的格式是默认格式。在 MySQL 5.7.7 和更高版本中,基于行的格式是默认格式。

NDB Cluster. MySQL NDB Cluster 7.5 中的默认二进制日志记录格式为MIXED。您应注意,NDB 群集复制始终使用基于行的复制,并且NDB存储引擎与基于语句的复制不兼容。有关更多信息,请参见第 21.6.2 节“ NDB 群集复制的一般要求”

使用MIXED格式时,二进制日志记录格式部分取决于所使用的存储引擎和正在执行的语句。有关混合格式日志记录以及 Management 不同日志记录格式支持的规则的更多信息,请参见第 5.4.4.3 节“混合二进制日志记录格式”

正在运行的 MySQL 服务器中的日志记录格式是通过设置binlog_format服务器系统变量来控制的。可以使用会话或全局范围设置此变量。控制新设置的生效时间和方式的规则与其他 MySQL 服务器系统变量的规则相同。设置当前会话的变量仅持续到该会话结束,并且其他会话看不到该更改。全局设置变量对更改后连接的 Client 端生效,但不适用于任何当前 Client 端会话,包括更改了变量设置的会话。要使全局系统变量设置永久生效,以便将其应用于服务器重新启动,必须在选项文件中进行设置。有关更多信息,请参见第 13.7.4.1 节“变量分配的 SET 语法”

在某些情况下,您无法在运行时更改二进制日志记录格式,否则会导致复制失败。参见第 5.4.4.2 节“设置二进制日志格式”

更改全局binlog_format值需要足够的特权来设置全局系统变量。更改会话binlog_format的值要求特权足以设置受限制的会话系统变量。参见第 5.1.8.1 节“系统变量特权”

基于语句的复制格式和基于行的复制格式具有不同的问题和限制。要比较它们的相对优缺点,请参见第 16.2.1.1 节,“基于语句的复制和基于行的复制的优缺点”

使用基于语句的复制时,复制存储的例程或触发器可能会遇到问题。您可以通过使用基于行的复制来避免这些问题。有关更多信息,请参见第 23.7 节“存储的程序二进制日志”