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,读写操作不会互相阻塞
情况一: