mysql
支持3种日志记录格式,STATEMENT
,ROW
,MIXED
可在启动时通过--binlog_format=type
指定。
STATEMENT
:也被称作logical logging,记录mysql
执行的语句ROW
:也被称作physical logging,记录每行数据的变化MIXED
:即STATEMENT
和ROW
的混合形式,mysql
会根据场景决定使用哪种日志格式查看目前使用的日志格式
show variables like ‘binlog_format’;
设置全局binlog_format,重新登录后生效
SET GLOBAL binlog_format = ‘STATEMENT’;
SET GLOBAL binlog_format = ‘ROW’;
SET GLOBAL binlog_format = ‘MIXED’;设置会话级别的binlog_format
SET SESSION binlog_format = ‘STATEMENT’;
SET SESSION binlog_format = ‘ROW’;
SET SESSION binlog_format = ‘MIXED’;
设置会话级别binlog_format的几种情况: - 假如对数据库做了比较小的改动,可能会把binlog_format设置为ROW
- 假如一次会话中在一条语句中更新了多行记录,此时使用STATEMENT
可能会更高效 - 有些语句可能执行需要的时间比较长,但结果只是几行数据被修改,这种情况也可以将binlog_format改为ROW
但一般不建议在运行时改变binlog_format,下面几种不建议改变binlog_format - 如果使用NDB
存储引擎 - 如果当前使用的是row-base replication而且存在临时表 当存在任何临时表时都不应该在运行时改变binlog_format
,因为只有在STATEMENT
的情况下日志才会记录临时的信息,而在ROW
的格式下是不会记录的。在MIXED
的模式下临时表通常也会记录。 每个mysql实例都可以设置自己的binlog_format
,每个实例会以自己的binlog_format
方式去解析日志文件,如果主从复制的架构中,master修改了binlog_format
而slave没有修改,则会报错。为会确保改变binlog_format
安全,需要停止复制并确保各个实例使用的是同一种日志格式。
Ref: 1.MYSQL Binary Log Format