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


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

    本文提供两种检查修复方式: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

    3.Using MySQL Client Programs 

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

    5.mysqlcheck — A Table Maintenance Program

    6.myisamchk — MyISAM Table-Maintenance Utility

  • 相关阅读:
    二叉树的遍历
    Balanced Binary Tree(平衡二叉树)
    Maximum Depth of Binary Tree(二叉树最大深度)
    Binary Tree Level Order Traversal(二叉树广度优先遍历或逐层遍历)
    解决mac下sublime中文乱码
    ubuntu下vi文本后出现不正常的情况
    Linux top命令的用法详细详解
    在Ubuntu 12.04下搭建Cocos2d-x 3.0 生成LuaBindings环境
    iOS7(Xcode5)中隐藏状态栏的方法
    VS2015 打包添加系统必备组件
  • 原文地址:https://www.cnblogs.com/gavin-num1/p/9482158.html
Copyright © 2020-2023  润新知