1,Write Ahead Log
页每一次发生的变化,都将新页的版本刷新到磁盘会导致IO次数增多,影响数据库的性能,所以引入了缓存的概念。
但是数据的修改都存入到缓存中也会有以下几个问题:
I. 缓冲池需要足够的大缓存数据库中的所有数据,内存的开销大大增多
II. 机器宕机时,会导致数据的丢失
Write Ahead Log的策略就是当事务提交的时候,先写重做日志,然后再修改页。
2,CheckPoint
做日志能够有效的防止宕机时数据丢失的问题,但是并不是每次都要将重做日志中的所有非select语句都执行一次,
数据量大的时候,数据恢复的时间与成本也会变得越来越高
重做日志的checkPoint技术
对于checkpoint之前的页都已经刷新到了磁盘中,所以当下一次重做日志读取恢复的时候,只会执行checkPoint之后的数据
重做日志对于物理存储的压力问题,checkpoint之前的数据,在配置的时间范围之外,进行新的重做日志复盖,保证物理磁盘
占用不会过高,资源的重复使用。
优势:
1,缩短数据库的恢复时间
2,缓冲池不够用时,可以将脏页刷新到磁盘,减轻缓冲池的压力
3,重做日志不可用时,刷新脏页
3,Sharp Checkpoint & Fuzzy Checkpoint
Sharp Checkpoint:
发生在数据库关闭时,会将所有的脏页都刷新到磁盘,默认的工作方式,配置参数 innodb_fast_shutdown = 1
Fuzzy Checkpoint:
对于特定的缓冲池与后台线程场景应用:
1,Master Thread Checkpoint:
对于Master Thread中的Checkpoint,差不多以每十秒的速度从缓冲池中的脏页列表中刷新一定比例的页回磁盘(异步)
2,Flush_LRU_LIST Checkpoint:
InnoDB有需要保证LRU列表中有超过100个空闲页可以提供使用,当不满足时,从LRU列表的尾端删除,但是只对脏页数据
进行刷新到磁盘,其它作为非热点数据从缓冲池中消除
3,Async/Sync Flush Checkpoint:
重做日志不可用时(重做日志的大小超过某个设定的阈值发生告警时),强制将一些页异步刷新回磁盘。
两个参数:sync_water_mark & async_water_mark
默认情况下: sync_water_mark = 90% * total_redo_log_file
async_water_mark = 75% * total_redo_log_file
I. checkpoint_age < async_water_mark 不刷新任何脏页到磁盘
II. async_water_mark< checkpoint_age < sync_water_mark 刷新脏页到磁盘,直到满足 checkpoint_age < async_water_mark
III. sync_water_mark < checkpoint_age一般不会出现该情况,除非写入远远的大于刷新,一般是设置的重做日志大小过小才会导致,同II
刷新到满足checkpoint_age < async_water_mark
4,Dirty Page too much Checkpoint:
脏页的数量过多,超过了配置的阈值,强制执行的刷新。阈值控制参数:innodb_max_dirty_pages_pct,默认情况是75(75%)
--相关命令
查看innodb_max_dirty_pages_pct配置参数百分比: show variables like 'innodb_max_dirty_pages_pct'