现象:启动MySQL服务时报1067错误,服务无法启动。

  查看xxx.err错误日志发现有数据页损坏信息:

    InnoDB: Database page corruption on disk or a failed

    InnoDB: file read of page 200.

  出现上述现象是由于突然断电、强制关机、强制杀死MySQL进程等操作所导致的。

  首先修改my.ini中的innodb_force_recovery参数(4-6),使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):不执行前滚的操作。

  注意

  当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。

  可以尝试使用MySQL的bin目录下的mysqlcheck.exe工具来尝试发现并修复MyISAM表的损坏数据页。

  如果仅是MyISAM数据页损坏,修复后,删除my.ini中的innodb_force_recovery参数,尝试启动。

  如果是InnoDB数据表发生了数据页损坏,需要导出数据,重新建库。

  可以尝试运行

    select concat('select 1 from ',table_name,';') from information_schema.tables where table_schema='xxx';查询到的结果定位哪些InnoDB出现了损坏,尝试使用冗余数据修复。

  最后使用MySQL5\bin>mysqldump -uroot -pOSSDB123 databasename >e:\xxx.sql导出表结构和数据,使用load重建建库。也可以使用SELECT INTO OUTFILE从数据库转储你的表,通常以这种方法获取的数据是完好的。

  

  

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

  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、  如果上面的方法修复无效,采用备份恢复表。

  具体可以参考如下做法:

  阶段1 :检查你的表

    如果你有很多时间,运行myisamchk *.MYI 或myisamchk -e *.MYI 。使用-s (沉默)选项禁止不必要的信息。

    如果mysqld 服务器处于宕机状态,应使用--update-state 选项来告诉myisamchk 将表标记为' 检查过的' 。

    你必须只修复那些myisamchk 报告有错误的表。对这样的表,继续到阶段2 。

    如果在检查时,你得到奇怪的错误( 例如out of memory 错误) ,或如果myisamchk 崩溃,到阶段3 。

  阶段2 :简单安全的修复

    注释:如果想更快地进行修复,当运行myisamchk 时,你应将sort_buffer_size 和Key_buffer_size 变量的值设置为可用内存的大约25% 。

    首先,试试myisamchk -r -q tbl_name(-r -q 意味着“ 快速恢复模式”) 。这将试图不接触数据文件来修复索引文件。如果数据文件包含它应有的一切内容和指向数据文件内正确地点的删除连接,这应该管用并且表可被修复。开始修复下一张表。否则,执行下列过程:

    在继续前对数据文件进行备份。

    使用myisamchk -r tbl_name(-r 意味着“ 恢复模式”) 。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。

    如果前面的步骤失败,使用myisamchk --safe-recover tbl_name 。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况( 但是更慢) 。

    如果在修复时,你得到奇怪的错误( 例如out of memory 错误) ,或如果myisamchk 崩溃,到阶段3 。

  阶段3 :困难的修复

    只有在索引文件的第一个16K 块被破坏,或包含不正确的信息,或如果索引文件丢失,你才应该到这个阶段。在这种情况下,需要创建一个新的索引文件。按如下步骤操做:

    把数据文件移到安全的地方。

    使用表描述文件创建新的( 空) 数据文件和索引文件:

    shell> mysql db_name

    mysql> SET AUTOCOMMIT=1;

    mysql> TRUNCATE TABLE tbl_name;

    mysql> quit

    如果你的MySQL 版本没有TRUNCATE TABLE ,则使用DELETE FROM tbl_name 。

    将老的数据文件拷贝到新创建的数据文件之中。(不要只是将老文件移回新文件之中;你要保留一个副本以防某些东西出错。)

    回到阶段2 。现在myisamchk -r -q 应该工作了。(这不应该是一个无限循环)。

    你还可以使用REPAIR TABLE tbl_name USE_FRM ,将自动执行整个程序。

  阶段4 :非常困难的修复

    只有.frm 描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。

    从一个备份恢复描述文件然后回到阶段3 。你也可以恢复索引文件然后回到阶段2 。对后者,你应该用myisamchk -r 启动。

    如果你没有进行备份但是确切地知道表是怎样创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述文件和索引文件移到破坏的数据库中。这样提供了新的描述和索引文件,但是让.MYD 数据文件独自留下来了。回到阶段2 并且尝试重建索引文件。

  InnoDB 表可以采用下面的方法修复:

    如果数据库页被破坏,你可能想要用SELECT INTO OUTFILE 从从数据库转储你的表,通常以这种方法获取的大多数数据是完好的。即使这样,损坏可能导致SELECT * FROM tbl_name 或者InnoDB 后台操作崩溃或断言,或者甚至使得InnoDB 前滚恢复崩溃。 尽管如此,你可以用它来强制InnoDB 存储引擎启动同时阻止后台操作运行,以便你能转储你的表。例如:你可以在重启服务器之前,在选项文件的[mysqld] 节添加如下的行:

    [mysqld]innodb_force_recovery = 4innodb_force_recovery 被允许的非零值如下。一个更大的数字包含所有更小数字的预防措施。如果你能够用一个多数是4 的选项值来转储你的表,那么你是比较安全的,只有一些在损坏的单独页面上的数据会丢失。一个为6 的值更夸张,因为数据库页被留在一个陈旧的状态,这个状态反过来可以引发对B 树和其它数据库结构的更多破坏。

     1 (SRV_FORCE_IGNORE_CORRUPT)

      即使服务器检测到一个损坏的页,也让服务器运行着;试着让SELECT * FROM tbl_name 跳过损坏的索引记录和页,这样有助于转储表。

     2 (SRV_FORCE_NO_BACKGROUND)

      阻止主线程运行,如果崩溃可能在净化操作过程中发生,这将阻止它。

     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)

      不要在恢复连接中做日志前滚。

  数据库不能另外地带着这些选项中被允许的选项来使用。作为一个安全措施,当innodb_force_recovery 被设置为大于0 的值时,InnoDB 阻止用户执行INSERT, UPDATE 或DELETE 操作.

  即使强制恢复被使用,你也可以DROP 或CREATE 表。如果你知道一个给定的表正在导致回滚崩溃,你可以移除它。你也可以用这个来停止由失败的大宗导入或失败的ALTER TABLE 导致的失控回滚。你可以杀掉mysqld 进程,然后设置innodb_force_recovery 为3 ,使得数据库被挂起而不需要回滚,然后舍弃导致失控回滚的表。

利用innodb_force_recovery修复MySQL数据页损坏的更多相关文章

  1. Linux 文件系统引起的云盘文件系统异常导致 MySQL 数据页损坏事故恢复复盘

    事故的起因是因为当我访问某个数据库的某个表的时候,MySQL 立即出现崩溃并且去查看 MySQL 的错误日志出现类似信息 --09T05::.232564Z [ERROR] InnoDB: Space ...

  2. MYSQL数据表损坏的原因分析和修复方法小结

    MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...

  3. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  4. 利用 innodb_force_recovery 解决MySQL服务器crash无法重启问题

    背景      MySQL服务器因为磁盘阵列损坏机器crash,重启MySQL服务时 报如下错误: InnoDB: Reading tablespace information from the .i ...

  5. 一看就懂的:MySQL数据页以及页分裂机制

    文章公号 首发!连载中~ 欢迎各位大佬关注, 回复:"抽奖" 还可参加抽活动 文末有二维码 一.知识回顾 回顾一下之前和大家分享的知识点 看了前面的文章,想必你肯定了解了什么是Bu ...

  6. 利用gearman同步mysql数据到redis

    一.Gearman 1.Gearman是一个分发任务的程序框架. 2.体系:a.client:发送一个jobb.server:找到合适的worker,把job交给该workerc.worker:处理j ...

  7. MySQL--使用innodb_force_recovery修复数据库异常

    当MySQL服务异常重启失败后,可以通过配置参数innodb_force_recovery来对MySQL服务进行修复启动. 参数innodb_force_recovery选项: 1 (SRV_FORC ...

  8. MySQL · 引擎特性 · InnoDB 数据页解析

    前言 之前介绍的月报中,详细介绍了InnoDB Buffer Pool的实现细节,Buffer Pool主要就是用来存储数据页的,是数据页在内存中的动态存储方式,而本文介绍一下数据页在磁盘上的静态存储 ...

  9. Spark使用Java读取mysql数据和保存数据到mysql

    原文引自:http://blog.csdn.net/fengzhimohan/article/details/78471952 项目应用需要利用Spark读取mysql数据进行数据分析,然后将分析结果 ...

随机推荐

  1. 51 Nod 1029 大数除法【Java大数乱搞】

    1029 大数除法 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给出2个大整数A,B,计算A / B和A Mod B的结果.   Input 第1行:大数A ...

  2. c++(排序二叉树删除)

    相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每一种不同的情况,你要有针对性的反应和调整.所以在代码编写的过程中,我们可以一边写代码,一边写测试用例.编写 ...

  3. ThinkPHP3.2基础知识(二)

    1.单入口模式的好处: 安全,灵活.可集中进行安全处理,访问统计等统一控制. 2.入口文件中为什么要判断PHP版本,TP要求PHP的版本是什么? 因为ThinkPHP3.2版本只能在PHP版本5.3. ...

  4. SpringMVC整合Shiro权限框架

    尊重原创:http://blog.csdn.net/donggua3694857/article/details/52157313 最近在学习Shiro,首先非常感谢开涛大神的<跟我学Shiro ...

  5. 从零开始学习前端开发 — 1、HTML基础

    一.web标准 web标准-网页制作的标准,它是由一系列标准组成的,主要包含三个方面:结构(html,xhtml),表现(css),行为(javascript) 注:结构和表现的标准由w3c(万维网联 ...

  6. 【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...

  7. 函数iconv_substr和mb_substr

    二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...

  8. JavaScript常见封装方法

    1.最简单的,使用变量,然后用匿名函数包裹,不封装 2.对象字面量简单封装(不完整的模块模式,因为无法达到变量.方法私有效果.不过确实有分离和组织代码的能力,也就算一种简略的模块模式的实现方式) va ...

  9. tomcat 部署war项目

    前提是 jdk环境已配好 把项目war包放到tomcat的webapps目录下 启动tomcat: 这里我把8080端口修改成了80 IP也修改了 如果没修改直接输入localhost:8080/te ...

  10. C#如何释放已经加载的图片

    使用Image.FromFile取磁盘上的图片时,这个方法会锁定图片文件,而且会导致内存占用增大, 有几种方法解决:一:将Image类转换成Bitmap类System.Drawing.Image im ...