redo日志位置:

  内存数据页变化日志

  iblogfile0, iblogfile1

redo buffer:

  redo 缓冲区

  redo的buffer:数据页的变化信息+数据页当时的LSN号+TXID号

redo的刷写策略:

  commit;

  刷新当前事务的redo buffer到磁盘

  还会顺便将一部分redo buffer 中没有提交的事务日志页刷新到磁盘

 

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

CSR: 就是将redo log里记录了的数据变化,而磁盘里没有刷写进去的数据,提取到内存重做脏页然后刷写到磁盘,从而达到redo log和数据页的LSN号一致。

情况一:

  

 

 

 

  我们做了一个事务,begin, update, commit;

  1、在begin后,会立即生成一个TXID,假设TXID=T01

  2、update时,会将需要修改的数据页(dp_01/ LSN=101),加载到data buffer中

  3、DBWR线程,会进行dp_01数据页修改更新,并更新dp_01/LSN=102

  4、LOGBWR日志写线程,会将dp_01数据页的变化+LSN+TXID 存储到redo buffer

  5、执行commit 时,LGWR日志写线程会将redo buffer 信息写入red log日志文件中,基于WAL原则(日志优先写)

  6、假设此时宕机,内存脏页没有来得及写入磁盘,内存数据全部丢失

  7、MYSQL再次启动时,必须要redo log 和磁盘数据页的LSN是一致的,

     但是此时dp_01, TXID的磁盘LSN=101,dp_01/TXID=T01。

     而redo log中的LSN=102

  8、MYSQL此时无法正常启动,mysql触发CSR,在内存追平LSN号,触发ckpt,

     将内存数据页更新到磁盘,从而保证磁盘数据页和redo log的LSN号是一致的,这时MYSQL才会正常启动

  以上的工作过程,我们把它称之为基于REDO的‘前滚过程’(重做日志)

 

-----------------------------------------------------------------------------------------------------------------------------

undo

作用:

  在ACID特性中,主要保证A的特征,同时对CI也有一定功效

  (1) 记录了数据修改之前的状态

  (2) rollback 将内存的数据恢复到修改之前

  (3) 在CSR中实现未commit数据的归滚操作

  (4) 实现一致性快照,保证MVCC,读写操作不会互相阻塞

情况一: