checkpoint:检查点 前提:记住innodb是存储引擎级别,而binlog对应的mysql级别。所有的存储引擎都挂在mysql下,都得有binlog。 A>什么是checkpoint? 答:innodb_log_buffer_size,这是从内存里抽出来的一段。 数据更新先写在这个buffer里,然后再写到redo日志上去,其后再更新到磁盘,这里的检查点就是打个标签X,记录下重做日志缓冲在X之前的数据都 写到磁盘了(至少写到redo里了)。 B>检查点的作用? 答:在DB实例或者介质失败,innodb存储引擎会根据检查点的位置到redo日志里把检查点之后的都再重新执行一遍。 tiger底层牛角理解: { 根据第二章描述:master 主线程每秒flush redobuffer的数据到redo文件,不管是否提交,而commit那个参数是表示在事务提交后的flush操作,默认1,也 在每个事务提交时候就flush到redo文件,据第七章事务说的预写日志方式,但这些数据并未写到数据文件,所以最终的理解方式是: 在logbuffer更新,然后按照规则顺序写到redo日志文件,然后再flush到数据文件。完全可以归结的 内存更新——>>顺序写——>>随机写,当实例宕机的时候,根据redo日志文件的检查点位置把之后的重新执行(注意这里是redo日志的lsn,而不是redobuffer的lsn)。 关于checkpoint的执行,可以通过show innodb engine status \G 如下 这里理解一定要注意!!! Log sequence number 88814325029 # redo buffer 里当前最新的lsn (lsn位置在redo buffer) Log flushed up to 88814324627 # redo buffer 刷新到redo file的lsn (lsn位置在redo file) Last checkpoint at 88814324627 # data buffer 刷新到数据文件的lsn (lsn位置在数据文件) 问题:保存的lsn存在什么地方? } C>检查点什么时候执行? redo log file: A:log buffer 日志什么时候刷新? innodb 设计的数据文件是日志文件的一个冗余,所以数据在buffer里面被更新后一定先写入log 日志 脏页: A> 什么是脏页? innodb在更新数据的时候,把数据从硬盘读到内存,然后修改内存中的数据,这时内存中的数据已经和磁盘上不一致了,就是所谓的脏页。 B>脏页什么时候被flush到磁盘? log_buffer insert buffer: double write: |
|