Mysql中,在log buffer中但未刷到磁盘的日志称为脏日志(dirty log)。默认情况下进行事务处理的时候每次提交事务都会刷事务日志到磁盘中,这是因为变量 innodb_flush_log_at_trx_commit 的值为1。innodb在有commit动作后刷日志到磁盘只是innodb存储引擎刷日志的规则之一。Mysql日志什么时候还会刷到磁盘呢?有以下规则:本文地址:http://www.04007.cn/article/795.html,未经许可,不得转载.
1.发出commit动作。commit发出后是否刷日志由变量 innodb_flush_log_at_trx_commit 控制。
2.几秒刷一次。这个刷日志的频率由变量 innodb_flush_log_at_timeout 值决定,默认是1秒。要注意这个和commit动作无关。
3.当log buffer中已经使用的内存超过一半时。
4.当有checkpoint时,checkpoint在一定程度上代表了刷到磁盘时日志所处的LSN位置。本文地址:http://www.04007.cn/article/795.html,未经许可,不得转载.
什么是checkpoint?checkpoint是检查点的意思,我理解checkpoint检查点就是标记重做日志中已经完成刷到磁盘的位置点,如果缓冲池中有很多重做日志,完全恢复需要1分钟,checkpoint可能标记到了第58秒的位置,这时数据库恢复只需要重做最后2秒里的数据日志,Checkpoint缩短了数据库的恢复时间。本文地址:http://www.04007.cn/article/795.html,未经许可,不得转载.
由于数据和日志都以页的形式存在,所以脏页表示脏数据和脏日志。不仅仅是日志需要刷盘,脏数据页也一样需要刷盘。在innodb中,数据刷盘的规则只有一个:checkpoint。但是触发checkpoint的情况却有几种。不管怎样,checkpoint触发后,会将buffer中脏数据页和脏日志页都刷到磁盘。本文地址:http://www.04007.cn/article/795.html,未经许可,不得转载.
innodb存储引擎中checkpoint分为两种:
sharp checkpoint:在重用redo log文件(例如切换日志文件)的时候,将所有已记录到redo log中对应的脏数据刷到磁盘。
fuzzy checkpoint:一次只刷一小部分的日志到磁盘,而非将所有脏日志刷盘。有以下几种情况会触发该检查点:
master thread checkpoint:由master线程控制,每秒或每10秒刷入一定比例的脏页到磁盘。
flush_lru_list checkpoint:从MySQL5.6开始可通过 innodb_page_cleaners 变量指定专门负责脏页刷盘的page cleaner线程的个数,该线程的目的是为了保证lru列表有可用的空闲页。
async/sync flush checkpoint:同步刷盘还是异步刷盘。例如还有非常多的脏页没刷到磁盘(非常多是多少,有比例控制),这时候会选择同步刷到磁盘,但这很少出现;如果脏页不是很多,可以选择异步刷到磁盘,如果脏页很少,可以暂时不刷脏页到磁盘
dirty page too much checkpoint:脏页太多时强制触发检查点,目的是为了保证缓存有足够的空闲空间。too much的比例由变量 innodb_max_dirty_pages_pct 控制,MySQL 5.6默认的值为75,即当脏页占缓冲池的百分之75后,就强制刷一部分脏页到磁盘。
由于刷脏页需要一定的时间来完成,所以记录检查点的位置是在每次刷盘结束之后才在redo log中标记的。MySQL停止时是否将脏数据和脏日志刷入磁盘,由变量innodb_fast_shutdown={ 0|1|2 }控制,默认值为1,即停止时只做一部分purge,忽略大多数flush操作(但至少会刷日志),在下次启动的时候再flush剩余的内容,实现fast shutdown。本文地址:http://www.04007.cn/article/795.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/795.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |