文章

Mysql-Log

undo log

格式

操作表,记录了修改前的数据(逻辑操作)和版本链。具体的格式根据执行的语句不同而有些许变化,主要记录的具体的变化。比如插入的,记录的内容是插入记录的主键(指针),回滚时候就删除;更新为记录被更新的记录的指针,被更新的旧值,事务ID,会形成版本链;删除,被删除的记录的指针,被删除的旧值,事务ID

记录时间

引擎层,每执行一条语句形成一个undolog。

刷盘时机

1.写入buff pool中被redo log记录

2.具体刷盘时间由redo机制完成

redo log

原因:

引擎层为了加快读取速度读取内存数据,也就是buff pool。内存容易掉电丢失,为了保证不丢数据需要redo log保证。

格式

指的是具体物理格式的改变,比如在**对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量的地方做了AAA 更新。**

刷盘时机

1.Mysql关机

2.后台线程每隔1s,自动从redo log buffer完成刷盘

3.事务提交后,根据参数的不同完成刷盘

- 参数0:redo log写入buffer中,不主动刷盘,由OS控制刷盘时机

- 参数1:每完成一个事务,调用write+fsyn,完成刷盘

- 参数2:每完成一个事务,调用write,写入pageCache中,没有刷盘

4.redo log buffer记录的写入量大于总量的一半

参数比较

首先,无论参数如何设置,总有后台线程完成自动刷盘,所以参数0,进程崩溃会丢失前一秒内的所有事务数据,参数1则不会丢数据,因为已经写入page Cache中,但是机器宕机也会丢失前一秒内的所有事务数据

- 数据安全性:参数 1 > 参数 2 > 参数 0

- 写入性能:参数 0 > 参数 2> 参数 1

好处

1.让mysql拥有有了掉电不丢数据的crash-safe 能力

2.同时mysql在修改数据的时候,由原来的随机写变为了顺序写。因为redo在刷盘的时候,是为循环写,也就是追加写的一种,写入速度快。

文件格式

为两个redo log文件,写入方式为追加写+循环写。双指针记录redo log刷盘进度,和redo log 写进度,如果写进度追上刷盘进度,mysql则会阻塞。

bin log

目的

server提供的功能,主要为了主从同步,备份恢复

redo log vs bin log

1.写入方式:bin log追加写,redo log 循环写

2.文件格式:redo log为数据库的物理格式上的变化,XX表XX偏移量做了XX更新:bin log分为statement和raw和mix:statement逻辑操作,raw完成操作后的数据结果记录,

3.服务提供的对象:bin server 和 redo 引擎

刷盘时机

1.在一个事务中,每一条语句写入bin log的cache中,这是每一个线程拥有区域的

2.完成事务后,才进行刷盘,刷盘方式由参数控制:

- 参数0:不刷盘,由OS控制

- 参数1:每一个事务,执行write+fsyn一次

- 参数N:每个事务,执行write,积累N个事务,执行fsyn一次

两阶段提交

原因:

因为redo log和bin log都会独立刷盘,很容易出现半成功的情况,会导致主从不一致。为了防止出现不一致采取了两阶段提交(分布式事务的一种),把单个事务的提交分为两阶段:prepare和commit。由协调者和参与者完成。在mysql事务中协调者为bin log,参与者为redo log。

过程

prepare:将XA事务的ID,写入redo log,状态设为prepare,redo log完成刷盘

commit:将XA事务的ID,写入bin log,bin log完成刷盘,同时调用引擎接口,redo log设置为commit,这里是write的方式写入

存在的问题

1.IO次数多

2.锁竞争激烈

如何解决

采取组提交

  • 单独bin log组提交

prepare阶段不变,redo log完成刷盘,commit阶段分为flush+syn+commit阶段,每个阶段拥有一个队列

flush:完成prepare 的事务按顺序进入flush queue,调用write,写入page cache中

syn:积累N个事务后,调用一次fsyn,完成刷盘

commit:

  • 优化组提交

对redo log也优化了组提交,将redo log刷盘时间放入了flush阶段。

flush:redo log 在queue排队,积累N个redo log调用一次write+fsyn,完成redo log的刷盘,同时调用bin log 的write,将bin log写入page cache中

syn:积累N个事务后,调用一次bin log的fsyn,完成bin刷盘

commit:调用引擎的提交事务接口,将 redo log 状态设置为 commit。

License:  CC BY 4.0