MySQL 8.0 参考手册  / 第十七章复制  / 17.2 复制实现  / 17.2.1 复制格式  /  17.2.1.1 基于语句和基于行的复制的优点和缺点

17.2.1.1 基于语句和基于行的复制的优点和缺点

每种二进制日志记录格式都有优点和缺点。对于大多数用户来说,混合复制格式应该提供数据完整性和性能的最佳组合。但是,如果您想在执行某些任务时利用基于语句或基于行的复制格式的特定功能,您可以使用本节中的信息,其中总结了它们的相对优势和劣势,以确定哪个最适合您的需求。

基于语句的复制的优点
  • 成熟的技术。

  • 写入日志文件的数据较少。当更新或删除影响许多行时,这会导致 日志文件所需的存储空间大大减少。这也意味着可以更快地完成备份和恢复。

  • 日志文件包含进行任何更改的所有语句,因此它们可用于审核数据库。

基于语句的复制的缺点
基于行的复制的优点
  • 所有更改都可以复制。这是最安全的复制形式。

    笔记

    更新系统模式中信息的语句 mysql,例如 GRANTREVOKE触发器、存储例程(包括存储过程)和视图的操作,都使用基于语句的复制复制到副本。

    对于诸如 之类 CREATE TABLE ... SELECT的语句,CREATE 语句是从表定义中生成的,并使用基于语句的格式进行复制,而行插入则使用基于行的格式进行复制。

  • 对于以下类型的语句,源上需要更少的行锁,从而实现更高的并发性:

  • INSERT对于任何、 UPDATEDELETE语句 , 副本上需要的行锁更少 。

基于行的复制的缺点
  • RBR 可以生成更多必须记录的数据。要复制 DML 语句(例如 UPDATEor DELETE语句),基于语句的复制仅将语句写入二进制日志。相比之下,基于行的复制将每个更改的行写入二进制日志。如果该语句更改了很多行,则基于行的复制可能会将更多数据写入二进制日志;即使对于回滚的语句也是如此。这也意味着制作和恢复备份可能需要更多时间。另外,二进制日志写入数据的时间较长,可能会导致并发问题。利用 binlog_row_image=minimal大大减少劣势。

  • 生成大 BLOB值的确定性可加载函数使用基于行的复制比使用基于语句的复制花费更长的时间进行复制。这是因为 BLOB记录的是列值,而不是生成数据的语句。

  • 您无法在副本上看到从源接收并执行了哪些语句。但是,您可以使用带有选项 和的mysqlbinlog查看更改了哪些数据。 --base64-output=DECODE-ROWS--verbose

    或者,使用 binlog_rows_query_log_events 变量,如果启用,则 在使用该选项 时将Rows_query带有语句的事件添加到 mysqlbinlog输出 。-vv

  • 对于使用存储引擎的表,当将它们作为基于行的事件应用到二进制日志时,比将它们作为语句应用时,语句MyISAM 的副本需要更强的锁。INSERT这意味着MyISAM使用基于行的复制时不支持对表进行并发插入。