MySQL修复表的简单分析

转载 2017年01月03日 09:39:33

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

MySQL修复表的简单分析

他们用的是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表损坏修复解决方案

数据损坏原因MySQL表损坏一般是数据损坏,引起损坏的原因可能是由于磁盘损坏、系统崩溃或者MySQL服务器被崩溃等外部原因。例如有人使用kill -9终止进程,导致MySQL进程未能正常关闭,那么就很...
  • qq_35440678
  • qq_35440678
  • 2017年03月04日 10:18
  • 1868

MySQL损坏表修复(附录自动处理脚本)

Mysql 数据库 相信很多地方 都在用,在用的时候避免不了出现表的损坏,损坏之后我们就要修复。如果是单张表,我们使用命令轻易的修复。如果是其中 的一部分表那?最重要的是还不知道具体的那些表。如果 全...
  • risingsun001
  • risingsun001
  • 2016年02月25日 15:41
  • 2135

MYSQL数据表损坏的原因分析和修复方法小结

1.表损坏的原因分析  以下原因是导致mysql 表毁坏的常见原因:  1、 服务器突然断电导致数据文件损坏。  2、 强制关机,没有先关闭mysql 服务。  3、 mysqld 进...
  • cplasfc3
  • cplasfc3
  • 2016年11月11日 15:25
  • 2395

MySQL修复表的简单分析

杨建荣的学习笔记 2016-12-21 13:11 今天有个同事问我一个数据库的问题,如果开始他就把环境细节全都告诉我,可能我就知难而退了。等我大体明白了问题之后,发现好像背景比我想的要...
  • u011277123
  • u011277123
  • 2017年01月12日 08:52
  • 153

MySQL数据库INNODB 表损坏修复处理过程

最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时候,出现Waiting for N instance(s) to be deallocated 信息...
  • pentilun
  • pentilun
  • 2016年06月06日 15:01
  • 1825

MySQL的Innodb表恢复

一、innodb恢复方法 强制执行innodb恢复 如果你想从数据库中备份你的数据。通常,大多数获得的数据是完整的。但是,不排除你在执行SELECT * FROM tbl_name或者执行Inno...
  • hyy_217
  • hyy_217
  • 2017年05月27日 16:39
  • 305

MySQL数据库INNODB 表损坏修复处理过程 无法repair的变通方法

MySQL数据库INNODB 表损坏修复处理过程 我要评论2013/5/13 11:49:43来源:绿色资源网编辑:www.downcc.com [大 中 小] 评论:0 ...
  • zhangfeng1133
  • zhangfeng1133
  • 2015年10月28日 21:54
  • 922

[MySQL] 怎样使用Mysqlcheck来检查和修复, 优化表

mysqlcheck 是 MySQL 自带的一个工具,作用就是保养 表,其实就是检查,分析,修复和优化了。下面来介绍 mysqlcheck 工具的简单使用,官方文档在这里 以下的例子都是基于 MySQ...
  • lzz957748332
  • lzz957748332
  • 2017年03月18日 20:34
  • 2995

mysql数据库损坏修复方法介绍

由于临时断电,使用kill -9中止MySQL服务进程,所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时,服务正在改变文件,文件可能会留下错误的或不一致的状态。因为这样的毁坏有时是不容易被发...
  • qq_33983359
  • qq_33983359
  • 2016年03月01日 16:20
  • 3403

程序输入表修复

1.使用的一款修复输入表的工具:Import REConstructor,如下图所示:  2.一个加过壳的程序在经过脱壳后,输入表一般会出现问题,出现各种程序不能运行的情况,这时就需要修复输...
  • qq_22642239
  • qq_22642239
  • 2015年12月07日 18:38
  • 1066
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL修复表的简单分析
举报原因:
原因补充:

(最多只允许输入30个字)