19.2.1 复制格式
复制工作是因为事件被写入到二进制日志中,然后在副本上被读取并处理。事件在二进制日志中以不同的格式记录,根据事件类型。用于复制的格式对应于源的二进制日志格式。
-
使用语句-Based 二进制日志时,源将SQL语句写入到二进制日志中。复制源到副本时,执行SQL语句在副本上。这称为语句-Based 复制(简称SBR),对应于MySQL 语句-Based 二进制日志格式。
-
使用行-Based 记录时,源将事件写入到二进制日志中,表示如何更改表中的行。复制源到副本时,将事件复制到副本上。这称为行-Based 复制(简称RBR)。
行-Based 记录是默认方法。
-
您也可以根据需要配置MySQL 使用语句-Based 和行-Based 记录的混合格式,这称为混合格式记录。使用混合格式记录时,默认使用语句-Based 记录。根据某些语句和存储引擎的使用,日志自动切换到行-Based 记录。使用混合格式的复制称为混合-Based 复制或混合格式复制。详见Section 7.4.4.3, “Mixed Binary Logging Format”。
NDB Cluster. MySQL NDB Cluster 8.4 的默认二进制日志格式是 ROW
。NDB Cluster 复制使用行-Based 复制;NDB Cluster存储引擎与语句-Based 复制不兼容。详见Section 25.7.2, “General Requirements for NDB Cluster Replication”,了解更多信息。
使用MIXED
格式时,二进制日志格式部分由使用的存储引擎和执行的语句确定。有关混合格式日志和支持不同日志格式的规则,请见第7.4.4.3节,“混合二进制日志格式”。
控制 MySQL 服务器的日志格式可以通过设置binlog_format
服务器系统变量来实现。该变量可以以会话或全局范围设置。设置变量的规则与其他 MySQL 服务器系统变量相同。将变量设置为当前会话将在会话结束时失效,并且该变化对其他会话不可见。将变量设置为全局将对连接到服务器后连接的客户端生效,但对当前会话和会话中变量设置的会话不生效。要使全局系统变量设置永久生效,以便在服务器重启时生效,请在选项文件中设置该变量。更多信息,请见第15.7.6.1节,“SET 语法用于变量赋值”。
在某些情况下,您不能在运行时更改二进制日志格式或更改导致复制失败。请见第7.4.4.2节,“设置二进制日志格式”。
更改全局binlog_format
值需要具有足够的权限来设置全局系统变量。更改会话binlog_format
值需要具有足够的权限来设置受限会话系统变量。请见第7.1.9.1节,“系统变量权限”。
更改二进制日志格式(binlog_format
系统变量)在 MySQL 8.0 中已被弃用;在 MySQL 的未来版本中,您可以期望binlog_format
将被完全删除,并且行基于格式将成为 MySQL 的唯一日志格式。
语句基于和行基于复制格式具有不同的限制和限制。有关它们相对优缺的比较,请见第19.2.1.1节,“语句基于和行基于复制的优缺”。
使用语句基于复制,您可能会遇到存储程序或触发器复制问题。您可以通过使用行基于复制来避免这些问题。更多信息,请见第27.7节,“存储程序二进制日志”。