如果对满足WHERE条件数据执行UPDATE,而UPDATE未导致前后数据发生变化,这种情况下会产生二进制日志么?
=========================================================================================
ROW格式下测试:
##修改日志格式 SET SESSION binlog_format='ROW'; ##查看数据 SELECT * FROM t3 WHERE i1=1; +----+------+------+------------------+ | i1 | i2 | f | t | +----+------+------+------------------+ | 1 | 1 | 1 | New Hello World1 | +----+------+------+------------------+ ##更新数据 UPDATE t3 SET f=1 WHERE i1=1; ##Query OK, 0 rows affected (0.01 sec) ##Rows matched: 1 Changed: 0 Warnings: 0
使用mysqlbinlog查看日志,会发现没有对应上面update的二进制日志生成。
=========================================================================================
STATEMENT格式下进行测试:
##修改日志格式 SET SESSION binlog_format='STATEMENT'; ##更新数据 UPDATE t3 SET f=1 WHERE i1=1; ##Query OK, 0 rows affected (0.01 sec) ##Rows matched: 1 Changed: 0 Warnings: 0
查看二进制日志,会发现有以下信息:
=========================================================================================
总结:
对于未导致数据发生变化的UPDATE操作:
1、ROW格式下无行记录辩护因此不会记录到二进制日志中
2、STATEMENT格式下UPDATE语句会被记录到二进制日志中
3、MIX格式下,上面的UPDATE被当做STATEMENT格式处理
PS1: 修改回话参数的操作不会被记录到二进制文件中。
=========================================================================================