Innodb数据库损坏导致mysql锁死

Posted sfqas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Innodb数据库损坏导致mysql锁死相关的知识,希望对你有一定的参考价值。

问题
mysql自3.23.58版本以后,提供了名为InnoDB的引擎提供存储过程等功能
当服务器发生意外断电等错误的时候,可能导致innodb锁死
用top命令查看,发现mysqld进程占用cpu达到100%并无法正常启动、关闭

070316 12:30:43 mysqld started
070316 12:30:43 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
070316 12:30:43 InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 2347685.
InnoDB: Doing recovery: scanned up to log sequence number 0 2347685
070316 12:30:43 InnoDB: Error: page 4 log sequence number 0 1516429185
InnoDB: is in the future! Current system log sequence number 0 2347685.
InnoDB: Your database may be corrupt.

解决方案
首先要彻底杀掉所有运行的mysql进程,并暂时停止web服务器,以免再次出发mysql的调用
/etc/init.d/httpd stop
killall -9 mysqld
killall -9 mysqld_safe

现在用ps awxuf命令确认没有mysql相关进程在运行了
到/var/lib/mysql目录下,找到ibdata1、ib_logfile0、ib_logfile1等几个文件,将其改名或者移动走
执行/etc/init.d/mysqld restart重新启动mysqld

这时候再查看log,就会发现innodb的引擎会重建出错的文件
070316 12:41:35 mysqld started
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
070316 12:41:35 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
070316 12:41:35 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
070316 12:41:35 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
070316 12:41:36 InnoDB: Started; log sequence number 0 0
/usr/libexec/mysqld: ready for connections.
Version: ‘4.1.12‘ socket: ‘/var/lib/mysql/mysql.sock‘ port: 3306 Source distribution

现在可以通过top命令确认mysqld是否正常运行。

执行/etc/init.d/httpd start正常启动web服务,并观察mysql是否正常,一般故障可以解决

注意:如果想禁用innodb的功能,可以在/etc/my.cnf里边的[mysqld]部分中,加入如下一行:
skip-innodb
然后重启mysqld服务,即可禁用innodb 。
但是不推荐禁用,如果部分mysql程序调用了存储过程,那么就无法工作了。

以上是关于Innodb数据库损坏导致mysql锁死的主要内容,如果未能解决你的问题,请参考以下文章

innodb_file_per_table - 转换为InnoDB

强制 InnoDB 恢复,启动 MySQL 数据库

MySQL锁的定义( 意向共享锁意向排他锁死锁)

MySQL锁的定义( 意向共享锁意向排他锁死锁)

MySQL锁的定义( 意向共享锁意向排他锁死锁)

服务器崩溃导致mysql数据库损坏的数据恢复过程