数据库运维之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来保存数据。


欢迎大家留言交流。

相关文章
|
2月前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
195 2
|
26天前
|
消息中间件 关系型数据库 数据库
Python实时监测数据库表数据变化的方法
在实现时,需要考虑到应用的实时性需求、数据库性能影响以及网络延迟等因素,选择最适合的方法。每种方法都有其适用场景和限制,理解这些方法的原理和应用,将帮助开发者在实际项目中做出最合适的技术选择。
88 17
|
16天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
25 4
|
13天前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
1月前
|
Oracle 安全 关系型数据库
Oracle数据恢复—Oracle数据库误删除的数据恢复方法探讨
删除Oracle数据库数据一般有以下2种方式:delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法(不考虑全库备份和利用归档日志)。
|
2月前
|
存储 运维 监控
数据库服务器运维最佳实践
【8月更文挑战第22天】
53 2
数据库服务器运维最佳实践
|
1月前
|
存储 测试技术 数据库
数据库备份方法
数据库备份方法
38 2
|
1月前
|
存储 测试技术 数据库
数据库备份的方法
数据库备份的方法
30 1
|
10天前
|
存储 SQL 缓存
InnoDB 存储引擎以及三种日志
InnoDB 存储引擎以及三种日志
19 0
|
2月前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析