杰奇1.7所用MySql5.5数据表结构受损后的修复

MySql数据表结构受损后,可能会出现如下错误提示

1 、当在从表中选择数据时:Incorrect key file for table: ‘…’. Try to repair it
2 、查询不到数据。(我就是在打开网站后发现书籍数据显示正常而章节数据报错,才开始排查。最后发现是jieqi_article_chapter受损)
3 、打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) (这个提示是使用navicat打开表时,看到的错误消息)

那么什么情况会导致数据表结构受损呢?

1、 服务器突然断电导致数据文件损坏。 (强制关机就属此类故障。尤其是使用IPMI直接重启服务器)
2、 磁盘故障。 (磁盘读写出现故障而导致数据库写入异常)
3、 mysql 本身的bug 。(现在基本使用的都是稳定版本的MySql,所以此类故障应很少见)

该如何修复受损的MySql表呢?以下分三个阶段来分步介绍

第一阶段 检查哪些表受损

开始→运行→cmd→确定。


停止Mysql服务,命令行输入 net stop mysql 回车

或者在宝塔面板 → 环境 → 停止Mysql服务

进入你的mysql目录的bin目录,此处以宝塔面板所安装的Mysql5.5举例【数据库所在目录为D:\btsoft\websoft\mysql\mysql5.5\data\数据库名】

运行如下命令

1
myisamchk -s ../data/book/*.myi

上面的命令解释为:
myisamchk mysql自带的数据库检查修复工具
参数 -s 为静默扫描,只有发现错误的时候才会返回错误信息
数据库目录 相对路径或绝对路径都可以,最后为所有数据表文件或指明某一单独数据表文件。

如果此命令执行完,没有任何反馈信息,说明mysql的自查一切正常。
否则,会给出ERROR 在 哪个表的 多少行,因为遇到一次修复成功后,在本地机器没能复现,所以这里截图空缺。
只要你看到了如上错误信息,那么就需要转入第二阶段了。

第二阶段 单一数据表简单修复

继续在命令行窗口执行

1
myisamchk -r ../data/book/jieqi_article_chapter.myi

修复章节表,这里修复工具开始逐行扫描并修复。以我站1000余万章节近800M的chapter表为例,扫描并修复所耗时间约5分钟。
修复结束后,再次执行如下命令复查

1
myisamchk -s ../data/book/jieqi_article_chapter.myi

如果没有任何提示,那么就修复结束。否则就需要进入第三阶段了。

第三阶段 单一数据表困难修复

继续在命令行窗口执行

1
myisamchk -o ../data/book/jieqi_article_chapter.myi

此种修复模式据说很慢,因为我的数据表还没损坏到这种程度,所以具体耗时多少还真的不知道。

以杰奇这种千八百万的小数据表来说,基本到第二阶段一个 -r 就可以解决所有问题了。

PS:需要补充说明一下,MySql数据库在硬盘上的储存格式,数据库名为目录,数据表为一个.MYI文件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注