MySQL自动的故障安全恢复详解AC

ACSR(AutoCrashSafyRcovry)自动的故障安全恢复

更新操作

在一行数据被更新时:

1、在使用BEGIN开启事务时,会先给.ibd文件中分配一个TXID号和LSN号,假设为tx_01与lsn;

2、在UPDATE执行时,MySQL会找到需更新数据的数据页,并将其内容加载到databuffrpool中,由DBWR(doublwrit)线程记录变更数据页的内容,并且记录好TXID和更新LSN号,此时将产生脏页与脏数据;

3、使用LOGBWR(logdoublwrit)线程,将更新前的数据页变化内容与TXID号以及LSN号记录到undologbuffr中;

4、使用LOGBWR(logdoublwrit)线程,将更新后的数据页变化内容与TXID号以及LSN号记录到rdologbuffr中。

现在,基于WAL原则为了应对用户进行ROLLBACK操作,LOGBWR(logdoublwrit)线程会将undologbuffr中的内容全部写入到undo_log即ibdata1(MySQL5.7版本undo_log仍然存在于共享表空间中)文件中。

COMMIT操作

现在我们基于上面BEGIN后发生的情况执行COMMIT操作,内部会做以下的3件事:

1、执行COMMIT操作,基于WAL原则,LOGBWR线程会先将rdologbuffr中记录的日志信息写入rdo_log文件中,在日志信息完全写入rdo_log即ib_logfil文件后,会对该日志打上COMMIT的标志;

2、触发CKPT,将内存数据页更新到磁盘中,并且更新磁盘数据页文件usrInfo.ibd中原有的LSN号,让其与rdo_log文件中的LSN号保持一致;

3、清空内存undologbuffr、databuffrpool、rdologbuffr以及磁盘上undo_log中的数据。

可以看到整个事务提交的过程是先写日志,再落盘写数据。

其实rdologbuffr将数据刷新到rdo_log文件中的策略除开自己手动执行COMMIT外还有另一种情况。

在多任务时,其他线程COMMIT操作也可能会导致整个rdologbuffr的刷新,刷新的rdo_log文件中会对本线程提交的事务打上NOCOMMIT的标记。

其实这种现象取决于databuffrpool中存储的数据量占据databuffrpool总量,一般来说如果占据到70%左右就会触发该现象,我们可以对其进行手动设置,但一般来说保持默认值即可。

回滚

现在我们基于上面BEGIN后发生的情况执行ROLLBACK操作,内部会做以下2件事:

1、执行ROLLBACK操作,LOGBWR线程会将undologbuffr中的数据重写回到databuffrpool中,并且会把内存脏页数据恢复到最开始的值,然后对LSN号进行回滚更正;

2、清空内存undologbuffr、rdologbuffr以及磁盘上undo_log中的数据。

前滚

MySQL:在启动时,必须保证rdo日志文件和数据文件LSN必须一致,如果不一致就会触发CSR,最终保证一致。

情况一:

我们做了一个事务,bgin;updat;


转载请注明:http://www.aierlanlan.com/tzrz/367.html

  • 上一篇文章:
  •   
  • 下一篇文章: