Mysql之InnoDB存储引擎详解
时间:2016-02-28 22:18 来源:linux.it.net.cn 作者:IT
概述
后台线程
默认情况下InnoDB存储引擎的后台线程有7个---------4个IO thread, 1个master thread ,1个锁(lock) 监控线程,1个错误监控线程。
IO thread的数量由配置文件中的innodb_file_io_threads参数控制,默认
内存
由缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool)
内存结构如下图:
日志缓存将重做日志信息先放人这个缓冲区、然后按一定频率将其刷新到重做日志文件。
master thread
master thread的线程优先级别最高。其内部由几个循环loop组成:主循环loop、后台循环background loop 、刷新循环flush loop、暂停循环suspend loop
每秒一次的操作包括:
1、日志缓冲刷新到磁盘,即使这个事物还没有提交(总是)
2、合并插入缓冲(可能)
3、至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)
4、如果当前没有用户活动,InnoDB存储引擎仍然会每秒将重做日志缓冲中的内容刷新到重做日志文件。(这一点必须知道的,这可以很好的理解为什么再大的事物commit的时间也是很快的)
每10秒的操作包括:
刷新100个脏页到磁盘(可能)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的Undo页(总是)
刷新100个或者10个脏页到磁盘(总是)
产生一个检查点(总是)
注:在以上的过程中,InnoDB存储引擎会先判断过去10秒之内磁盘的IO操作是否小于200次。如果是,InnoDB存储引擎认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。接着,会合并插入缓冲。 接着回指向一部full purge操作,即删除无用的Undo页。对表执行update,delete这类操作时,原先的行被标记为删除,但因为一致性读(consistent read)的关系,需要保留这些行版本的信息。但是full purge过程中,会判断当前事物系统中已删除的行是否可以删除。
比如有时候可能还有查询操作需要读取之前版本的Undo信息,如果可以,InnoDB会立即将其删除。
关键特性
插入缓冲
插入缓冲的使用需要满足下面2个条件:
1、索引是辅助索引
2、索引不是唯一的
当满足上述条件时,InnoDB存储引擎会使用插入缓冲,这样就能提高性能了
两次写
如果说插入缓冲带给InnoDB存储引擎的是性能,那么两次写带给InnoDB的是数据的可靠性。当数据库脱机时,可能发生数据库正在写一个页面,而这个页只写了一部分(比如16K的页,只写了前4K的页)的情况,我们称之为部分写失败。
在应用重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,在进行重做,这就是doublewrite。
doublewrite由两部分组成:一部分是内存中的doublewrite buffer,大小2MB;另一部分是物理磁盘上的共享表中连接的128个页。即两个区extent。
当缓冲池的脏页刷新时,并不直接写磁盘,而是会通过memcapy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次写入1MB到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中。
启用、关闭、恢复
在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。
该参数取值为0,、1、2
0 代表党MySql关闭时,InnoDB需要完成所有的full purge 和 merge insert buffer操作,这会需要一些时间。
1 代表不需要完成上述的full purge ,merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。
2 代表不完成full purge ,merge insert buffer操作,也 不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事物会丢失,但是Mysql数据库下次启动时,会执行recovery
参数Innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况。默认0
表示当需要恢复时执行所有的恢复操作。当不能进行有效恢复时,如数据页发生了corruption,MySql数据库可能会,并把错误写入错误日志中。
1 SRV_FORCE_IGNORE_CORRUPT:忽略检查到的corrupt页
2 SRV_FORCE_NO_BACKGROUND:阻止主线程的运行,如主线程需要执行 full purge操作,会导致crash
3 SRV_FORCE_NO_TRX_UNDO :不执行事务回滚操作。
4 SRV_FORCE_NO_IBUF_MERGE :不执行插入缓冲的合并操作
5 SRV_FORCE_NO_UNDO_LOG_SCAN:不插卡撤销日志Undo log InnoDB存储引擎会将未提交的事务视为已提交。
6 SRV_FORCE_NO_LOG_REDO:不执行前滚的操作
注:当参数大于0后,可以对表进行select,create,drop等操作,但insert,update或者delete这类操作是不允许的。
PS: 详情参考Inside MySQL : InnoDB Storage Engine
(责任编辑:IT)
概述后台线程
默认情况下InnoDB存储引擎的后台线程有7个---------4个IO thread, 1个master thread ,1个锁(lock) 监控线程,1个错误监控线程。
IO thread的数量由配置文件中的innodb_file_io_threads参数控制,默认
内存
由缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool)
内存结构如下图:
日志缓存将重做日志信息先放人这个缓冲区、然后按一定频率将其刷新到重做日志文件。
master thread
master thread的线程优先级别最高。其内部由几个循环loop组成:主循环loop、后台循环background loop 、刷新循环flush loop、暂停循环suspend loop
每秒一次的操作包括:
1、日志缓冲刷新到磁盘,即使这个事物还没有提交(总是)
2、合并插入缓冲(可能)
3、至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)
4、如果当前没有用户活动,InnoDB存储引擎仍然会每秒将重做日志缓冲中的内容刷新到重做日志文件。(这一点必须知道的,这可以很好的理解为什么再大的事物commit的时间也是很快的)
每10秒的操作包括:
刷新100个脏页到磁盘(可能)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的Undo页(总是)
刷新100个或者10个脏页到磁盘(总是)
产生一个检查点(总是)
注:在以上的过程中,InnoDB存储引擎会先判断过去10秒之内磁盘的IO操作是否小于200次。如果是,InnoDB存储引擎认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。接着,会合并插入缓冲。 接着回指向一部full purge操作,即删除无用的Undo页。对表执行update,delete这类操作时,原先的行被标记为删除,但因为一致性读(consistent read)的关系,需要保留这些行版本的信息。但是full purge过程中,会判断当前事物系统中已删除的行是否可以删除。
比如有时候可能还有查询操作需要读取之前版本的Undo信息,如果可以,InnoDB会立即将其删除。
关键特性插入缓冲
插入缓冲的使用需要满足下面2个条件:
1、索引是辅助索引
2、索引不是唯一的
当满足上述条件时,InnoDB存储引擎会使用插入缓冲,这样就能提高性能了
两次写
如果说插入缓冲带给InnoDB存储引擎的是性能,那么两次写带给InnoDB的是数据的可靠性。当数据库脱机时,可能发生数据库正在写一个页面,而这个页只写了一部分(比如16K的页,只写了前4K的页)的情况,我们称之为部分写失败。
在应用重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,在进行重做,这就是doublewrite。
doublewrite由两部分组成:一部分是内存中的doublewrite buffer,大小2MB;另一部分是物理磁盘上的共享表中连接的128个页。即两个区extent。
当缓冲池的脏页刷新时,并不直接写磁盘,而是会通过memcapy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次写入1MB到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中。
启用、关闭、恢复
在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。
该参数取值为0,、1、2
0 代表党MySql关闭时,InnoDB需要完成所有的full purge 和 merge insert buffer操作,这会需要一些时间。
1 代表不需要完成上述的full purge ,merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。
2 代表不完成full purge ,merge insert buffer操作,也 不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事物会丢失,但是Mysql数据库下次启动时,会执行recovery
参数Innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况。默认0
表示当需要恢复时执行所有的恢复操作。当不能进行有效恢复时,如数据页发生了corruption,MySql数据库可能会,并把错误写入错误日志中。
1 SRV_FORCE_IGNORE_CORRUPT:忽略检查到的corrupt页
2 SRV_FORCE_NO_BACKGROUND:阻止主线程的运行,如主线程需要执行 full purge操作,会导致crash
3 SRV_FORCE_NO_TRX_UNDO :不执行事务回滚操作。
4 SRV_FORCE_NO_IBUF_MERGE :不执行插入缓冲的合并操作
5 SRV_FORCE_NO_UNDO_LOG_SCAN:不插卡撤销日志Undo log InnoDB存储引擎会将未提交的事务视为已提交。
6 SRV_FORCE_NO_LOG_REDO:不执行前滚的操作
注:当参数大于0后,可以对表进行select,create,drop等操作,但insert,update或者delete这类操作是不允许的。
PS: 详情参考Inside MySQL : InnoDB Storage Engine
(责任编辑:IT) |