当以MIXED日志记录格式运行时,服务器在以下情况下会自动从基于语句的记录切换为基于行的记录:
-
当函数包含时
UUID()。 -
当一个或多个带有
AUTO_INCREMENT列的表被更新并且触发器或存储的函数被调用时。像所有其他不安全的语句一样,如果会生成警告binlog_format = STATEMENT。有关更多信息,请参见 第17.5.1.1节“复制和AUTO_INCREMENT”。
-
当视图主体需要基于行的复制时,创建视图的语句也将使用它。例如,当创建视图的语句使用该
UUID()函数时,就会发生这种情况 。 -
当涉及到UDF的调用时。
-
使用
FOUND_ROWS()或时ROW_COUNT()。错误#12092,错误#30244) -
使用
USER(),CURRENT_USER()或时CURRENT_USER。(错误#28086) -
当涉及的表之一是
mysql数据库中的日志表时 。 -
使用该
LOAD_FILE()功能时。(缺陷#39701) -
当一条语句引用一个或多个系统变量时。错误#31168)
例外。 以下系统变量(仅与会话范围一起使用)不会导致切换日志记录格式:
auto_increment_incrementauto_increment_offsetcharacter_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_servercollation_connectioncollation_databasecollation_serverforeign_key_checksidentitylast_insert_idlc_time_namespseudo_thread_idsql_auto_is_nulltime_zonetimestampunique_checks
有关确定系统变量范围的信息,请参见 第5.1.9节“使用系统变量”。
有关复制如何处理的信息
sql_mode,请参见 第17.5.1.38节“复制和变量”。
在早期版本中,当使用混合二进制日志记录格式时,如果按行记录一条语句,并且执行该语句的会话具有任何临时表,则所有后续语句均被视为不安全,并以基于行的格式记录,直到所有临时表该会话正在使用中的已删除。从MySQL 8.0开始,对临时表的操作不会以混合二进制日志格式记录,并且会话中临时表的存在不会影响每个语句所使用的日志模式。
注意
如果尝试使用基于语句的日志记录执行语句,则应使用基于行的日志记录来生成警告。该警告在客户端(在的输出中SHOW WARNINGS)和mysqld错误日志中均显示。SHOW WARNINGS 每次执行这样的语句时,都会向表中添加一条警告。但是,只有为每个客户端会话生成警告的第一条语句才被写入错误日志,以防止日志泛滥。
除了上述决定外,各个引擎还可以确定更新表中的信息时使用的日志记录格式。单个引擎的日志记录功能可以定义如下:
- 如果引擎支持基于行的日志记录,则该引擎被称为具有行记录功能。
- 如果引擎支持基于语句的日志记录,则该引擎被称为具有语句记录能力。
给定的存储引擎可以支持一种或两种日志格式。下表列出了每个引擎支持的格式。
| 储存引擎 | 支持行记录 | 支持语句记录 |
|---|---|---|
ARCHIVE |
是 | 是 |
BLACKHOLE |
是 | 是 |
CSV |
是 | 是 |
EXAMPLE |
是 | 没有 |
FEDERATED |
是 | 是 |
HEAP |
是 | 是 |
InnoDB |
是 | 当事务隔离级别为REPEATABLE READ或 时为“是” SERIALIZABLE;没有其他。 |
MyISAM |
是 | 是 |
MERGE |
是 | 是 |
NDB |
是 | 没有 |
是否一个语句是要记录与要使用的是根据语句的类型所确定的记录模式(安全,不安全,或二进制注入),二进制日志记录格式(STATEMENT,ROW,或 MIXED),并且存储发动机的记录功能(有陈述能力,有行能力,两者都有,或两者都不有)。(二进制注入是指记录必须使用ROW格式记录的更改。)
可能会在有或没有警告的情况下记录语句;失败的语句不会记录,但会在日志中生成错误。如下决策表所示。 Type, binlog_format, SLC和 RLC列概述了条件,而Error / Warning 和Logged as列表示相应的操作。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 |
| 类型 | binlog_format |
SLC | RLC | 错误/警告 | 登录为 |
|---|---|---|---|---|---|
当确定产生警告时,将产生标准MySQL警告(并且可以使用来使用 SHOW WARNINGS)。该信息也将写入mysqld错误日志。每个客户端连接的每个错误实例仅记录一个错误,以防止泛滥日志。日志消息包括尝试的SQL语句。
如果某个副本已 log_error_verbosity设置为显示警告,则该副本会将消息打印到错误日志,以提供有关其状态的信息,例如二进制日志和中继日志坐标(当它开始切换到另一个中继日志时,在其开始工作时)。断开连接后重新连接,对于基于语句的日志记录不安全的语句等。




