'Table is Marked as crashed and should be repaired Error'.Mysql表损坏解决方案

问题表现:因为服务器崩溃致使表损坏没法打开或者能打开可是没法写入数据(提示主键重复但实际没有该主键且该主键值在最大值范围内)。

本文提供两种检查修复方式:mysqlcheck 和 myisamchk ,均在MySQL安装目录bin文件夹下。html

1、MysqlCheck 和 Myisamchk 的区别

  mysqlcheck 和 myisamchk 程序主要用于检查和修复数据表(主要是 MyISAM 表),好比因为服务器崩溃致使的 MyISAM 表损坏。如下是二者的比较:mysql

  一、二者均能检测、修复、分析 MyISAM 类型表。 mysqlcheck 还能优化 MyISAM 表,同时还能检测 InnoDB 类型表,分析 BDB 表。但有些操做是 mysqlcheck 不能匹敌的,好比,myisamchk 能够启动和禁止索引。sql

  二、两者在使用上有着很大的区别。mysqlcheck 是一个客户端程序,可经过网络链接到服务器。他提供了一个可对接服务器表维护指令的命令行接口,好比 CHECK TABLE 和 REPAIR TABLE。mysqlcheck会依据命令行上输入的指令,发送对应的SQL描述到服务器,供服务器执行。这就意味着服务器必须是处于启动运行状态,同时也意味着你可以经过 mysqlcheck 链接到远程服务器。相反, myisamchk 不是客户端程序,他是一个直接操做 MyISAM 物理表的通用工具。这就意味着你必须在 MyISAM 表文件所在的服务器上使用这个工具。同时,当你检测表时须要有文件读取权限,当修复表时须要有写入权限。数据库

  三、二者在运行时,与服务器的关系也大不相同。使用 mysqlcheck 时,你仍能够和服务器进行交互。由于 mysqlcheck 是要求服务器本身去进行表的检测和修复。使用 myisamchk 时,你须要确保服务器并无打开目标表且目标表没有被其余人使用中。若是myisamchk和mysql server同时对表操做,可能致使表被损坏。所以,为了不这种状况的发生,在使用 myisamchk 时应停掉MySQL服务。 myisamchk 在检测修复表的过程当中可能会锁定表文件。服务器

2、MysqlCheck 使用简介

一、远程检测表,如图(表正常):网络

 

二、服务器端使用 mysqlcheck 时则不须要指定远程服务器地址,如图(表存在问题):工具

 

 指令说明:优化

-c 检查操做,后边跟数据库名称 [表名]spa

-h 主机地址命令行

-P 端口号

-u 用户名

-p 密码

注意:

  1)若是提示 “mysqlcheck: [ERROR] unknown option '--no-beep'” ,则须要修改MySQL配置文件,将 [client] 下的 no-beep 注释掉(注释符号 #)

  2)命令使用过程当中须要输入用户凭证,若是服务器端存在多个实例,还须要指定实例端口号。

 

三、使用 mysqlcheck 修复表,以下图:

 mysqlcheck 不能修复惟一键不惟一的错误...

指令说明:

-r 数据修复.Perform a repair that can fix almost anything except unique keys that are not unique.

更多相关操做,看这里

 

3、Myisamchk 使用简介

  如第一部分,该工具只能在服务器端使用,且须要关闭MySQL服务。

使用 Myisamchk 修复数据,须要进入到MySQL物理库对应的文件夹,而后执行修复指令,以下图:

  指令说明:

    -r 数据恢复。If you have lots of memory, you should increase the value of myisam_sort_buffer_size.

  注意:

     第一次运行时, 抛出 “myisamchk: error: myisam_sort_buffer_size is too small” 错误,此时只须要在指令后面追加 --sort_buffer_size=2G(根据须要)便可。

更多相关操做,看这里

4、使用后感

  myisamchk 修复数据时简单粗暴,感受效率更快一下(感受,没证据...)

  上边的两种方法均已验证,修复了个人三张表。

  表错误的表现1:[Err] 1062 - Duplicate entry '31729205' for key 'PRIMARY' 主键为自增(int类型),插入的主键数据在原表中不存在。

  表错误的表现2:*** marked crashed...

  表错误的表现3:查看表对象信息时,表的基本信息表述为空

问题解决,结贴。没有更深刻的研究了解,欢迎评论交流~

 

参考:

1.How to Check and Repair MySQL Tables Using Mysqlcheck

2.MySQL Table is marked as crashed and last (automatic?) repair failed

3.Using MySQL Client Programs 

4.myisamchk修复损坏的MySQL数据库方法

5.mysqlcheck — A Table Maintenance Program

6.myisamchk — MyISAM Table-Maintenance Utility

相关文章
相关标签/搜索