每种二进制日志格式各有优缺点。对于大多数用户,混合复制格式应该提供数据完整性和性能的最佳组合。但是,如果您希望在执行某些任务时利用基于语句或基于行复制格式特有的特性,则可以使用本节中的信息(其中概述了它们的相对优缺点)来确定哪种特性最适合您的需求。
基于语句的复制的优点
成熟的技术。
写入日志文件的数据更少。当更新或删除影响许多行时,这将导致多日志文件所需存储空间减少。这也意味着从备份中获取和恢复可以更快地完成。
日志文件包含进行任何更改的所有语句,因此可以使用它们审计数据库。
基于语句的复制的缺点
对SBR不安全的语句。并非所有修改数据的语句(如
插入
删除
,更新
,取代
语句)可以使用基于语句的复制进行复制。在使用基于语句的复制时,任何不确定性行为都难以复制。这种数据修改语言(DML)语句的例子包括:一种依赖于非确定性的可加载函数或存储程序的语句,因为这样的函数或存储程序返回的值或依赖于提供给它的参数以外的因素。(但是,基于行的复制只是复制函数或存储程序返回的值,因此它对表行和数据的影响在源和副本上是相同的。)看到第17.5.1.16节“被调用特性的复制”,以查询更多资料。
删除
而且更新
语句使用限制
无命令
的不确定性。看到第17.5.1.18节“复制和限制”.锁定读语句(
选择……更新
而且选择……为分享
)使用NOWAIT
或跳过锁
选项。看到锁定读并发,NOWAIT和SKIP锁定.必须在副本上应用确定的可加载函数。
使用以下函数的语句不能通过基于语句的复制正常复制:
但是,使用基于语句的复制可以正确复制所有其他函数,包括
现在()
等等。有关更多信息,请参见第17.5.1.14节“复制和系统功能”.
使用基于语句的复制无法正确复制的语句将被记录,并发出如下所示的警告:
[警告]使用语句格式登录是不安全的。
在这种情况下,也会向客户发出类似的警告。客户端可以使用
显示警告
.插入……选择
与基于行的复制相比,需要更多的行级锁。更新
语句需要表扫描(因为在在哪里
子句)必须锁定比基于行的复制更多的行。对于复杂语句,必须在更新或插入行之前在副本上求值并执行语句。使用基于行的复制,副本只需要修改受影响的行,而不需要执行完整的语句。
如果在副本上的计算中出现错误,特别是在执行复杂语句时,基于语句的复制可能会随着时间的推移在受影响的行之间缓慢增加误差幅度。看到第17.5.1.29节“复制过程中的复制错误”.
存储函数使用相同的方法执行
现在()
值作为调用语句。但是,对于存储过程就不是这样了。必须在副本上应用确定的可加载函数。
表定义在源和副本上必须(几乎)相同。看到第17.5.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
事件中使用的语句mysqlbinlog时输出。vv
选项。对于使用
MyISAM
存储引擎,副本上需要更强的锁插入
语句作为基于行的事件应用到二进制日志时使用,而不是作为语句应用时使用。这意味着并发插入MyISAM
使用基于行的复制时不支持表。