数据库运维之InnoDB存储引擎表损坏修复方法

简介: InnoDB存储引擎表的损坏可能是多种因素导致的,比如服务器断电、系统崩溃、硬盘损坏、写数据过程中mysqld进程被kill掉。

InnoDB存储引擎表的损坏可能是多种因素导致的,比如服务器断电、系统崩溃、硬盘损坏、写数据过程中mysqld进程被kill掉。

严重的损坏可能导致无法执行SELECT语句或InnoDB引擎意外退出,甚至导致InnoDB向前滚动恢复崩溃。在这种情况下,我们可以使用innodb_force_recovery选项强制 InnoDB 存储引擎启动,同时阻止后台操作运行,以便使用SELECT ... INTO OUTFILE从数据库中转储表中数据,以这种方式获得的大部分数据都是完好无损的。

例如,将以下行添加到选项文件的 [mysqld] 部分,然后再重新启动服务器:

[mysqld]
innodb_force_recovery = 1

注意:

    在强制 InnoDB 恢复时,应始终从 innodb_force_recovery=1 开始,并且仅在必要时增加值。在此之前,请确保做好数据库的备份副本,以便需要重建数据库。

    innodb_force_recovery设置为 4 或以上可能会永久损坏数据文件,只有在数据库的物理副本测试设置成功后,才能在生产环境使用4或更大的值。

innodb_force_recovery的默认值是0(正常启动,不使用恢复模式),可配置的值为1~6,较大的值会包含较小的值的所有功能。举个例子,配置为3,那么会包含选项1、2的所有功能。

当innodb_force_recovery配置为 3 或更小的值可以转储表,数据相对安全,因为只有损坏的单页上的某些数据丢失。值为 4 或更高值会比较危险,因为数据文件可能会永久损坏。值为6时,因为数据页处于废弃状态,这可能会给 B 树和其他数据库结构带来更多的破坏。为了安全,innodb_force_recovery>0时禁止使用INSERT、DELETE、UPDATE操作。innodb_force_recovery>=4时InnoDB进入只读模式。

innodb_force_recovery选项:

1 (SRV_FORCE_IGNORE_CORRUPT)      

检查到的错误页,仍允许服务运行。在转储表时会跳过损坏的索引和页。

2 (SRV_FORCE_NO_BACKGROUND)  

阻止主线程和任何清理线程运行,执行清理操作时可能会引起crash。

3 (SRV_FORCE_NO_TRX_UNDO)    

不执行事务回滚。

4 (SRV_FORCE_NO_IBUF_MERGE)

不执行 change buffer的合并操作。此值可能会永久损坏数据文件。使用此值后,将删除并重建所有二级索引且将 InnoDB 设置为只读。   

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

启动数据库时不查看undo log,InnoDB将未提交的事务视为已提交。此值可能会永久损坏数据文件。

6 (SRV_FORCE_NO_LOG_REDO)  

redo log不做前滚操作。

通过innodb_force_recovery启动后,可进行如下操作:

1.导出数据

 select * into outfile '/tmp/outfile.txt' from tb1;

2.删除损坏的表

 drop table tb1;

3.创建新表

 create table `tb1` (id varchar(20));

4.导入数据

 LOAD DATA local INFILE '/tmp/outfile.txt' IGNORE INTO TABLE tb1;

如果表数据损坏导致无法转储数据,可以尝试加上ORDER BY primary_key,这个操作可以跳过表中损坏的部分转储数据。如果数据结构已经损坏,可能无法使用复杂的查询语句,只能通过SELECT * FROM tb1来保存数据。


欢迎大家留言交流。

相关文章
|
4天前
|
存储 关系型数据库 MySQL
数据库引擎之InnoDB存储引擎
【10月更文挑战第29天】InnoDB存储引擎以其强大的事务处理能力、高效的索引结构、灵活的锁机制和良好的性能优化特性,成为了MySQL中最受欢迎的存储引擎之一。在实际应用中,根据具体的业务需求和性能要求,合理地使用和优化InnoDB存储引擎,可以有效地提高数据库系统的性能和可靠性。
24 5
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
3月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
70 6
|
4月前
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
存储 关系型数据库 MySQL
|
5月前
|
存储 关系型数据库 MySQL
关系型数据库mysql的InnoDB
【6月更文挑战第17天】
42 3
|
5月前
|
SQL 存储 数据库
SQL 撤销索引、撤销表以及撤销数据库
SQL 撤销索引、撤销表以及撤销数据库
63 4
|
4月前
|
SQL Java 持续交付
实时计算 Flink版产品使用问题之源数据库一直在新增表或修改表结构,需要进行相应的修改和重启,该如何简化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第一篇(存储引擎与Linux系统上安装MySQL数据库)
MySQL数据库进阶第一篇(存储引擎与Linux系统上安装MySQL数据库)
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
104 7