今日主题:redo log(重做日志)和 binlog(归档日志)。
redo log(重做日志)
MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。这就跟记账一样,也就是先写粉板,等不忙的时候再写账本(因为写账本慢那)。
InnoDB 引擎就会先把记录写到 redo log(粉板)里面(这个也是写磁盘,注意写redo log是顺序写,所以效率比较高),并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面。
比如这个图,如果日志写满,就需要将日志的内容挪到磁盘中,这样才可以清理数据。
InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写。
write pos :当前写入的位置。
checkpoint: 数据开始的位置。
write pos到checkpoint部分就是可写的区域。有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。
日志模块:binlog
- redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
- binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
1.binlog只有在commit的时候才会写入; 2.当prepare log 写入成功且binglog写入成功后发生crash,在mysql启动时候,会自动commit这个事物; 3.当prepare log写入成功,binlog写入失败,此时发生crash,mysql启动会自动回滚掉这个事物。
网友评论