mysql之binlog-format

mysql支持3种日志记录格式,STATEMENT,ROW,MIXED 可在启动时通过--binlog_format=type指定。

  • STATEMENT:也被称作logical logging,记录mysql执行的语句
  • ROW:也被称作physical logging,记录每行数据的变化
  • MIXED:即STATEMENTROW的混合形式,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