细嗦MySQL三大日志-binlog

时间:2024-03-01 18:41:23

redo log是物理日志,记录的是在什么数据上做了什么修改,属于InnoDB引擎。binlog属于逻辑日志,主要记录的是原始的逻辑语句,不管什么存储引擎,只要发生了表数据更新操作,都会产生binlog日志,binlog主要用于数据库的备份,主从数据同步,之类的用来保证数据的一致性。

记录格式

binlog日志有三种格式,可以通过binlog_format参数指定。statement row mixed

  • 如果指定statement,binlog中记录的就是sql语句原文,在同步数据的时候会执行sql语句。但是当遇到像记录当前时间的sql,如果是直接执行sql语句的话就会和原数据不一致。
  • 指定为row就不仅仅是记录执行的sql语句,在记录的时候还会包括具体的数据,这样就保证了记录数据的一致性,通常情况下都是指定为row,但是这种格式,需要更大的容量来记录,比较占用空间,恢复与同步数据时会更消耗IO资源,影响执行速度。
  • 指定为mixed是前两种的折中方案,当设置为mixed的时候,binlog中的记录是前两种的混合记录,在记录之前MySQL会先判断这条sql语句是否会引起数据不一致,然后根据判断结果记录相应的格式。

写入机制

binlog写入的过程是,在事务执行过程中,先把日志写到binlog cache中,事务提交的时候再将binlog cache写入到binlog文件中。可以通过binlog_cache_size参数配置binlog cache的大小,如果存储的内容超过这个容量就需要将内容暂时存储在磁盘中。在这里插入图片描述

将数据写入到page cache中是比较快的,只有数据从page cache写入到binlog中才是真正的持久化磁盘的操作。至于这两者的时机,由参数sync_binlog控制,默认是1。

  • 当这个参数为0的时候,每次提交事务都只会将binlog cache中的记录写入page cache,具体什么时候从page cache写入binglog由系统自行判断。虽然性能得到提升,但是机器宕机,page cache里面的 binlog 会丢失。
  • 当参数设置为1的时候,每次提交事务都会将binlog cache中的记录写入page cache并且刷盘到磁盘binlog中。
  • 还有一种方式就是可以设置参数为n,表示每提交n个事务之后进行一次刷盘操作。但是如果机器宕机,就会丢失最近n个事务的binlog日志。