解决方法

1.如果数据不重要或已经有备份,只需要恢复mysql启动

进入mysql目录,一般是: /usr/local/var/mysql/

删除ib_logfile*

删除ibdata*

删除所有数据库物理目录(例如数据库为test_db,则执行rm -rf test_db

重启动mysql

重新建立数据库或使用备份覆盖

2.如果数据很重要且没有备份

可以使用innodb_force_recovery参数,使mysqld跳过恢复步骤,启动mysqld,将数据导出然后重建数据库。

innodb_force_recovery 可以设置为1-6,大的数字包含前面所有数字的影响

     1、(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。

     2、(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。

     3、(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。

     4、(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。

     5、(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。

     6、(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

在my.cnf(windows是my.ini)中加入

innodb_force_recovery = 6 
innodb_purge_thread = 0

重启mysql

这时只可以执行select,create,drop操作,但不能执行insert,update,delete操作

执行逻辑导出,完成后将innodb_force_recovery=0innodb_purge_threads=1,然后重建数据库,最后把导出的数据重新导入

 

 

下面是网上的一篇相关的文章:

  1.     表损坏的原因分析

  以下原因是导致mysql 表毁坏的常见原因:

    1、 服务器突然断电导致数据文件损坏。

    2、 强制关机,没有先关闭mysql 服务。

    3、 mysqld 进程在写表时被杀掉。

    4、 使用myisamchk 的同时,mysqld 也在操作表。    

    5、 磁盘故障。

    6、 服务器死机。

    7、 mysql 本身的bug 。

  2.表损坏的症状           

  一个损坏的表的典型症状如下:

    1 、当在从表中选择数据之时,你得到如下错误:

      Incorrect key file for table: ‘...‘. Try to repair it

    2 、查询不能在表中找到行或返回不完全的数据。

     3 、Error: Table ‘p‘ is marked as crashed and should be repaired 。

     4 、打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) 。

  3.预防 MySQL 表损坏

  可以采用以下手段预防mysql 表损坏:

    1 、定期使用myisamchk 检查MyISAM 表(注意要关闭mysqld ),推荐使用check table 来检查表(不用关闭mysqld )。

    2 、在做过大量的更新或删除操作后,推荐使用OPTIMIZE TABLE 来优化表,这样既减少了文件碎片,又减少了表损坏的概率。

    3 、关闭服务器前,先关闭mysqld (正常关闭服务,不要使用kill -9 来杀进程)。

    4 、使用ups 电源,避免出现突然断电的情况。

    5 、使用最新的稳定发布版mysql ,减少mysql 本身的bug 导致表损坏。

    6 、对于InnoDB 引擎,你可以使用innodb_tablespace_monitor 来检查表空间文件内文件空间管理的完整性。

    7 、对磁盘做raid ,减少磁盘出错并提高性能。

    8 、数据库服务器最好只跑mysqld 和必要的其他服务,不要跑其他业务服务,这样减少死机导致表损坏的可能。

    9 、不怕万一,只怕意外,平时做好备份是预防表损坏的有效手段。

  4. MySQL 表损坏的修复

  MyISAM 表可以采用以下步骤进行修复 :

    1、  使用 reapair table 或myisamchk 来修复。

    2、  如果上面的方法修复无效,采用备份恢复表。