文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  混合二进制日志格式

7.4.4.3 混合二进制日志格式

MIXED 日志格式下运行时,服务器会在以下情况下自动从基于语句的日志切换到基于行的日志

在早于 MySQL 8.0 的版本中,当使用混合二进制日志格式时,如果一个语句是按行记录的,并且执行该语句的会话有任何临时表,那么该会话使用的所有临时表都被删除之前,所有后续语句都被视为不安全的,并以基于行的格式记录。在 MySQL 9.0 中,对临时表的 operations 不会在混合二进制日志格式中记录,并且会话中是否存在临时表对每个语句使用的日志模式没有影响。

注意

如果您尝试使用基于语句的日志执行应该使用基于行的日志写入的语句,则会生成警告。该警告在客户端(在 SHOW WARNINGS 的输出中)和通过 mysqld 错误日志中显示。每次执行此类语句时,都会将警告添加到 SHOW WARNINGS 表中。但是,为了防止日志泛滥,只有为每个客户端会话生成警告的第一个语句才会写入错误日志。

除了上述决定外,各个引擎还可以确定在更新表中的信息时使用的日志格式。各个引擎的日志功能可以定义如下

  • 如果引擎支持基于行的日志记录,则称该引擎为 基于行的日志记录

  • 如果引擎支持基于语句的日志记录,则称该引擎为 基于语句的日志记录

给定的存储引擎可以支持任一或两种日志格式。下表列出了每个引擎支持的格式。

存储引擎 支持基于行的日志记录 支持基于语句的日志记录
ARCHIVE
BLACKHOLE
CSV
EXAMPLE
联合
InnoDB 当事务隔离级别为 REPEATABLE READSERIALIZABLE 时为是;否则为否。
MyISAM
合并
NDB

是否记录语句以及使用哪种记录模式取决于语句的类型(安全、不安全或二进制注入)、二进制日志格式(STATEMENTROWMIXED)以及存储引擎的记录功能(支持语句记录、支持行记录、两者都支持或都不支持)。(二进制注入是指记录必须使用 ROW 格式记录的更改。)

语句可以带或不带警告记录;失败的语句不会记录,但会在日志中生成错误。以下决策表显示了这一点。类型binlog_formatSLCRLC 列概述了条件,而 错误/警告记录为 列表示相应的操作。 SLC 代表 支持语句记录RLC 代表 支持行记录

类型 binlog_format SLC RLC 错误/警告 记录为
* * 错误:无法执行语句:由于至少有一个引擎既不支持行记录也不支持语句记录,因此无法执行二进制日志记录。 -
安全 STATEMENT - STATEMENT
安全 MIXED - STATEMENT
安全 ROW 错误:无法执行语句:由于 BINLOG_FORMAT = ROW 并且至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 -
不安全 STATEMENT 警告:不安全语句以语句格式记录在二进制日志中,因为 BINLOG_FORMAT = STATEMENT STATEMENT
不安全 MIXED 错误:无法执行语句:当存储引擎仅限于基于语句的日志记录时,即使 BINLOG_FORMAT = MIXED,也不可能执行不安全语句的二进制日志记录。 -
不安全 ROW 错误:无法执行语句:由于 BINLOG_FORMAT = ROW 并且至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 -
行注入 STATEMENT 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 -
行注入 MIXED 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 -
行注入 ROW 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 -
安全 STATEMENT 错误:无法执行语句:由于 BINLOG_FORMAT = STATEMENT 并且至少有一个表使用不支持基于语句的日志记录的存储引擎,因此无法执行二进制日志记录。 -
安全 MIXED - ROW
安全 ROW - ROW
不安全 STATEMENT 错误:无法执行语句:由于 BINLOG_FORMAT = STATEMENT 并且至少有一个表使用不支持基于语句的日志记录的存储引擎,因此无法执行二进制日志记录。 -
不安全 MIXED - ROW
不安全 ROW - ROW
行注入 STATEMENT 错误:无法执行行注入:由于 BINLOG_FORMAT = STATEMENT,因此无法执行二进制日志记录。 -
行注入 MIXED - ROW
行注入 ROW - ROW
安全 STATEMENT - STATEMENT
安全 MIXED - STATEMENT
安全 ROW - ROW
不安全 STATEMENT 警告:不安全语句以语句格式记录在二进制日志中,因为 BINLOG_FORMAT = STATEMENT STATEMENT
不安全 MIXED - ROW
不安全 ROW - ROW
行注入 STATEMENT 错误:无法执行行注入:由于 BINLOG_FORMAT = STATEMENT,因此无法执行二进制日志记录。 -
行注入 MIXED - ROW
行注入 ROW - ROW

当确定过程产生警告时,会生成一个标准的 MySQL 警告(可以使用 SHOW WARNINGS 获取)。这些信息也会写入 mysqld 错误日志。为了防止日志泛滥,每个客户端连接每个错误实例只记录一个错误。日志消息包含尝试执行的 SQL 语句。

如果副本的 log_error_verbosity 设置为显示警告,则副本会将消息打印到错误日志中,以提供有关其状态的信息,例如它开始作业的二进制日志和中继日志坐标、切换到另一个中继日志的时间、断开连接后重新连接的时间、不适合基于语句的日志记录的语句等等。