周末自用的EXSI服务器因电源问题导致硬盘故障,换了新盘之后,开机发现JIRA服务器的数据库断电的时候,有个事务没做完就断电了,正常情况下再次启动数据库的时候,会进行事务恢复,但是,好巧不巧有个表的 page 坏了,重做事务的时候做不了。
官方的意思:大概是没救了!只能导出数据重新安装,问题是已经无法正常启动了,MySQLDump无法备份;
解决步骤
1、为了减少对数据库造成更大的损耗,彻底停止数据库;
[root@houyuxi]# systemctl stop mysqld
2、编辑MySQL的配置文件并在配置文件中的[mysqld]中添加:innodb_force_recovery = 6,将MySQL启动模式修改为只读,
[root@houyuxi]# vim /etc/my.cnf.d/mysql.server.cnf
[mysqld]
innodb_force_recovery = 6
3、重新启动MySQL数据库
[root@houyuxi]# systemctl start mysqld
4、使用MySQLDump导出你需要的库
[root@houyuxi]# mysqldump -uroot -p密码 [database name] > [dump file]
5、重新安装数据库;
6、导入备份的数据库
[root@houyuxi]# mysqldump -uroot -p密码 [database name] < [dump file]
innodb_force_recovery参数说明
innodb_force_recovery影响整个InnoDB存储引擎的恢复状况,默认值为0,表示当需要恢复时执行所有的恢复操作!!
当不能进行有效的恢复操作时,Mysql有可能无法启动,并记录下错误日志。
innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。
当该参数的数值设置大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。
innodb_force_recovery=0 表示当需要恢复时执行所有的恢复操作;
innodb_force_recovery=1 表示忽略检查到的corrupt页;
innodb_force_recovery=2 表示阻止主线程的运行,如主线程需要执行full purge操作,会导致crash;
innodb_force_recovery=3 表示不执行事务回滚操作;
innodb_force_recovery=4 表示不执行插入缓冲的合并操作;
innodb_force_recovery=5 表示不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交;
innodb_force_recovery=6 表示不执行前滚的操作,强制重启!
在主从库出现这种情况时,如果配置文件里之前就有这个参数,则尝试将该参数值修改为0或6,依次尝试重启。