每种二进制日志格式都有优点和缺点。对于大多数用户,混合复制格式应该提供数据完整性和性能的最佳组合。但是,如果您希望在执行某些任务时利用特定于基于语句或基于行的复制格式的特性,则可以使用本节中的信息,其中提供了它们的相对优点和缺点的摘要,以确定最适合您的需求。
基于语句的复制的优点
成熟的技术。
更少的数据写入日志文件。当更新或删除影响许多行时,会导致多日志文件存储空间较少。这也意味着从备份中获取和恢复可以更快地完成。
日志文件包含进行任何更改的所有语句,因此可以使用它们来审计数据库。
基于语句复制的缺点
对SBR不安全的语句。不是所有修改数据的语句(比如
插入
删除
,更新
,取代
语句)可以使用基于语句的复制进行复制。使用基于语句的复制时,任何不确定的行为都难以复制。这种数据修改语言(DML)语句的例子包括:一种依赖于可加载函数或存储程序的不确定性语句,因为此类函数或存储程序返回的值或依赖于提供给它的参数以外的因素。(然而,基于行的复制只是复制函数或存储的程序返回的值,因此它对表行和数据的影响在源和副本上是相同的。)看到4.1.16节“被调用特性的复制”,以获取更多资料。
删除
而且更新
的语句。限制
无保险条款命令
的不确定性。看到4.1.18节“复制和限制”.锁定读语句(
选择……更新
而且选择……为分享
)NOWAIT
或跳过锁
选项。看到用NOWAIT和SKIP LOCKED锁定读并发.必须在副本上应用确定性可加载函数。
使用下列函数的语句不能使用基于语句的复制进行正确复制:
但是,使用基于语句的复制可以正确地复制所有其他函数,包括
现在()
等等。有关更多信息,请参见4.1.14节“复制和系统功能”.
不能使用基于语句的复制正确复制的语句将被记录,并发出如下所示的警告:
[警告]语句格式不安全。
在这种情况下,也会向客户发出类似的警告。客户端可以使用
显示警告
.插入……选择
与基于行的复制相比,需要更多的行级锁。更新
语句,需要表扫描(因为在在哪里
子句)必须比基于行的复制锁定更多的行。对于复杂语句,必须在更新或插入行之前在副本上计算并执行语句。使用基于行的复制,副本只需要修改受影响的行,而不执行完整的语句。
如果在副本上的计算中出现错误,特别是在执行复杂语句时,基于语句的复制可能会随着时间的推移慢慢增加受影响行的误差范围。看到4.1.29节“复制过程中的复制错误”.
存储的函数使用相同的方法执行
现在()
值作为调用语句。但是,对于存储过程则不是这样。必须在副本上应用确定性可加载函数。
表定义必须在源和副本上(几乎)相同。看到第4.1.9节,“在源和副本上使用不同表定义的复制”,以获取更多资料。
从MySQL 8.0.22开始,从MySQL授权表(通过连接列表或子查询)读取数据但不修改数据的DML操作在MySQL授权表上被执行为非锁定读取,因此对于基于语句的复制不安全。有关更多信息,请参见授予表并发性.
基于行复制的优点
基于行复制的缺点
RBR可以生成更多必须记录的数据。复制DML语句(例如
更新
或删除
语句),基于语句的复制只将语句写入二进制日志。相比之下,基于行的复制将每个更改的行写入二进制日志。如果语句更改了许多行,基于行的复制可能会向二进制日志写入更多的数据;即使对于回滚的语句也是如此。这也意味着创建和恢复备份可能需要更多时间。另外,二进制日志写入数据的锁定时间较长,可能会导致并发性问题。使用binlog_row_image =最小
大大减少劣势。生成大型的确定性可加载函数
团
使用基于行的复制比使用基于语句的复制需要更长的时间来复制值。这是因为团
记录列值,而不是生成数据的语句。您无法在副本上看到从源接收并执行了哪些语句。但是,您可以看到使用哪些数据进行了更改mysqlbinlog有选项
——base64-output = DECODE-ROWS
而且——详细
.或者,使用
binlog_rows_query_log_events
变量,如果启用该变量,将添加Rows_query
事件使用语句tomysqlbinlog时输出。vv
选项。对于使用
MyISAM
存储引擎,在副本上需要一个更强的锁插入
将它们作为基于行的事件应用到二进制日志时,而不是将它们作为语句应用时。这意味着并发插入开启MyISAM
使用基于行的复制时不支持表。