首页 > 数据库 > Mysql > MYSQL数据库修复表损坏的常用方法

MYSQL数据库修复表损坏的常用方法

Mysql

一、问题情况

由于公司有台docker服务器的mysql实例在升级表结构时docker崩溃造成mysql不停重启,报错信息如下:

初步怀疑可能是内存不足造成了docker崩溃,造成在写入数据时中断,让mysql崩溃不停重启。

二、解决办法

1.停止mysql

2.使用myisamchk先检查和修复

命令如果找不到找一下mysql命令所在位置,一般都在同级目录下

由于myisamchk要按表检查修复而且只支持MYISAM数据引擎表,使用起来效率低,等于检查mysql的指定表文件,而且要停库所以一般不用,myisamchk还带一个自动修复参数可以写在my.cnf里启动执行

3.由于myisamchk是最老的修复方法了,我们一般还是习惯使用mysqlcheck,而且mysqlcheck必须在库运行时执行

4.如果mysqlcheck检测出InnoDB的错误会提示出来,但是无法修复,所以下来要介绍一下InnoDB数据引擎表的修复方法:

遇到innodb的错误,首先要停止mysql,然后my.cnf里加一下innodb_force_recovery,可以有效停止mysql因为innodb表损坏启动不了或者不停重启,也可以保护错误表不被写入造成更多问题,如果1不行就依次往上加最大为6

mysql正常启动以后,先找到错误表所在,错误提示:

然后尝试修复表:

如果上面复制表失败,可以尝试只复制结构,然后再尝试恢复数据

如果一上来的复制表结构和数据没能成功,还可以尝试使用.ibd恢复数据

修复操作时如果提示写入失败或者其他问题,可以尝试降低innodb_force_recovery后重启数据库修复,修复完成以后记得去掉innodb_force_recovery

上面这种InnoDB修复对索引损坏比较有效,对数据损坏可能很难修复,再专业的可能需要用到专业DBA软件和工具了,而且.ibd还需要mysql开了innodb_file_per_table = 1,每个InnoDB表会单独生成.frm和.ibd文件,如果没开只有.frm文件,数据统一写在ibdata*里,更难恢复.所以如果有备份,直接从备份里恢复损坏的表是最方便的,前提是增量数据不重要.