共计 3327 个字符,预计需要花费 9 分钟才能阅读完成。
如何进行 MySQL 修复表的简单分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
今天有个同事问我一个数据库的问题,如果开始他就把环境细节全都告诉我,可能我就知难而退了。等我大体明白了问题之后,发现好像背景比我想的要复杂多了。这是一个远程云主机环境,windows 系统,运行着 MySQL, 在查询表时出现了问题,而且开发同事经过了 repair 也没有修复,说会卡住没有响应。
当然费了一点功夫,好容易连接到了这台云主机,发现问题似乎比我想的还要复杂一些。当然这是一个内部某一个团队使用的一个环境,可能是确实需要用到环境,大家才不得不想办法修复。
环境是 MySQL 5.5 版本,查看后台日志发现从 8 月份就开始有错误了,错误信息如下:
161018 11:15:35 [ERROR] D:\websoft\mysql\bin\mysqld: Table .\utestdb\test_forum_post is marked as crashed and should be repaired
161018 11:15:36 [ERROR] D:\websoft\mysql\bin\mysqld: Table .\utestdb\test_forum_post is marked as crashed and should be repaired 而且看日志损坏的还不止一张表,我的注意力暂时先放在了出错的表上。
如果使用 show create table test_forum_post 或者 desc test_forum_post 都会抛出错误。
mysql show create table test_forum_post;
ERROR 145 (HY000): Table .\utestdb\test_forum_post is marked as crashed and should be repaired
更让我有些胆战心惊的是,我可以从后台的日志看到开发同事也尝试了多次重启 MySQL 服务。但是问题始终存在。
show create table 得不到信息,而 show table status 得到的信息也很有限,因为此时的存储引擎显示为 NULL
他们用的是 MyISAM, 查看了其它所有的表的存储引擎,发现清一色都是 MyISAM. 所以我就可以基本断定这个出问题的表也是 MyISAM
对于 MyISAM 表修复,可以用 myisamchk 来做或者使用 repair 的方式都可以,当然发现又是碰到不少问题。
D:\websoft\mysql\bin myisamchk.exe -of ..\data\utestdb\test_forum_post.MYI
这个命令运行下去,竟然弹出了一个窗口显示程序崩溃,反复尝试都是如此。
使用 repair 命令来看,发现迟迟没有返回,果断停止。
肯定是哪里漏掉了,我重新翻过头来梳理问题。
查看日志发现之前有下面的一些输出,看起来是磁盘空间的问题。
161219 18:07:09 [Warning] Disk is full writing
.\distoon\pre_common_block.TMD (Errcode: 28). Waiting for someone to
free space… (Expect up to 60 secs delay for server to continue after
freeing disk space)
161219 18:07:09 [Warning] Retry in 60 secs. Message reprinted in 600 secs
161219 18:07:18 [ERROR] D:\websoft\mysql\bin\mysqld: Table .\utestdb\test_forum_post is marked as crashed and should be repaired
经过确认发现确实是磁盘空间导致,他们马上清理预留出一些空间,然后让我继续帮忙修复,再次尝试就没有问题了。
先使用 -of 选项
D:\websoft\mysql\bin myisamchk.exe -of ..\data\utestdb\test_forum_post.MYI
– recovering (with keycache) MyISAM-table ..\data\utestdb\test_forum_post.MYI
Data records: 0
Data records: 55311
接着使用 - r 选项修复
D:\websoft\mysql\bin myisamchk.exe -r ..\data\utestdb\test_forum_post.MYI
– recovering (with sort) MyISAM-table ..\data\utestdb\test_forum_post.MYI
Data records: 55311
– Fixing index 1
– Fixing index 2
– Fixing index 3
– Fixing index 4
– Fixing index 5
– Fixing index 6
– Fixing index 7
– Fixing index 8
最后汇总检查
D:\websoft\mysql\bin myisamchk.exe ..\data\utestdb\test_forum_post.MYI
Checking MyISAM file: ..\data\utestdb\test_forum_post.MYI
Data records: 55311 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check data record references index: 2
– check data record references index: 3
– check data record references index: 4
– check data record references index: 5
– check data record references index: 6
– check data record references index: 7
– check data record references index: 8
– check record links 再次查看问题就不存在了。
当然如果尝试使用 repair 也是可行的, 比如修复表 pre_common_member,输出如下:
mysql repair table pre_common_member;
+—————————-+——–+———-+———-+
| Table | Op | Msg_type | Msg_text |
+—————————-+——–+———-+———-+
| utestdb.pre_common_member | repair | status | OK |
+—————————-+——–+———-+———-+
1 row in set (1.64 sec)
为了把问题补充全面一些,我把问题略微改动下,即 使用 myisamchk 工具和 check/repair 命令有什么区别呢.
首先 myisamchk 和 repair 只能修复 MyISAM 表,相比来说,myisamchk 的输出信息要更详细一些,优化,分析表的信息都会输出,repair 则比较直接,repair 无法修复 InnoDB 的表,否则会报出如下的错误。
The storage engine for the table doesn t support repair
check 则同时支持 MyISAM 表和 InnoDB 表
其次 myisamchk 操作 myisam 表时必须保证表不能被使用,check/repair 则可以在线操作。
看完上述内容,你们掌握如何进行 MySQL 修复表的简单分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!