概览

在前一节中我们提到过Mysql的redo log,通过redo log我们已经能够实现crash safe,那为什么Mysql还需要binlog呢?

binlog的数据恢复作用

其实,redo log是innodb引擎实现的,所以对MyIsam等其他引擎来说是没有redo log的。而binlog是Mysql的Server层实现的,所以对于任意一个引擎,都是支持binlog的。而且之前我们还提到过redo log是循环写的,所以redo log只能恢复短时间内的记录。而相对于redo log来说,binlog则要大得多。通过max_binlog_size我们可以设置单个binlog文件的大小,而Expire_logs_days则可以设置历史binlog的过期清除时间。

binlog的主备同步作用

除了上面我们提到的数据库恢复的作用外,binlog在主备同步上也有很大的作用。当Master服务器和Slave服务器建立连接后,Slave服务器通过io_thread读取Master上的binlog,然后将读取过来的记录写入relay log(中转日志)。然后Slave的sql_thread从relay log中取出相应的记录,并且解析执行写入数据库。

![主备同步流程图](/assets/wp-content/uploads/2019/05/未命名文件-42.png)
主备同步流程图

binlog的格式

binlog作为二进制文件一共有3种存储格式可以选择:Row、Statement和Mixed。

  • Statement格式下每次记录sql语句原文,但是此格式下可能会出现主备不一致的情况。
  • Row格式下记录每条记录修改的情况,如果是删除表这一操作的话,Statement只需要记录一条sql语句,而Row格式则需要记录该表每条记录都被删除的状况。所以Row格式相对于Statement格式需要占用更大的空间。
  • Mixed格式是前两者的混合版本,Mysql会根据每条语句的情况选择Row或者Statement格式进行记录。当Mysql认为目前这条语句使用Statement格式保存可能会引起主备不一致时,就会使用Row格式进行记录。