InnoDB存储引擎是MySQL的存储引擎之一,因此InnoDB存储引擎的启动和关闭更准确地是指在MySQL实例的启动过程中对InnoDB表存储引擎的处理过程。

参数innodb_fast_shutdown

在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、1、2。

  1. 0代表当MySQL关闭时,InnoDB需要完成所有的full purge和merge insert buffer操作,这会需要一些时间,有时甚至需要几个小时来完成。如果在做InnoDB plugin升级,通常需要将这个参数调为0,然后再关闭数据库。
  2. 1是该参数的默认值,表示不需要完成上述的full purge和merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。
  3. 2表示不完成full purge和merge insert buffer操作,也不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事务会丢失,但是MySQL数据库下次启动时,会执行恢复操作(recovery)。

当正常关闭MySQL数据库时,下一次启动应该会很正常。但是,如果没有正常地关闭数据库,如用kill命令关闭数据库,在MySQL数据库运行过程中重启了服务器,或者在关闭数据库时将参数innodb_fast_shutdown设为了2,MySQL数据库下次启动时都会对InnoDB存储引擎的表执行恢复操作。

参数innodb_force_recovery

参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况。该值默认为0,表示当需要恢复时执行所有的恢复操作。当不能进行有效恢复时,如数据页发生了corruption,MySQL数据库可能会宕机,并把错误写入错误日志中。

但是,在某些情况下,我们可能并不需要执行完整的恢复操作,我们自己知道如何进行恢复。比如正在对一个表执行alter table操作,这时意外发生了,数据库重启时会对InnoDB表执行回滚操作。对于一个大表,这需要很长时间,甚至可能是几个小时。这时我们可以自行进行恢复,例如可以把表删除,从备份中重新将数据导入表中,这些操作的速度可能要远远快于回滚操作。

innodb_force_recovery还可以设置为6个非零值:1~6。大的数字包含了前面所有小数字的影响,具体情况如下。

  • 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):不执行前滚的操作。

需要注意的是,当设置参数innodb_force_recovery大于0后,可以对表进行select、create、drop操作,但insert、update或者delete这类操作是不允许的。

模拟故障

我们来做个实验,模拟故障的发生。在第一会话中,对一张接近1 000W行的InnoDB存储引擎表执行更新操作,但是完成后不要马上提交:

start transaction;

update Profile set password='';

--start transaction语句开启了事务,同时防止了自动提交的发生,update操作则会产生大量的回滚日志。这时,我们人为地kill掉MySQL数据库服务器。

ps-ef|grep mysqld

kill-9 pid

通过kill命令,我们人为地模拟了一次数据库宕机故障,当MySQL数据库下次启动时会对update的这个事务执行回滚操作,而这些信息都会记录在错误日志文件中,默认后缀名为err。如果查看错误日志文件,可得到如下结果:

090922 13:40:20 InnoDB:Started;log sequence number 6 2530474615
InnoDB:Starting in background the rollback of uncommitted transactions
090922 13:40:20 InnoDB:Rolling back trx with id 0 5281035,8867280 rows to undo
InnoDB:Progress in percents:1090922 13:40:20
090922 13:40:20[Note]/usr/local/mysql/bin/mysqld:ready for connections.
Version:'5.0.45-log'socket:'/tmp/mysql.sock'port:3306 MySQL Community
Server(GPL)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
InnoDB:Rolling back of trx id 0 5281035 completed
090922 13:49:21 InnoDB:Rollback of non-prepared transactions completed

可以看到,如果采用默认的策略,即把innodb_force_recovery设为0,InnoDB会在每次启动后对发生问题的表执行恢复操作,通过错误日志文件,可知这次回滚操作需要回滚8 867 280行记录,总共耗时约9分多钟。

我们做再做一次同样的测试,只不过在启动MySQL数据库前将参数innodb_force_recovery设为3,然后观察InnoDB存储引擎是否还会执行回滚操作,查看错误日志文件,可看到:

090922 14:26:23 InnoDB:Started;log sequence number 7 2253251193
InnoDB:!innodb_force_recovery is set to 3!
090922 14:26:23[Note]/usr/local/mysql/bin/mysqld:ready for connections.
Version:'5.0.45-log'socket:'/tmp/mysql.sock'port:3306 MySQL Community
Server(GPL)

这里出现了“!”,InnoDB警告你已经将innodb_force_recovery设置为3,不会进行undo的回滚操作了。因此数据库很快启动完成,但是你应该很小心当前数据库的状态,并仔细确认是否不需要回滚操作。

InnoDB的启动,关闭,恢复相关推荐

  1. 机房断电、MySQL启动失败,InnoDB数据损坏如何恢复

    概要 [问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,库表及数据重建 故障发现 周末园区断电,周一启动数据库就直接报错了: ERROR! The server ...

  2. 2. Oracle 数据库实例启动关闭过程

    转载自: http://blog.csdn.net/leshami/article/details/5542983 Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行 ...

  3. 在linux操作系统中启动oracle数据库程序,Linux系统下Oracle数据库的安装和启动关闭操作教程...

    这篇文章主要介绍了Linux系统下Oracle数据库的安装和启动关闭操作教程,并针对在sqlplus下所需执行的命令进行讲解,需要的朋友可以参考下 1.准备: df -H 查看空间剩余   一般准备最 ...

  4. Oracle 数据库实例启动关闭过程

    --================================ -->Oracle 数据库实例启动关闭过程 --================================ /* Or ...

  5. oracle ora 00283,【案例】Oracle报错ORA-16433非归档丢失redo无法启动的恢复过程

    天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle数据库处理非归档模式,redo文件损坏常规修复无法正常open数据库. 本站文章除注明转载外,均为本站原创: 转载自love wife ...

  6. Win10彻底关闭恢复功能、省流量终极设置

    Win10彻底关闭恢复功能.省流量终极设置 Win10彻底关闭恢复功能 Win10系统自带3次异常断电启动恢复选项的功能,一般情况下只要正常开机一次就可以重新计次.这里说明如何完全关闭这个功能: Wi ...

  7. mysql源码分析——InnoDB引擎启动分析

    一.InnoDB启动 在MySql中,InnoDB的启动流程其实是很重要的.一些更细节的问题,就藏在了这其中.在前面分析过整个数据库启动的流程,本篇就具体分析一下InnoDB引擎启动所做的各种动作.在 ...

  8. Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键

    Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键汇总 Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键汇总FN组合键使用方法 机型 FN+F1 FN+F2 FN+F3 ...

  9. Win10彻底关闭恢复功能,终极省流量设置

    Win10 彻底关闭恢复功能 Win10系统自带3次异常断电启动恢复选项的功能,一般情况下只要正常开机一次就可以重新计次.这里说明如何完全关闭这个功能: Win+X按键,启动 [命令行(管理员模式)] ...

最新文章

  1. Android更新带进度条的通知栏
  2. jmeter压测_jmeter压测学习2linux运行jmeter环境
  3. Android之AsyncTask源码解析
  4. Latex学习笔记0
  5. vs2013 乱码问题
  6. 【操作系统原理及Linux实践】 四cpu调度scheduling
  7. java 6 26_WebSphere7.0 Java6.26安装
  8. 数据库 / 事务的隔离级别
  9. php+mysql+into_PHP+Mysql 如何实现数据库增删改查
  10. 转载 - 最近对问题
  11. 2021-2025年中国灯光调光开关行业市场供需与战略研究报告
  12. c语言 单片机模拟,【51单片机】普通I/O口模拟SPI口C语言程序
  13. 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
  14. 可视化技巧:DataFrame画图并利用matplotlib保存(pandas)
  15. 磁盘不见了只剩一个c盘_极简后,我家只剩一个垃圾桶
  16. Java_实现身份证信息提取个人信息
  17. c#线程-线程间发消息-线程给窗体传值
  18. 墨者学院-登录密码重置漏洞分析溯源
  19. 【inline、inline-block间的空隙】
  20. android 使用epublib开源框架解析epub文件(章节内容、书籍菜单)

热门文章

  1. Android APK反编译详解(附图)
  2. java image filters[02]-过滤器初探
  3. 假装不知道有尽头(博弈论的诡计)
  4. 沃尔沃加入英伟达阵营 2021年开卖自动驾驶汽车
  5. Ubuntu Server 12.04下cobbler + dnsmasq +tftpd-hpa的安装配置(四)
  6. 聊天机器人革命即将到来 开发者入局需谨慎
  7. 软件定义光网络-SDON
  8. 一个苹果手机移动电源也能让他拽得跟二五八万似的
  9. 查询XML节点 value
  10. CCNA的一个综合实验(经典)