InnoDB的启动,关闭,恢复
InnoDB存储引擎是MySQL的存储引擎之一,因此InnoDB存储引擎的启动和关闭更准确地是指在MySQL实例的启动过程中对InnoDB表存储引擎的处理过程。
参数innodb_fast_shutdown
在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、1、2。
- 0代表当MySQL关闭时,InnoDB需要完成所有的full purge和merge insert buffer操作,这会需要一些时间,有时甚至需要几个小时来完成。如果在做InnoDB plugin升级,通常需要将这个参数调为0,然后再关闭数据库。
- 1是该参数的默认值,表示不需要完成上述的full purge和merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。
- 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的启动,关闭,恢复相关推荐
- 机房断电、MySQL启动失败,InnoDB数据损坏如何恢复
概要 [问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,库表及数据重建 故障发现 周末园区断电,周一启动数据库就直接报错了: ERROR! The server ...
- 2. Oracle 数据库实例启动关闭过程
转载自: http://blog.csdn.net/leshami/article/details/5542983 Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行 ...
- 在linux操作系统中启动oracle数据库程序,Linux系统下Oracle数据库的安装和启动关闭操作教程...
这篇文章主要介绍了Linux系统下Oracle数据库的安装和启动关闭操作教程,并针对在sqlplus下所需执行的命令进行讲解,需要的朋友可以参考下 1.准备: df -H 查看空间剩余 一般准备最 ...
- Oracle 数据库实例启动关闭过程
--================================ -->Oracle 数据库实例启动关闭过程 --================================ /* Or ...
- oracle ora 00283,【案例】Oracle报错ORA-16433非归档丢失redo无法启动的恢复过程
天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle数据库处理非归档模式,redo文件损坏常规修复无法正常open数据库. 本站文章除注明转载外,均为本站原创: 转载自love wife ...
- Win10彻底关闭恢复功能、省流量终极设置
Win10彻底关闭恢复功能.省流量终极设置 Win10彻底关闭恢复功能 Win10系统自带3次异常断电启动恢复选项的功能,一般情况下只要正常开机一次就可以重新计次.这里说明如何完全关闭这个功能: Wi ...
- mysql源码分析——InnoDB引擎启动分析
一.InnoDB启动 在MySql中,InnoDB的启动流程其实是很重要的.一些更细节的问题,就藏在了这其中.在前面分析过整个数据库启动的流程,本篇就具体分析一下InnoDB引擎启动所做的各种动作.在 ...
- Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键
Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键汇总 Lenovo笔记本(FN/无线/蓝牙/光驱启动/一键恢复)快捷键汇总FN组合键使用方法 机型 FN+F1 FN+F2 FN+F3 ...
- Win10彻底关闭恢复功能,终极省流量设置
Win10 彻底关闭恢复功能 Win10系统自带3次异常断电启动恢复选项的功能,一般情况下只要正常开机一次就可以重新计次.这里说明如何完全关闭这个功能: Win+X按键,启动 [命令行(管理员模式)] ...
最新文章
- Android更新带进度条的通知栏
- jmeter压测_jmeter压测学习2linux运行jmeter环境
- Android之AsyncTask源码解析
- Latex学习笔记0
- vs2013 乱码问题
- 【操作系统原理及Linux实践】 四cpu调度scheduling
- java 6 26_WebSphere7.0 Java6.26安装
- 数据库 / 事务的隔离级别
- php+mysql+into_PHP+Mysql 如何实现数据库增删改查
- 转载 - 最近对问题
- 2021-2025年中国灯光调光开关行业市场供需与战略研究报告
- c语言 单片机模拟,【51单片机】普通I/O口模拟SPI口C语言程序
- 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
- 可视化技巧:DataFrame画图并利用matplotlib保存(pandas)
- 磁盘不见了只剩一个c盘_极简后,我家只剩一个垃圾桶
- Java_实现身份证信息提取个人信息
- c#线程-线程间发消息-线程给窗体传值
- 墨者学院-登录密码重置漏洞分析溯源
- 【inline、inline-block间的空隙】
- android 使用epublib开源框架解析epub文件(章节内容、书籍菜单)