先介绍两个重要的日志模块
redo log(InnoDB 引擎层的日志)
- 当一条记录需要更新时
- InnoDB会把记录写到redo log 中
- 并更新到内存中
- InnoDB会在系统空闲的时候把记录更新到磁盘中
redo log的大小是固定的,比如分成四份
- writte pos是当前记录位置,一边写,一遍往后移
- check point 是当前擦的位置,一遍擦,一边往后移
- 如果write pos 追上 check point,会停止记录,先擦掉一些记录,在开始更新记录
有了redo log,即使数据库发生异常,也不会丢失记录 --crash safe
bing log (MySQL server层)
- MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
- 二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
为什么有了redo log 还要有 bing log
- redo log 是InnoDB 引擎特有的,bing log 是MySQL server 层实现的,所有引擎都可以使用
- rodo log 是物理日志,记录的是 “在某个数据页上做了什么修改”,bing log 是逻辑日志,记录的是 “在ID=2这行记录上字段C+1”
- redo log 是循环写的,bing log 是可以追加记录的,文件写满后会写在下一个,并不会覆盖信息
两阶段协议:
- redo log 分为两步提交
- redolog prepare
- redolog commit
- 保证redolog 和 binglog 日志的一致性