### 17.2.1 复制格式

[17.2.1.1 基于语句和基于行的复制的优缺点](replication-sbr-rbr.html)
[17.2.1.2 基于行的日志记录和复制的使用](replication-rbr-usage.html)
[17.2.1.3 二进制日志中安全和不安全语句的确定](replication-rbr-safe-unsafe.html)

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

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

-   使用基于行的日志记录时，源将事件写入二进制日志，指示如何更改单个表行。通过将表示对表行的更改的事件复制到副本来将源复制到副本。这称为基于行的复制（可以缩写为 RBR）。

    基于行的日志记录是默认方法。

-   您还可以将 MySQL 配置为混合使用基于语句和基于行的日志记录，具体取决于哪个最适合记录更改。这称为混合格式日志记录。使用混合格式日志时，默认使用基于语句的日志。根据某些语句以及所使用的存储引擎，在特定情况下，日志会自动切换为基于行的。使用混合格式的复制称为基于混合的复制或混合格式复制。有关详细信息，请参阅[第 5.4.4.3 节，“混合二进制日志记录格式”](binary-log-mixed.html).

**NDB 集群。**MySQL NDB Cluster 8.0 中的默认二进制日志记录格式是`混合`.您应该注意 NDB Cluster Replication 始终使用基于行的复制，并且[`新开发银行`](mysql-cluster.html)存储引擎与基于语句的复制不兼容。看[第 23.7.2 节，“NDB 集群复制的一般要求”](mysql-cluster-replication-general.html)， 了解更多信息。

使用时`混合`格式，二进制日志记录格式部分取决于正在使用的存储引擎和正在执行的语句。有关混合格式日志记录和管理不同日志记录格式支持的规则的更多信息，请参阅[第 5.4.4.3 节，“混合二进制日志记录格式”](binary-log-mixed.html).

正在运行的 MySQL 服务器中的日志记录格式通过设置[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)服务器系统变量。可以使用会话或全局范围设置此变量。管理新设置何时以及如何生效的规则与其他 MySQL 服务器系统变量的规则相同。为当前会话设置变量只会持续到该会话结束，并且更改对其他会话不可见。全局设置变量对更改后连接的客户端生效，但不适用于任何当前客户端会话，包括更改变量设置的会话。要使全局系统变量设置永久化以便它在服务器重新启动时应用，您必须在选项文件中设置它。有关详细信息，请参阅[第 13.7.6.1 节，“变量赋值的 SET 语法”](set-variable.html).

在某些情况下，您无法在运行时更改二进制日志记录格式，否则会导致复制失败。看[第 5.4.4.2 节，“设置二进制日志格式”](binary-log-setting.html).

改变全球[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)value 需要足够的权限来设置全局系统变量。更改会话[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)value 需要足够的权限来设置受限会话系统变量。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).

基于语句和基于行的复制格式有不同的问题和限制。有关它们的相对优缺点的比较，请参阅[第 17.2.1.1 节，“基于语句和基于行的复制的优缺点”](replication-sbr-rbr.html).

使用基于语句的复制，您可能会遇到复制存储的例程或触发器的问题。您可以改用基于行的复制来避免这些问题。有关详细信息，请参阅[第 25.7 节，“存储程序二进制日志”](stored-programs-logging.html).
