5.4.4.3 混合二进制日志记录格式

当以MIXED日志记录格式运行时,服务器在以下情况下自动从基于语句的记录切换为基于行的记录:

有关更多信息,请参见第 16.4.1.1 节“复制和 AUTO_INCREMENT”

无论是否实际记录任何临时 table,这都是事实。

临时 table 不能使用基于行的格式记录;因此,一旦使用了基于行的日志记录,使用该 table 的所有后续语句都是不安全的。服务器通过将会话期间执行的所有语句视为不安全,直到会话不再拥有任何临时 table,来近似此条件。

exception. 以下系统变量(仅与会话范围一起使用)不会导致日志记录格式切换:

有关确定系统变量范围的信息,请参见第 5.1.8 节“使用系统变量”

有关复制如何处理sql_mode的信息,请参见第 16.4.1.37 节,“复制和变量”

Note

如果尝试使用基于语句的日志记录执行语句,则应使用基于行的日志记录来生成警告。在 Client 端(在SHOW WARNINGS的输出中)和mysqld错误日志中都将显示警告。每次执行此类语句时,都会向SHOW WARNINGStable 添加警告。但是,只有为每个 Client 端会话生成警告的第一条语句才被写入错误日志,以防止日志泛滥。

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

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

Storage Engine 支持行记录 支持语句记录
ARCHIVE Yes Yes
BLACKHOLE Yes Yes
CSV Yes Yes
EXAMPLE Yes No
FEDERATED Yes Yes
HEAP Yes Yes
InnoDB Yes 是,当事务隔离级别为REPEATABLE READSERIALIZABLE时;否则没有。
MyISAM Yes Yes
MERGE Yes Yes
NDB Yes No

根据语句的类型(安全,不安全或二进制注入),二进制日志记录格式(STATEMENTROWMIXED)以及日志记录的功能,确定是否要记录一条语句以及要使用的日志记录模式。存储引擎(具有语句功能,具有行功能,或者两者兼而有之)。 (二进制注入是指记录必须使用ROW格式记录的更改.)

可能会在有或没有警告的情况下记录语句;失败的语句不会记录,但会在日志中生成错误。如下决策 table 所示。 Typebinlog_formatSLCRLC 列概述了条件,并且 Error/WarningLogged as 列 table 示相应的操作。 SLC 代 table“具有语句记录功能”,而 RLC 代 table“具有行记录功能”。

Type binlog_format SLC RLC 错误/警告 Logged as
* * No No 错误:无法执行语句:二进制日志记录是不可能的,因为涉及至少一个行不行和语句不行的引擎。 -
Safe STATEMENT Yes No - STATEMENT
Safe MIXED Yes No - STATEMENT
Safe ROW Yes No 错误:无法执行语句:二进制记录是不可能的,因为BINLOG_FORMAT = ROW,并且至少一个 table 使用的存储引擎无法进行基于行的日志记录。 -
Unsafe STATEMENT Yes No 警告:不安全的语句以BINLOG_FORMAT = STATEMENT的格式记录在日志中 STATEMENT
Unsafe MIXED Yes No 错误:无法执行语句:当存储引擎仅限于基于语句的日志记录时,即使BINLOG_FORMAT = MIXED,也不可能对不安全的语句进行二进制日志记录。 -
Unsafe ROW Yes No 错误:无法执行语句:二进制记录是不可能的,因为BINLOG_FORMAT = ROW,并且至少一个 table 使用的存储引擎无法进行基于行的日志记录。 -
Row Injection STATEMENT Yes No 错误:无法执行行注入:由于至少一个 table 使用了不支持基于行的日志记录的存储引擎,因此无法进行二进制日志记录。 -
Row Injection MIXED Yes No 错误:无法执行行注入:由于至少一个 table 使用了不支持基于行的日志记录的存储引擎,因此无法进行二进制日志记录。 -
Row Injection ROW Yes No 错误:无法执行行注入:由于至少一个 table 使用了不支持基于行的日志记录的存储引擎,因此无法进行二进制日志记录。 -
Safe STATEMENT No Yes 错误:无法执行语句:二进制日志记录是不可能的,因为BINLOG_FORMAT = STATEMENT并且至少一个 table 使用了不支持基于语句的日志记录的存储引擎。 -
Safe MIXED No Yes - ROW
Safe ROW No Yes - ROW
Unsafe STATEMENT No Yes 错误:无法执行语句:二进制日志记录是不可能的,因为BINLOG_FORMAT = STATEMENT并且至少一个 table 使用了不支持基于语句的日志记录的存储引擎。 -
Unsafe MIXED No Yes - ROW
Unsafe ROW No Yes - ROW
Row Injection STATEMENT No Yes 错误:无法执行行注入:由于BINLOG_FORMAT = STATEMENT,因此无法进行二进制日志记录。 -
Row Injection MIXED No Yes - ROW
Row Injection ROW No Yes - ROW
Safe STATEMENT Yes Yes - STATEMENT
Safe MIXED Yes Yes - STATEMENT
Safe ROW Yes Yes - ROW
Unsafe STATEMENT Yes Yes 警告:自BINLOG_FORMAT = STATEMENT以来,不安全语句以语句格式被二进制记录。 STATEMENT
Unsafe MIXED Yes Yes - ROW
Unsafe ROW Yes Yes - ROW
Row Injection STATEMENT Yes Yes 错误:无法执行行注入:由于BINLOG_FORMAT = STATEMENT,因此无法进行二进制日志记录。 -
Row Injection MIXED Yes Yes - ROW
Row Injection ROW Yes Yes - ROW

当确定产生警告时,将产生标准的 MySQL 警告(并且可以使用SHOW WARNINGS来获得)。该信息也将写入mysqld错误日志。每个 Client 端连接的每个错误实例仅记录一个错误,以防止泛滥日志。日志消息包含尝试的 SQL 语句。

如果副本上的log_error_verbosity为 2 或更大,则副本将向错误日志输出消息,以提供有关其状态的信息,例如二进制日志和中继日志坐标(在其开始工作时,切换到另一个中继日志时,它会在断开连接,对于基于语句的日志记录不安全的语句等之后重新连接。

首页