突然收到mysql报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。现在记录下解决过程,下次遇到就不会这么手忙脚乱了。

处理过程:

一遇到报警之后,直接打开错误日志,里面的信息:InnoDB: Database page corruption on disk or a failed

InnoDB: file read of page 30506.

InnoDB: You may have to recover from a backup.

130509 20:33:48  InnoDB: Page dump in ascii and hex (16384 bytes):

##很多十六进制的代码

……

……

InnoDB: End of page dump

130509 20:37:34  InnoDB: Page checksum 1958578898, prior-to-4.0.14-form checksum 3765017239

InnoDB: stored checksum 3904709694, prior-to-4.0.14-form stored checksum 3765017239

InnoDB: Page lsn 5 614270220, low 4 bytes of lsn at page end 614270220

InnoDB: Page number (if stored to page already) 30506,

InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 19

InnoDB: Page may be an index page where index id is 54

InnoDB: (index "PRIMARY" of table "maitem"."email_status")

InnoDB: Database page corruption on disk or a failed

InnoDB: file read of page 30506.

InnoDB: You may have to recover from a backup.

InnoDB: It is also possible that your Operating

InnoDB: system has corrupted its own file cache

InnoDB: and rebooting your computer removes the

InnoDB: error.

InnoDB: If the corrupt page is an index page

InnoDB: you can also try to fix the corruption

InnoDB: by dumping, dropping, and reimporting

InnoDB: the corrupt table. You can use CHECK

InnoDB: TABLE to scan your table for corruption.

InnoDB: See also http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

InnoDB: about forcing recovery.

InnoDB: A new raw disk partition was initialized or

InnoDB: innodb_force_recovery is on: we do not allow

InnoDB: database modifications by the user. Shut down

InnoDB: mysqld and edit my.cnf so that newraw is replaced

InnoDB: with raw, and innodb_force_... is removed.

130509 20:39:35 [Warning] Invalid (old?) table or database name '#sql2-19c4-5'

从错误日志里面很清楚的知道哪里出现了问题,该怎么处理。这时候数据库隔几s就重启,所以差不多可以说你是访问不了数据库的。所以马上想到要修复innodb表了。

以前在Performance的blog上看过类似文章。

当时想到的是在修复之前保证数据库正常,不是这么异常的无休止的重启。所以就修改了配置文件的一个参数:innodb_force_recovery//innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。

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

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):不执行前滚的操作。

因为错误日志里面提示出现了坏页,导致数据库崩溃,所以这里把innodb_force_recovery 设置为1,忽略检查到的坏页。重启数据库之后,正常了,没有出现上面的错误信息。找到错误信息出现的表:

(index "PRIMARY" of table "maitem"."email_status")

数据页面的主键索引(clustered key index)被损坏。这种情况和数据的二级索引(secondary indexes)被损坏相比要糟很多,因为后者可以通过使用OPTIMIZE TABLE命令来修复,但这和更难以恢复的表格目录(table dictionary)被破坏的情况来说要好一些。

操作步骤:

因为被破坏的地方只在索引的部分,所以当使用innodb_force_recovery = 1运行InnoDB时,操作如下:

执行check,repair table 都无效

alter table email_status engine =myisam;  #也报错了,因为模式是innodb_force_recovery =1。

ERROR 1025 (HY000): Error on rename of '...' to '....' (errno: -1)

建立一张表:create table email_status_bak   #和原表结构一样,只是把INNODB改成了MYISAM。把数据导进去insert into email_status_bak select * from email_status;

删除掉原表:

drop table email_status;

注释掉innodb_force_recovery 之后,重启。

重命名:

rename table edm_email_status_bak to email_status;

最后该回存储引擎

alter table edm_email_status engine = innodb

总结:

这里的一个重要知识点就是 对 innodb_force_recovery 参数的理解了,要是遇到数据损坏甚至是其他的损坏。可能上面的方法不行了,需要尝试另一个方法:insert into tb select * from ta limit X;甚至是dump出去,再load回来。

mysql innodb repair_MySQL数据库INNODB 表损坏修复处理过程 无法repair的变通方法相关推荐

  1. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

    ##状况描述 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决 ...

  2. SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复

    SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复 开发此工具是为了 让手工恢复数据库物理故障时 更加简单便捷直观, 本工具用于物理修复独立处理大部分问题以及与DBCC配合完成修复各种数据库错 ...

  3. mysql user表 空_安装mysql发现mysql对应的数据库user表内容是空的

    安装mysql发现mysql对应的数据库user表内容是空的: 所以在使用root登录始终都不能成功. 后来查看了一下日志发现: [root@n1 mysql]# mysql_install_db - ...

  4. mysql数据库表损坏修复方法(适用虚拟主机)

    1.主机控制面板修复 在虚拟主机控制面板或独立控制面板中点击"数据库",用控制面板中提供的"修复数据库"功能,可以在线修复. 2.使用phpmyadmin进行修 ...

  5. MySQL学习_数据库和表的基本操作

    目录 1 创建和查看数据库 1.1 创建数据库 1.2 查看数据库 1.3 修改数据库 1.4 删除数据库 2 数据类型 2.1 整数类型 2.2 日期数据类型 2.3 字符串数据类型 3表的基本操作 ...

  6. 使用mysql,建数据库建表操作

    在windows启动mysql 将mysql安装好之后,记得配置好环境. 打开cmd,输入命令:mysql -u root -p,输入密码,回车出现下面界面即可: 到了此时即可进行下面建数据库,访问到 ...

  7. 定义mysql字段的编码模式_在 mysql 中 定义 数据库,表,列时,设定的各个的编码格式。...

    最近看了一下KIGG框架,发现在用EF + MYSQL数据库时,数据出现了乱码,用工具(Navicat )查看一下表category的结构发现 KIGG 数据库的默认情况是用latin1编码的(DEF ...

  8. linux mysql清除数据库所有表_MySQL修复指定数据库下的所有表

    mysql,mariadb,percona 这几天数据库频繁crash,查看日志发现类似如下的错误: [ERROR] mysqld: Table './database/pre_forum_forum ...

  9. mysql表损坏监控_监控mysql启动情况并检测表错误修复

    给开发部同事用的测试服务器上MYSQL经常挂掉...都懒得理了..写了个脚本自己检测错误修复表继续运行..邮件报警功能等有空再补上去... #!/bin/env bash PATH=/bin:/sbi ...

最新文章

  1. 网络2网络布线与数制转换
  2. php:Mcrypt响应慢的原因解决备注
  3. ShareEntryActivity java.lang.ClassNotFoundException | Android类找不到问题
  4. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型
  5. 深入理解最大池化为什么能够实现不变性?
  6. H3CNE新版本V6.0与旧版本V5.1的区别
  7. jsp文件能转换html吗,html怎么转换成jsp
  8. CSS之Multi-columns的列数和列宽
  9. 【理论】数据结构----树的基本概念
  10. jsp怎么接受ajax请求参数,通过ajax发送JSON并通过JSP中的请求获取参数
  11. wamp phpcms部署网站问题
  12. 作业帮电脑版在线使用_应届生应聘作业帮的在线辅导老师
  13. matlab打开慢的原因,Matlab运行速度/效率受哪些因素影响?
  14. 图片API 通用接口
  15. 读取文件云服务器bcc,读取文件云服务器bcc
  16. 统计学 假设检验(Hypothesis Testing)
  17. iOS——编译与链接
  18. np.savetxt()和np.loadtxt()
  19. 用统信uos安装docker并运行项目
  20. 生活小常识日常生活小常识

热门文章

  1. 一种基于深度学习的单导联心电信号睡眠呼吸暂停检测方法
  2. 美的空气能计算机故障维修,美的空气能故障代码,常见故障原因汇总,勿要错过...
  3. 变更请求、批准的变更、确认的变更
  4. 在xp中tc环境下实现的 销售管理系统(可切换繁体和简体,可设密码,可通过修改代码修改字体颜色)
  5. Android Studio 在MuMu模拟器上实现 xposed简单劫持
  6. TOP30排行榜 第04期:花5万元刷榜能上No.1
  7. 格式工厂-格式转换器(老版本)
  8. java实现第三届蓝桥杯地址格式转换
  9. 树莓派4B系统一键安装opencv,再也不要用编译安装啦!(支持buster、bullseye)
  10. Category 类别 -Objective-C