问题表现:由于服务器崩溃导致表损坏无法打开或者能打开但是无法写入数据(提示主键重复但实际没有该主键且该主键值在最大值范围内)。
本文提供两种检查修复方式:mysqlcheck 和 myisamchk ,均在MySQL安装目录bin文件夹下。
一、MysqlCheck 和 Myisamchk 的区别
mysqlcheck 和 myisamchk 程序主要用于检查和修复数据表(主要是 MyISAM 表),比如由于服务器崩溃导致的 MyISAM 表损坏。以下是两者的比较:
1、两者均能检测、修复、分析 MyISAM 类型表。 mysqlcheck 还能优化 MyISAM 表,同时还能检测 InnoDB 类型表,分析 BDB 表。但有些操作是 mysqlcheck 不能匹敌的,比如,myisamchk 可以启动和禁止索引。
2、二者在使用上有着很大的区别。mysqlcheck 是一个客户端程序,可通过网络连接到服务器。他提供了一个可对接服务器表维护指令的命令行接口,比如 CHECK TABLE 和 REPAIR TABLE。mysqlcheck会依据命令行上输入的指令,发送对应的SQL描述到服务器,供服务器执行。这就意味着服务器必须是处于启动运行状态,同时也意味着你能够通过 mysqlcheck 连接到远程服务器。相反, myisamchk 不是客户端程序,他是一个直接操作 MyISAM 物理表的通用工具。这就意味着你必须在 MyISAM 表文件所在的服务器上使用这个工具。同时,当你检测表时需要有文件读取权限,当修复表时需要有写入权限。
3、两者在运行时,与服务器的关系也大不相同。使用 mysqlcheck 时,你仍可以和服务器进行交互。因为 mysqlcheck 是要求服务器自己去进行表的检测和修复。使用 myisamchk 时,你需要确保服务器并没有打开目标表且目标表没有被其他人使用中。如果myisamchk和mysql server同时对表操作,可能导致表被损坏。因此,为了避免这种情况的发生,在使用 myisamchk 时应停掉MySQL服务。 myisamchk 在检测修复表的过程中可能会锁定表文件。
二、MysqlCheck 使用简介
1、远程检测表,如图(表正常):
2、服务器端使用 mysqlcheck 时则不需要指定远程服务器地址,如图(表存在问题):
指令说明:
-c 检查操作,后边跟数据库名称 [表名]
-h 主机地址
-P 端口号
-u 用户名
-p 密码
注意:
1)如果提示 “mysqlcheck: [ERROR] unknown option '--no-beep'” ,则需要修改MySQL配置文件,将 [client] 下的 no-beep 注释掉(注释符号 #)
2)命令使用过程中需要输入用户凭证,如果服务器端存在多个实例,还需要指定实例端口号。
3、使用 mysqlcheck 修复表,如下图:
mysqlcheck 不能修复唯一键不唯一的错误...
指令说明:
-r 数据修复.Perform a repair that can fix almost anything except unique keys that are not unique.
更多相关操作,看这里
三、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(根据需要)即可。
更多相关操作,看这里
四、使用后感
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