记一次断电导致mysql崩溃的恢复办法
异常断电导致mysql库表损坏,并且在/etc/my.cnf配置文件中添加innodb_force_revocery=1到6均无法启动
此方法会导致存储过程、函数丢失,谨慎操作。
此方法会导致存储过程、函数丢失,谨慎操作。
此方法会导致存储过程、函数丢失,谨慎操作。
解决步骤如下:
1、进入目录/var/lib/mysql 移动此下所有数据库目录和ibdata1文件到其他目录进行备份 ,不需要备份mysql、sys、performance_schema、information_schema四个目录
2、删除rm -rf /var/lib/mysql
3、启动systecmctl start mysqld 此时数据库会重新初始化,并生成 /var/lib/mysql 和新的数据库密码,使用/var/log/mysqld.log中的新密码登录数据库,修改密码
ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘MyNewPass4!’;
4、退出并关闭数据库systecmctl stop mysqld
5、删除rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_log*
6、将备份的数据库目录和ibdata1文件移动到/var/lib/mysql/ 下
7、启动数据库systecmctl start mysqld ,注意配置文件/etc/my.cnf中不要添加innodb_force_revocery参数,此时数据库启动日志中会提示有损坏库表需要修复,不用管,等待启动即可。
8、开始修复损坏的表
执行修复数据库命令mysqlcheck -uroot -p -r --databases 数据库名,此时注意观察日志/var/lib/mysqld.log一旦出现重启或乱码报错,查看乱码的前两行,会显示表名称,将其记录下来,再在/etc/my.cnf配置文件中添加innodb_force_revocery=1,重启数据库进入导出该表后删除。去掉配置文件中的innodb_force_revocery=1,再次重启后进入数据库导入删除的表。反复执行此步骤直至mysqlcheck数据库不在重启和报错。
其他说明:
第8步是使用mysqlcheck检查修复一遍所有的库表。也可通过其他方式,例如一张表一张表的打开或者select,出现错误时再通过单独将表导出、删除、再导入来修复。