一.redo log
1.定义:redo log是物理日志,记录的是数据页的物理修改
2.修改redo log的个数和大小:大小:innodb_log_file_size;个数:innodb_log_files_in_group (这两个参数需重启生效)
3.redo log 的组提交:redo组提交的思想是将多个事务redo log的刷盘合并,减少磁盘顺序写;Innodb的日志系统里面,每条redo log都有一个LSN(Log Sequence Number),LSN是单调递增的。每个事务执行更新操作都会包含一条或多条redo log,各个事务将日志拷贝到log_sys_buffer时(log_sys_buffer 通过log_mutex保护),都会获取当前最大的LSN,因此可以保证不同事务的LSN不会重复。那么假设三个事务Trx1,Trx2和Trx3的日志的最大LSN分别为LSN1,LSN2,LSN3(lsn1<lsn2<lsn3),它们同时进行提交,那么如果trx3日志先获取到log_mutex进行落盘,它就可以顺便把[lsn1-lsn3]这段日志也刷了,这样trx1和trx2就不用再次请求磁盘io。
redo组提交的具体流程:
刷日志到磁盘有以下几种规则:
1.发出commit动作时。已经说明过,commit发出后是否刷日志由变量 innodb_flush_log_at_trx_commit 控制。
2.每秒刷一次。这个刷日志的频率由变量 innodb_flush_log_at_timeout 值决定,默认是1秒。要注意,这个刷日志频率和commit动作无关。
3.当log buffer中已经使用的内存超过一半时。
4.当有checkpoint时,checkpoint在一定程度上代表了刷到磁盘时日志所处的LSN位置。
二.undo log
undo log有两个作用:提供回滚和多个行版本控制(MVCC)。在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。有时候应用到行版本控制的时候,也是通过undo log来实现的:当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。
undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。innodb存储引擎对undo的管理采用段的方式。rollback segment称为回滚段,每个回滚段中有1024个undo log segment。在以前老版本,只支持1个rollback segment,这样就只能记录1024个undo log segment。后来MySQL5.5可以支持128个rollback segment,即支持128*1024个undo操作,还可以通过变量innodb_undo_logs参数定义,默认是128个
另外,undo log也会产生redo log,因为undo log也要实现持久性保护。
三.二阶段提交
二阶段提交描述:在对应的Redo日志记录上打上prepare标记。随后会写入Binlog并执行fsync(系统调用,对Binlog执行磁盘同步),最后在Redo日志记录上打上commit标记表示记录已提交完成。
所以是binlog先落盘,redo后落盘
实例恢复:
•对于活跃状态的事务,可直接进行回滚。
•对于Prepare状态的事务,如果该事务对应的Binlog已经记录则提交,否则回滚事务。Prepare状态就是图19-4中在Redo日志中所打上的prepare标记的状态。
先落盘binlog的原因:
由于MySQL是插件式数据库,可能会同时使用多个存储引擎,像InnoDB这种存储引擎有Redo日志可以做实例恢复,但是其他的存储引擎可能没有Redo日志而就是依赖Binlog做实例恢复。那么如果先写Redo日志并打上commit标记,这时若发生宕机,使用InnoDB存储引擎就可以做实例恢复,将数据恢复过来,而其他的存储引擎由于Binlog没有写成功可能就无法恢复数据了,那么可能就会出现数据不一致的情况。所以,在MySQL中做实例恢复时会依赖Binlog,以Binlog中的内容为准。
四.sync_binlog参数
sync_binlog参数控制着二进制日志写入磁盘的过程,它的有效值为0、1、N,每个值得含义分别代表如下:
0:默认值,事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制文件。
1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作(fsync()),相当于是同步写入磁盘,不经过操作系统的缓存。
N:每写N次操作系统缓冲就执行一次刷新操作。
五.binlog的组提交
FLUSH 阶段
1) 持有Lock_log mutex [leader持有,follower等待]