前言:
瞎写了一阵子gbdb,发现问题很多,瞅着时间看了下innodb的代码。主要是缓存池和mtr部分。
记录:
buffer_pool 初始化过程 开辟内存空间block 绑定 frame(包含页方法) 由于开辟的空间是连续的所以可以通过block的内存空间指针来寻址,然后查找对应的frame就能拿到页的信息(学到了…之前一直还在传递页和space的属性)。
mtr部分,mtr是最小的物理事务保证,之前对这个的理解有些模糊,自己想了一阵子现在明白了些,书上写到一个逻辑事务可能包含多个物理事务,比如插入一条数据可能有多个mtr产生,mtr从redo_buffer刷入时间是不同的,一个逻辑事务的完成是靠undo_log的记录来溯回状态的,也就说一条逻辑事务没有必要一次性刷盘,如果分开刷盘也会可以的。
逻辑事务完成要求的一次性刷盘是为了保证记录事务状态的undolog的redolog刷盘,这时事务才是完成的,此时这条逻辑事务才算结束。如果不要求(innodb_flush_log_at_trx_commit=0 ps:逻辑事务提交返回成功 由系统每秒刷盘) 注意这个选项,如果系统崩溃可能丢失的是本次事务1秒内的,如果这条逻辑事务产生的物理事务mtr 有 1,2,3 条,再上一次刷盘时机 1,2 已经被刷入。那么系统恢复时根据undolog判定的状态为正在进行,就直接回滚了(恢复过程中已经刷盘的1,2 是会被载入的)。