mysql日志模块

时间:2022-07-22
本文章向大家介绍mysql日志模块,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

redo log

在MySQL中如果每次更新操作后都写要磁盘,即首先在磁盘中找到该条记录,再更新,整个过程I/O成本,查找成本都很高并发度很高的情况下对效率影响较大。为了解决该问题,MySQL中使用到了WAL(Write-Ahead logging )写磁盘前先写日志。当一条记录需要更新的时候,InnoDB会先把记录写入redo log,等系统空闲时再写入磁盘。

此外InnoDB的redo log大小是固定的,为了节省空间期间,其从头开始写,写到末尾后又从开头循环。如下图所示:

来自mysql实战45讲

定义两个指针,每次往write pos之后记录操作,一边记录,一边后移write pos指针,在该过程中需要保证write pos到check point有空闲位置,若无空闲位置,先擦掉然后移动check point,擦除之前需先写入磁盘。此外若写满了,此时就不能执行更新操作了,之后擦除得到空闲位置才能接着执行。

redo log保证了即使数据库发生异常重启,之前提交的数据也不会丢失,该能力被称之为cash - safe。

redo log也是事务持久性的具体实现。

binlog

bin log为mysql server层固有的日志,用于归档。

其与redo log有以下三点不同:

1)、redo log 是InnoDB独有的,二binlog是MySQL Server层实现的,所有的引擎都可以使用。

2)、redo log是物理日志,记录的是每个数据页做了哪些修改,binlog是逻辑日志,记录的是这条语句的原始逻辑,比如修改某行的某个字段。

3)、redo log是循环写,其空间是会用完的,而binlog是追加写入的,写满一定大小之后会换到另一块。

两阶段提交

一条更新语句

把更新写入内存
写入redo log, 事务处于prepared阶段
写入binlog
提交事务, 事务处于commit

使用两阶段提交是为了保证两个日志的逻辑一致。为了防止redo log刚写完,还未写binlog此时发生crash了。

对于数据库要恢复到某一时间:

1)、找到redo log建立的最近的一次全量备份,从该备份恢复到零时库

2)、然后从备份时间开始,将备份从binlog取出依次恢复到那个时间

此时就可以把临时库按需分配到线上。