使用innodb

   这篇文章主要介绍了使用innodb_force_recovery解决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 9120034833

  150125 16:12:51 InnoDB: Starting an apply batch of log records to the database...

  InnoDB: Progress in percents: 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 150125 16:12:51 [ERROR] mysqld got signal 11 ;

  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.37-MariaDB-log

  key_buffer_size=268435456

  read_buffer_size=1048576

  max_used_connections=0

  max_threads=1002

  thread_count=0

  It is possible that mysqld could use up to

  key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 2332093 K bytes of memory

  41 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现象:

  代码如下:

  150125 17:07:42 InnoDB: Waiting for the background threads to start

  150125 17:07:43 InnoDB: Waiting for the background threads to start

  150125 17:07:44 InnoDB: Waiting for the background threads to start

  150125 17:07:45 InnoDB: Waiting for the background threads to start

  150125 17:07:46 InnoDB: Waiting for the background threads to start

  150125 17:07:47 InnoDB: Waiting for the background threads to start

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

  代码如下:

  innodb_force_recovery=6

  innodb_purge_thread=0

  重启MySQL

  代码如下:

  150125 17:10:47 [Note] Crash recovery finished.

  150125 17:10:47 [Note] Server socket created on IP: '0.0.0.0'.

  150125 17:10:47 [Note] Event Scheduler: Loaded 0 events

  150125 17:10:47 [Note] /vdata/webserver/mysql/bin/mysqld: ready for connections.

  Version: '5.5.37-MariaDB-log' socket: '/tmp/mysql.sock' port: 3306 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 == 1

  && srv_thread_has_reserved_slot(SRV_WORKER)

  == ULINT_UNDEFINED)) {

  ut_print_timestamp(stderr);

  fprintf(stderr, " InnoDB: Waiting for the background threads to startn");

  os_thread_sleep(1000000);

  } 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, 日志损坏,数据文件损坏 ,等等,本案例只是其中的一种,细心从日志中找的相关错误提示,逐步解决即可。

  

时间: 2024-11-08 23:18:08

使用innodb的相关文章

一个例子与InnoDB索引的几个概念

1.一个简单的sql语句问题     假设当前我们有一个表记录用户信息,结构如下:     a)      表结构 CREATE TABLE `u` (   `id` int(11) NOT NULL DEFAULT '0′,   `regdate` int(1) unsigned,   -..   PRIMARY KEY (`id`),   KEY `regdate` (`regdate`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk 说明:1) 由于需要按照注册时

InnoDB ICP 代码路径

本文简单记录下和Index Condition Pushdown相关的代码路径 涉及的代码只包含InnoDB层 当MySQL使用索引进行数据检索时,不可用于在Innodb进行索引检索的WHERE条件,也可以下推到Innodb层,以减少回表查询的数据量 #对于innodb表,ICP只应用于二级索引 #在MySQL5.6里还不支持对分区表ICP(5.7支持) MySQL版本:5.7.5 1.创建测试表 create table t1 (a int auto_increment primary key

Mysql 之 添加innodb支持

在对mysql进行编译安装时,当安装完成后有时会发现不支持innodb存储引擎,这是因为编译安装时缺少支持innodb的参数: --with-plugins=PLUGIN[,PLUGIN..] Plugins to include in mysqld. (default is: none) Must be a configuration name or a comma separated list of plugins. Available configurations are: none ma

mysql-数据表使用INNODB引擎问题

问题描述 数据表使用INNODB引擎问题 如果数据表使用INNODB引擎,我们是无法通过拷贝表文件的方式去迁移.恢复数据库的,这是为什么? 解决方案 http://down.chinaz.com/server/201207/2090_1.htm 解决方案二: Innodb引擎中事务使用

InnoDB IO子系统介绍

本文我们来简单过一下InnoDB的IO子系统相关模块的代码逻辑.主要包括IO读写线程.预读逻辑.InnoDB读写Page以及社区的一些改进. 前言 InnoDB对page的磁盘操作分为读操作和写操作.   对于读操作,在将数据读入磁盘前,总是为其先预先分配好一个block,然后再去磁盘读取一个新的page,在使用这个page之前,还需要检查是否有change buffer项,并根据change buffer,进行数据变更.   读操作分为两种场景:普通的读page及预读操作,前者为同步读,后者为

InnoDB中Adaptive hash index存在问题、Percona改进及一个bug

背景   Adaptive hash index  (AHI) 是InnoDB中用于加速索引查找的一个结构.InnoDB本身不支持hash索引,所有的索引检索都走B树查询.AHI可以认为是"索引的索引".当对一个页面的访问次数满足一定条件后,将这个页面的地址存在一个hash表中,下次查询可以直接访问到页面,不需要走B树查询. 问题   天下没有免费的午餐,在加速查询的同时,AHI与其他缓存结构一样,也面临维护的问题.作为一个全局结构,在更新时必然有一个全局锁操作(btr_search_

mysql数据据存储引擎InnoDB和MyISAM的优势及区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键.如果事物回滚将造成不完全回滚,不具有原子性.如果执行大量的SELECT,MyISAM是更好的选择. InnoDB:这种类型是事务安全的.它与BDB类

使用MyISAM表和InnoDB的一些记录

key_buffer_size - 这对MyISAM表来说非常重要.如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%.合理的值取决于索引大小.数据量以及负载.记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了.尽管如此,需要总是检查是否所有的 key_buffer 都被利用了..MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的.这么做太浪费了.如果你很少使用MyISAM表,那么也保留低

MySQL事务数据库(InnoDB类型)的安装方法

mysql|数据|数据库 MySQL数据库分二种类型,一种是传统的数据表格式,一种是支持事务处理的数据表格式(InnoDB,BDB,其中以InnoDB为主),下面我介绍一下关于MySQL事务处理数据库的安装及使用方法你先要去下载一下Mysql max版的安装程序,下载地址:www.mysql.com按常规的方法进行安装安装完成后,启动mysql\bin\WinMySQLadmin再退出运行mysql\bin\mydqld-nt --removemysql\bin\mysqld-max-nt --

InnoDB 中文参考手册 --- 5 添加与移除 InnoDB 数据和日志文件

参考|参考手册|数据|中文 InnoDB 中文参考手册 --- 犬犬(心帆)翻译 5 添加与移除 InnoDB 数据和日志文件为了添加一个数据文件到表空间中,首先要关闭 MySQL 数据库,编辑 my.cnf 文件,在 innodb_data_file_path 中添加一个新文件,然后再重新启动服务. 如果,最后一个文件以关键字 autoextend 来描述,那么编辑 my.cnf 的过程如下所示.必须检查最后一个文件的尺寸,并使它向下接近于 1024 * 1024 bytes (= 1 MB)