在Mysql中经常会听到WAL机制(Write-Ahead-Logging),主要讲了数据在操作的时候先进行写日志,然后再将数据写入磁盘的过程。之前提到过Mysql中的两个重要的日志文件redo log和bin log。
redo log:Mysql分配给redoLog固定大小区域记录日志,该日志采用循环写从头写到尾然后在从头,同时还有一个记录擦除日志位置的标记checkpoint。当写入点和checkpoint在同一个位置,则停止写日志。如果数据库异常后,提交后的记录不会丢失称为crash-safe
bin log:称为归档日志,是追加写不会覆盖之前的日志。所以可以根据binlog日志可以完成主从备份、数据订阅、恢复数据等工作。
之前也提到mysql执行一条update语句遵从两阶段提交过程,整个流程如下
1.先通过引擎找到对应的行数据
2.对行数据进行修改并调用引擎接口修改这条数据
3.redo log记录更新流程此时处于prepare状态,告知mysql执行器完成操作
4.执行器生成binlog并写入磁盘
5.执行器调用引擎提交事务接口,redo log状态变为commit状态完成整个更新操作。
Redo log进行flush操作
Mysql在记录redo log的时候会先将数据写入到内存中,然后通过flush将内存中的数据写入磁盘中。再次期间会产生脏数据页导致内存和磁盘的数据不一致。这时候mysql就需要刷脏数据页。
Mysql什么时候执行flush操作?
1.当记录redo log的内存满了,会停止写入redo log操作。
2.写入日志太多,发现分配的内存不够,这时候需要淘汰一部分数据页。
3.mysql空闲时会进行f