如何对MySQL数据库中的InnoDB进行故障排除

问题
服务器中执行MySQL查询失败:文件中的错误信息:“ ./ psa / misc.frm”
当运行mysqldump和mysqlcheck时,将显示一条有关不存在的表的消息(为进行验证,请使用MySQL管理员帐户):
mysqlcheck -uadmin -p db_example
db_example.BackupTasks
error : Can’t find file: ‘BackupTasks.MYD’ (errno: 2)
用SELECT语句查询表是不可能的:

mysql> select * from db_example.misc;
ERROR 1033 (HY000): Incorrect information in file: ‘./db_example/misc.frm’
无法还原该表,因为InnoDB内核不支持恢复。

mysql> repair table misc;
+————————-+——–+———-+———————————————————+
| Table | Op | Msg_type | Msg_text |
+————————-+——–+———-+———————————————————+
| psa.APSApplicationItems | repair | note | The storage engine for the table doesn’t support repair |
+————————-+——–+———-+———————————————————+
原因
InnoDB的损坏通常与硬件故障有关。由于电源故障或内存损坏,将保存损坏的页面。如果将InnoDB数据库存储在网络附加存储(NAS)上,也可能会出现此问题。

解决方案
有几种还原MySQL的方法:

一、强制InnoDB恢复
停止mysqld并备份/ var / lib / mysql /文件夹中的所有文件:
/etc/init.d/mysqld stop
mkdir /root/mysql_backup
cp -r /var/lib/mysql/* /root/mysql_backup/
将innodb_force_recovery选项添加到/etc/my.cnf中的[mysqld]部分。该选项将允许您启动mysqld并转储数据库。
/etc/my.cnf

[mysqld]

innodb_force_recovery = 4
注意 您可以将此选项增加到5或6-直到获得最佳转储。

启动mysqld服务:
/etc/init.d/mysqld start
转储所有数据库:
mysqldump -uadmin -p -A > /root/dumpall.sql
如果创建转储时发生以下错误
:使用LOCK TABLES时文件“ xxxxxxxx.frm”中的信息不正确»

增加innodb_force_recovery,然后重试。如果无法创建数据库转储,请尝试使用方法II(复制表的内容)或方法III(从备份还原)。

停止mysqld并删除损坏的数据:
/etc/init.d/mysqld stop
rm -rf /var/lib/mysql/*
从/etc/my.cnf文件中删除innodb_force_recovery选项,然后运行mysqld:
/etc/init.d/mysqld start
结果,将还原主mysql数据库和InnoDB数据库引擎。
从转储还原数据库:
mysql -uadmin -p > dumpall.sql


二、复制表格内容
停止mysqld并备份/ var / lib / mysql /文件夹中的所有文件:
/etc/init.d/mysqld stop
mkdir /root/mysql_backup
cp -r /var/lib/mysql/* /root/mysql_backup/
将innodb_force_recovery选项添加到/etc/my.cnf中的[mysqld]部分。该选项将允许您启动mysqld并转储数据库。
/etc/my.cnf

[mysqld]

innodb_force_recovery = 1
尝试创建副本:
CREATE TABLE <新表> LIKE <损坏表>;
INSERT INTO < 新表 > SELECT * FROM < 损坏表 >;
如果可行,请删除损坏的表并为其重新命名。
DROP TABLE < 损坏表 >;
RENAME TABLE <新表> TO < 损坏表 >;


三,InnoDB表恢复
如果发生以下错误,则需要InnoDB表恢复

mysql> USE数据库名;
mysql> SELECT * FROM table1;
错误1146(42S02):表’databasename.table1’不存在
mysql>
或者尝试通过mysqldump转储

$ mysqldump -uroot -p数据库名> databasename.sql
输入密码:
mysqldump:得到错误:1146:使用锁定表时,表’databasename.table1’不存在
[red @ hellsrv〜]
警告在开始任何操作之前,我们建议您备份数据库文件。
通过mysqldump创建备份将失败(由于错误)。您将需要在文件系统级别复制基本文件:

服务mysqld停止
cp -R / var / lib / mysql /数据库名/ home /用户名/备份
为了恢复InnoDB表,我们需要找出:

学习表结构
有数据文件(意味着文件系统级别的文件)
文件系统级别的InnoDB表包含两个文件:

.frm文件包含表结构;
.ibd文件实际数据
恢复计划:

找出损坏表的结构;
建立新的表;
在新数据库中创建所需结构的表;
将数据从旧表复制到新表;
如果数据已损坏,您可以尝试使用innochecksum实用程序将其还原
我们使用表结构读取实用程序:

mysqlfrm-诊断表1.frm
创建表table1
id int(10)unsigned NOT NULL注释’ID’,
title varchar(128)NOT NULL注释’Title’,
主键PRIMARYid
)ENGINE = InnoDB;
还建议找出旧库的编码:

mysql>从INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME =’databasename’中选择DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME

  • —————————- + ——————– —- +
    | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
  • —————————- + ——————– —- +
    | cp1251 | cp1251_general_ci |
  • —————————- + ——————– —- +
    1行进入(0.00秒)
    创建一个新的基地:

mysql> CREATE DATABASE helldb CHARACTER SET cp1251 DEFAULT COLLATE cp1251_general_ci;
查询正常,受影响的1行(0.00秒)
我们为实用程序的输出创建一个表,以读取损坏的表的结构:

mysql> USE数据库名;
mysql>创建表table1
id int(10)unsigned NOT NULL注释’ID’,
title varchar(128)NOT NULL注释’Title’,
主键PRIMARYid
)ENGINE = InnoDB;
接下来,复制数据:

我们清理自动创建的文件
mysql> ALTER TABLE table1 DISCARD TABLESPACE;
查询正常,受影响的行数为0(0.04秒)
从损坏的表中复制数据文件
cp /home/USERNAME/tables1.ibd table1.ibd
chown mysql:mysql table1.ibd
汇入资料
mysql> ALTER TABLE table1 IMPORT TABLESPACE;
查询正常,受影响的行数为0,警告为1(0.50秒)
检查读取数据的正确性
mysql> SELECT * FROM table1 LIMIT 10;

  • —– + ———– +
    | id | 标题|
  • —– + ———– +
    | 1 | 标题1 |
    | 2 | 标题2 |
    | 3 | 标题3 |
    | 4 | 标题4 |
  • —– + ———– +
    套装4行(0.00秒)
    然后,您可以导入还原的表或整个数据库。

IV。从备份还原
如果上述说明没有帮助,则只能从备份中还原数据库。

发表评论