MySQL修复表的简单分析(r11笔记第19天)

今天有个同事问我一个数据库的问题,如果开始他就把环境细节全都告诉我,可能我就知难而退了。等我大体明白了问题之后,发现好像背景比我想的要复杂多了。这是一个远程云主机环境,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则可以在线操作。

问题解决了,不过想想问题的最开始扑朔迷离的场景,其实很多大问题的原因都是如此简单。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2016-12-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

谈谈基于Kerberos的Windows Network Authentication[下篇]

六、User2User Sub-Protocol:有效地保障Server的安全 通过3个Sub-protocol的介绍,我们可以全面地掌握整个Kerberos的...

2307
来自专栏linux驱动个人学习

耳机驱动程序上报

1702
来自专栏java系列博客

pl/sql导入excel到oracle表

2287
来自专栏沃趣科技

mysqldump与innobackupex备份过程你知多少(二)

1.2.3. 使用WITH CONSISTENT SNAPSHOT子句的作用 START TRANSACTION语句使用WITH CONSISTENT SNA...

4296
来自专栏杨建荣的学习笔记

关于修改分区表的准备和操作细则(r3笔记26天)

在之前的博文中,讨论过一个根据分区键值发现性能问题的案例。90%以上的数据都分布在了一个分区上,其它的分区要么没有数据要么数据很少,这是很明显的分区问题。当然这...

3086
来自专栏PHP在线

总结

1.安装完成后备份快照 2.不插网线使用虚拟机,查看vmware的IP网段,设置linux系统相同的网段。 3.rpm -qa 软件名字 //查询软件是...

3255
来自专栏散尽浮华

Mysql读写分离方案-MySQL Proxy环境部署记录

Mysql的读写分离可以使用MySQL Proxy和Amoeba实现,其实也可以使用MySQL-MMM实现读写分离的自动切换。MySQL Proxy有一项强大功...

4328
来自专栏乐沙弥的世界

Oracle 数据库实例启动关闭过程

Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载。Oracle数据启动的过程被划分为

1524
来自专栏小L的魔法馆

MySql修改WordPress密码

4076
来自专栏逍遥剑客的游戏开发

NPK文件格式

5943

扫码关注云+社区

领取腾讯云代金券