MySQL日志系统

MySQL里面最重要的两个日志: 物理日志redo log和逻辑日志binlog

  • redo log(WAL Write-ahead logging,预写式日志)用于保证crash-safe能力(属于InnoDB引擎)

    数据页上做了什么修改

    循环写的,空间固定会用完

    redo log的写入拆成了两个步骤:prepare和commit,这就是”两阶段提交”

  • binlog主要做的是MySQL功能层面的事情(Server层实现)

    语句的原始逻辑

    binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志

概念

  • redo log是循环写的,不持久保存.
  • redo log只有InnoDB引擎才有
  • binlog日志只能用于归档

innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失

sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

介绍

redo log

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问题,MySQL的使用WAL技术(Write-Ahead Logging)来提升更新效率。

关键点就是先写日志,再写磁盘

有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新才算完成

InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面

redo log

redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写.

write pos是当前记录的位置: 一边写一边后移(循环写)

checkpoint是当前要擦除的位置: 往后推移(循环擦除)

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

bin log

binlog会记录所有的逻辑操作,并且是采用“追加写”的形式

两阶段提交

 上一篇