MySQL里的日志文件

binary log
binary log记录了对Mysql数据库执行更改的所有操作(逻辑日志,不包含select,show这类没有对数据有修改的操作)。它是在存储引擎上层的数据库server层产生的。
binary log的作用:

  • 恢复
  • 复制
  • 审计,用户可以通过binary log中的信息进行审计。
binary log记录过程:
  1. 当开启一个事务时,所有未提交的binary log会被记录到一个缓存里。
  2. 等事务提交时直接将缓存的binary log写入binary log文件里(磁盘)。
该缓存可由binlog_chche_size进行调用,默认为32K。缓存同步磁盘可以通过sync_binlog进行调用,默认并不是每次写的时候同步到磁盘,宕机等极端情况下会出现部分binary log丢失。
binary log的格式:
  • statement,基于SQL,如果存在uuid等函数会出现主从服务器上数据不一致。
  • row,记录行更改情况。
  • mixed,在此格式下,默认使用statement格式进行记录,但出现uuid等函数时会调整为row格式。
redo log
redo log被称为InnoDB存储引擎的日志文件。通常是物理日志,记录的是页的物理修改操作。
redo log的作用:
  • 保证事务的原子性与持久性
redo log记录过程(可参考’InnoDB的两点特性‘里的double write):
  • 先写入一个重做日志缓冲。
  • 按照一定条件顺序地写入日志文件
【MySQL里的日志文件】这里的‘一定条件’有哪些条件呢?
  1. 主线程每秒会将重做日志缓冲写入磁盘的重做日志文件中。
  2. 由参数innodb_flush_log_at_trx_commit控制,表示在事务提交操作时处理重做日志的方式。
binary log与redo log的差异点:
  1. binary log记录的是与数据库所有有关的日志,包含InnoDB等其它存储引擎的日志;redo log只记录与存储引擎相关的事务日志。
  2. binary log记录的都是关于一个事务的具体操作内容,是逻辑日志;redo log记录的是关于每个页更改的物理情况,是物理日志。
  3. 写入时间不同,binary log仅在事务提交前进行提交,只写磁盘一次,不论事务多大;而在事务进行过程中,会有多条redo log写入。
binary log与redo log写入的整体过程:
  1. 当事务提交时InnoDB存储引擎进行准备操作。
  2. mysql数据库上层写入二进制日志。
  3. InnoDB引擎层将日志写入重做日志文件。
undo log
事务有时还需要进行回滚操作,这时就需要undo log
undo log保证事务的一致性,进行事务的回滚及MVCC功能的实现。
文章主要参考:《mysql技术内幕》,及详细分析MySQL事务日志(redo log和undo log)

    推荐阅读