InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性:
- 插入缓冲(Insert Buffer)
- 两次写(Double Write)
- 自适应哈希索引(Adaptive Hash Index)
- 异步IO(Async IO)
- 刷新邻接页(Flush Neighbor Page)
刷新邻接页
InnoDB存储引擎还提供了Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。
有两个问题:
1)是不是可能将不怎么脏的页进行了写入,而该页之后又会 很快变成脏页?
2)固态硬盘有着较高的IOPS,是否还需要这个特性?
所以,InnoDB1.2.x版本开始提供了参数innodb_flush_neighbors,用来控制是否启用该特性。对于传统机械硬盘建议启用该特性,而对于固态硬盘有着较高的IOPS性能的磁盘,则建议将该参数设置为0,即关闭该特性。
启动、关闭和恢复
InnoDB存储引擎是MySql数据库的存储引擎之一,因此InnoDB存储引擎的启动和关闭,或者说MySql数据库服务器的启动和关闭过程对InnoDB存储引擎的处理过程。
在关闭时,参数 innodb_fast_shutdown影响着表的InnoDB存储引擎的行为,该参数可以为0,1,2,默认值为1;
mysql> show variables like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1 |
+----------------------+-------+
1 row in set (0.00 sec)
(1)为0时,表示在MySql数据库关闭时,InnoDB需要完成所有的full purge和merge insert buffer,并且将所有的脏页刷新回磁盘。这需要一些时间,有时甚至需要几个小时来完成。如果在进行InnoDB升级时,必须将这个参数设置为0,然后再关闭数据库。
(2)1是参数 innodb_fast_shutdown的默认值,表示不需要完成上述的full purge和merge insert buffer操作,但是在缓冲池中的一些数据脏页还是会刷新回磁盘。
(3)2表示不完成full purge和merge insert buffer操作,也不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事务的丢失,但是下次MySql数据库启动时,会进行恢复操作。
当正常关闭MySql数据库时,下次的启动应该会非常正常。但是如果没有正常地关闭数据库,如用kill命令关闭数据库,在MySql数据库运行中重启了服务器,或者在关闭数据库时,将参数innodb_fast_shutdown设置为了2,下次MySql数据库启动时都会对InnoDB存储引擎的表进行恢复操作。
参数innodb_force_recovery影响了整个InnoDB存储引擎恢复的状态。该参数默认值为0,表示当发生需要恢复时,进行所有的恢复操作,当不能进行有效恢复时,如数据页发生了corruption,MySql数据库可能发生宕机(crash),并把错误写入错误日志中去。
mysql> show variables like 'innodb_force_recovery';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_force_recovery | 0 |
+-----------------------+-------+
1 row in set (0.00 sec)
某些情况下,可能并不需要进行完整的恢复操作,因为用户自己知道怎么进行恢复。比如在对一个表进行alter table操作时发生了意外,数据库重启时会对InnoDB表进行回滚操作,对于一个大表来说这需要很长时间,可能是几个小时。这时用户可以自行进行恢复,如可以把表删除,从备份中重新导入数据到表,可能这些操作的速度要远远快于回滚操作。
参数innodb_force_recovery还可以设置为6个非零值:1-6,大的数字表示包含了前面所有小数字表示的影响。具体情况如下:
1:忽略检查到的corrupt页。
2:阻止Master Thread线程的运行,如Master Thread线程需要进行full purge,而这会导致crash。
3:不进行事务的回滚操作。
4:不进行插入缓冲的合并操作。
5:不查看撤销日志(Undo Log),InnoDB存储引擎会将未提交的事务视为已提交。
6:不进行前滚的操作。
参数innodb_force_recovery的值大于0时,可以对表进行select,creaete和drop操作,但是insert,update和delete这类DML操作是不允许的。
参考链接:https://blog.csdn.net/linux_ever/article/details/62045117