分享

理解mysql innodb的一些概念

 王老虎888 2013-10-30
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:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多