复制之所以有效,是因为写入二进制日志的事件是从源读取的,然后在副本上进行处理。根据事件的类型,事件以不同的格式记录在二进制日志中。使用的不同复制格式对应于在源的二进制日志中记录事件时使用的二进制日志记录格式。二进制日志记录格式与复制期间使用的术语之间的相关性是:
使用基于语句的二进制日志记录时,源将 SQL 语句写入二进制日志。通过在副本上执行 SQL 语句将源复制到副本。这称为 基于语句的复制(通常缩写为 SBR),它对应于标准的 MySQL 基于语句的二进制日志记录格式。MySQL 版本 5.1.4 和更早版本中的复制功能专门使用这种格式。
使用基于行的日志记录时,源将 事件写入二进制日志,指示各个表行的更改方式。将源复制到副本的工作原理是将表示对表行的更改的事件复制到副本。这称为基于行的复制(通常缩写为 RBR)。在基于行的复制中,源将 事件写入二进制日志,指示各个表行的更改方式。
您还可以将 MySQL 配置为混合使用基于语句和基于行的日志记录,具体取决于哪种最适合记录更改。这称为 混合格式日志记录。使用混合格式日志记录时,默认使用基于语句的日志。根据某些语句以及所使用的存储引擎,日志在特定情况下会自动切换为基于行。使用混合格式的复制通常称为 基于混合的复制 或混合格式复制。有关详细信息,请参阅 第 5.4.4.3 节,“混合二进制日志记录格式”。
在 MySQL 5.6 中,基于语句的格式是默认的。
NDB集群。
所有 MySQL NDB Cluster 7.3 和 MySQL NDB Cluster 7.4 版本中的默认二进制日志记录格式是MIXED
. 您应该注意 NDB Cluster Replication 始终使用基于行的复制,并且
NDB
存储引擎与基于语句的复制不兼容。有关更多信息,请参阅
第 18.7.2 节,“NDB Cluster 复制的一般要求”。
使用MIXED
format 时,二进制日志记录格式部分由正在使用的存储引擎和正在执行的语句决定。有关混合格式日志记录和管理不同日志记录格式支持的规则的更多信息,请参阅第 5.4.4.3 节,“混合二进制日志记录格式”。
正在运行的 MySQL 服务器中的日志记录格式是通过设置binlog_format
服务器系统变量。该变量可以在会话或全局范围内设置。管理新设置何时以及如何生效的规则与其他 MySQL 服务器系统变量相同。为当前会话设置变量只持续到该会话结束,并且更改对其他会话不可见。全局设置变量对更改后连接的客户端生效,但对任何当前客户端会话无效,包括更改变量设置的会话。要使全局系统变量设置永久化以便在服务器重新启动时应用,您必须在选项文件中进行设置。有关详细信息,请参阅
第 13.7.4.1 节,“变量赋值的 SET 语法”。
在某些情况下,您无法在运行时更改二进制日志记录格式,否则会导致复制失败。请参阅第 5.4.4.2 节,“设置二进制日志格式”。
更改全局binlog_format
值需要足够的权限来设置全局系统变量。更改会话
binlog_format
值需要足够的权限来设置受限会话系统变量。请参阅第 5.1.8.1 节,“系统变量权限”。
基于语句和基于行的复制格式有不同的问题和限制。有关它们的相对优缺点的比较,请参阅 第 17.1.2.1 节,“Statement-Based 和 Row-Based 复制的优缺点”。
使用基于语句的复制,您可能会遇到复制存储例程或触发器的问题。您可以通过使用基于行的复制来避免这些问题。有关详细信息,请参阅第 20.7 节,“存储程序二进制日志记录”。