本文提供两种检查修复方式:mysqlcheck 和 myisamchk ,均在MySQL安装目录bin文件夹下。html
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 在检测修复表的过程当中可能会锁定表文件。服务器
一、远程检测表,如图(表正常):网络
二、服务器端使用 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.
更多相关操做,看这里
如第一部分,该工具只能在服务器端使用,且须要关闭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(根据须要)便可。
更多相关操做,看这里
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