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


欢迎大家留言交流。

相关文章
|
28天前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
234 1
|
4月前
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
2月前
|
存储 算法 Java
实现不同数据库的表间的 JOIN 运算的极简方法
跨库计算是数据分析中的常见难题,尤其涉及多数据库系统时,表间 JOIN 操作复杂度显著提升。esProc 提供了一种高效解决方案,能够简化跨库 JOIN 的实现。例如,在车辆管理、交管和公民信息系统中,通过 esProc 可轻松完成如下任务:按城市统计有车公民事件数量、找出近一年获表彰的车主信息,以及按年份和品牌统计车辆违章次数。esProc 支持不同关联场景(如维表关联与主子表关联)的优化算法,如内存索引、游标处理和有序归并,从而大幅提升编码和运算效率。无论是同构还是异构数据源,esProc 均能灵活应对,为复杂数据分析提供强大支持。
|
3月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
691 28
|
3月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
4月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
105 16
|
6月前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
304 75
|
5月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
434 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
5月前
|
数据库
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。
|
7月前
|
人工智能 运维 自然语言处理
今晚围观—>安全运维工程师现场直播用通义灵码发现和修复代码漏洞
12 月 18 日晚 19:30 分,阿里云中小企业直播间「AI 编码助手一年养成记:从“打酱油”到企业开发“真正助手”」见。