携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情 >>
MySQL 日志
redo log(重做日志)InnoDB 引擎层特有的日志
WAL(Write-Ahead Logging)技术 关键点就是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。在系统比较空闲的时候会将此种操作记录(对数据库的修改)更新到磁盘里。
redo log 的大小是固定的,从开头开始写,写到末尾就又回到开头循环写。
其中 write pos 是当前记录的位置,一边写一边后移。checkpoint 是当前要擦除的位置,也是往后推移并且循环的。write pos 和 checkpoint 之间的就是可以用来记录新操作的部分。
redo log:实现 crash-safe 能力 binlog(归档日志,Server 层日志)数据恢复能力
update 语句执行(两阶段提交):
由于redo log和binlog都可以表示一个事务的提交状态,而两阶段提交保证了整两个状态逻辑上的一致。
若先提交redo log,在提交binlog时数据库异常重启,由于redo log是完整的所以可以用来恢复数据库,但是binlog还未写完所以当时用这个binlog恢复临时库就会使得数据不完整。
若先提交binlog,在提交redo log时数据库发生崩溃,由于redo log还没有写完,而binlog是完整的,这样也会导致数据不一致。
binlog 写入机制
事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。
事务提交的时候,执行器把 binlog cache 里的完整事务写入到 binlog 中,并清空 binlog cache。所有的线程公用一份 binlog 文件。
图中的 write,指的就是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快。图中的 fsync,才是将数据持久化到磁盘的操作。