日志模块
redolog
- WAL技术(Write-Ahead Logging):先写日志,再写磁盘;
当记录更新时,InnoDB引擎先把记录写到 redo log,并更新内存,更新算完成了;InnoDB会在适当的时候,将操作记录更新到磁盘;
- redo log的文件结构
- 一组四个文件,每个文件1GB;
- 循环写入,write pos 到checkpoint 之间用来记录新记录,如果write pos达到checkpoint则需要先,更新一部分到磁盘,已腾出空间;
- crash-safe:保证数据库异常重启,之前提交记录不会丢失的能力;
binglog
- 与 redo log的区别
- redo log 是 InnoDB 特有的;binglog是Server层实现的,所有引擎都可以使用;
- redo log物理日志;binlog 逻辑日日志;
- redo log循环写;binlog追加写入;
日志写入流程
执行以下更新语句:
update T set c=c+1 where ID=2;
- 执行器通过引擎取ID=2的记录,先查内存,再查磁盘;
- 执行器执行计算及写入操作;
- 引擎将新数据写入内存,同时更新到redolog中,redo log处于 prepare状态;
- 执行器生成 binlog,并写入磁盘;
- 调用引擎的提交事务接口,将redo log改为 commit 状态,完成提交;
两阶段提交
为了保证 redo log 和 binlog 都可以表示事务的提交状态,两阶段提交可以让这两个状态在逻辑上一致;
- 先写 redo log后写 binlog: 写完 redo log之后,异常重启,会将redo log中的记录写入磁盘,此时,无法通过binlog还原;
- 先写 binlog 后写 redolog:写完 bin log后,异常重启 ,由于没写 redo log,磁盘中不会写入,故无法通过bin log还原;