背景
      MySQL服务器因为磁盘阵列损坏机器crash,重启MySQL服务时 报如下错误:

InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number
:: InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: :: [ERROR] mysqld got signal ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
To report this bug, see http://kb.askmonty.org/en/reporting-bugs
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.
Server version: 5.5.-MariaDB-log
key_buffer_size=
read_buffer_size=
max_used_connections=
max_threads=
thread_count=
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = K bytes of memory
Hope that.

 分析

主要关注 mysqld got signal 11 的问题,从日志内容分析来看,数据库在机器crash 导致日志文件损坏,重启之后无法正常恢复,更无法正常对外提供服务。

解决
       因为日志已经损坏,这里采用非常规手段,首先修改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):不执行前滚的操作。

注意
a 当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。
b 当innodb_purge_threads 和 innodb_force_recovery一起设置会出现一种loop现象:

 :: InnoDB: Waiting for the background threads to start
:: InnoDB: Waiting for the background threads to start
:: InnoDB: Waiting for the background threads to start
:: InnoDB: Waiting for the background threads to start
:: InnoDB: Waiting for the background threads to start
:: InnoDB: Waiting for the background threads to start

在my.cnf中修改以下两个参数

innodb_force_recovery=6
innodb_purge_thread=0

重启MySQL

 :: [Note] Crash recovery finished.
:: [Note] Server socket created on IP: '0.0.0.0'.
:: [Note] Event Scheduler: Loaded events
:: [Note] /vdata/webserver/mysql/bin/mysqld: ready for connections.
Version: '5.5.37-MariaDB-log' socket: '/tmp/mysql.sock' port: Source distribution

立即对数据库做逻辑导出 ,完成之后将innodb_force_recovery设置为0 ,innodb_purge_thread=1 ,然后重建数据库 。

另外 MySQL 版本 5.5以及之前 ,当innodb_purge_threads =1,innodb_force_recovery >1 的情况会出现上文提到的循环报warning 问题(=1 没有问题),
原因:
MySQL 的源代码中显示 当innodb_purge_threads 和 innodb_force_recovery一起设置会出现loop循环

while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
if (srv_thread_has_reserved_slot(SRV_MASTER) == ULINT_UNDEFINED
|| (srv_n_purge_threads ==
&& srv_thread_has_reserved_slot(SRV_WORKER)
== ULINT_UNDEFINED)) {
ut_print_timestamp(stderr);
fprintf(stderr, " InnoDB: Waiting for the background threads to start\n");
os_thread_sleep();
} else {
break;
}
}

所以当需要设置innodb_force_recovery>1的时候需要关闭 innodb_purge_threads,设置为0(默认)。

四 小结
       MySQL crash 或者 MySQL 数据库服务器 crash 会导致各种各样的问题 ,比如主备之间的error 1594 (5.6 版本开启crash-safe ,会最大程度上避免 error 1594的问题,以后会写5.6新特性介绍该功能 ),error 1236, 日志损坏,数据文件损坏 ,等等,本案例只是其中的一种,细心从日志中找的相关错误提示,逐步解决即可。

最新文章

  1. XML学习笔记1——概述
  2. java EE实现动态SQL的
  3. alue of type java.lang.String cannot be converted to JSONObject
  4. (转)RabbitMQ消息队列(一): Detailed Introduction 详细介绍
  5. mysql 让一个存储过程定时作业的代码
  6. javascript 比较
  7. POJ 3268 Silver Cow Party ( Dijkstra )
  8. js 调用 android 安卓 代码
  9. unity3D中重要函数
  10. IOS中常用的UIColor
  11. 【Centos 7】使用screen恢复终端连接
  12. hdu2262 Where is the canteen
  13. ORACLE 查询近一天,近半小时内的数据
  14. 搭建MHA测试
  15. 函数模板前template语句的位置
  16. C#基础知识之Partial class
  17. C#设计模式(12)——享元模式(Flyweight Pattern)(转)
  18. brew安装和换源
  19. spring注解第07课 @Valid和@Validated的总结区分
  20. button中文字垂直居中

热门文章

  1. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统
  2. Wannafly交流赛1_B_硬币【数学】
  3. uva 11426 GCD - Extreme (II) (欧拉函数打表)
  4. Spring 配置log4j和简单介绍Log4J的使用
  5. redis 笔记05 Sentinel、集群
  6. sql统计上周销售量的起止时间
  7. GIT使用—一些概念
  8. Stalstack 安装
  9. Apache 优化
  10. Linux网络配置脚本