解决MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题

 更新时间:2020年07月20日 10:46:41   作者:liucx  
这篇文章主要介绍了MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

问题故障:

MySQL数据库意外崩溃,一直无法启动数据库。

报错日志:

启动报错:service mysqld restart

ERROR! MySQL server PID file could not be found!
Starting MySQL. ERROR! The server quit without updating PID file (/www/wdlinux/mysql/var/iZ2358oz5deZ.pid).

数据库error日志:

200719 22:07:43 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Error: trying to add tablespace 840 of name './ob_wp/ob_termmeta.ibd'
InnoDB: to the tablespace memory cache, but tablespace
InnoDB: 840 of name './dev_nss/dg_queue.ibd' already exists in the tablespace
InnoDB: memory cache!
200719 22:07:43 mysqld_safe mysqld from pid file /www/wdlinux/mysql/var/iZ2358oz5deZ.pid ended

提示:数据库启动时读取表空间信息时,ob-wp库中的表ob_users.ibd表数据文件已存在于表空间中。

拓展:

存储引擎是myisam, 在数据库目录下会看到3类文件:.frm、.myi、.myd
(a) *.frm--表定义,是描述表结构的文件。
(b) *.MYD--"D"数据信息文件,是表的数据文件。
(c) *.MYI--"I"索引信息文件,是表数据文件中任何索引的数据树
存储引擎是InnoDB, 在data目录下会看到2类文件:.frm、.ibd
(a) *.frm--表结构的文件。
(b) *.ibd--表数据文件

出处:https://www.cnblogs.com/liucx/

方法一:

根据提示信息判定该InnoDB表损坏,于是尝试将dev_nss库目录中的表结构和表数据文件备份
mv ob_termmeta.ibd ob_termmeta.ibd,bak
mv ob_termmeta.frm ob_termmeta.frm.bak
然后重启了下mysql,发现还是无法启动,提示其他表数据文件已存在,连续3次将已损坏的文件备份,还是无法启动。故放弃此方法。

方法二:

1.查阅官网文档,在mysql配置文件中/etc/my.cnf添加配置,成功启动
[mysqld]
innodb_force_recovery = 1

2.备份数据库
mysqldump -h172.168.2.100 -uroot -p -A > mysql_all_bak.sql
如遇报表不存在,mysqldump可以添加参数:--force ,跳过错误

3.删除数据库
drop database hxdb; 或者将数据库数据库目录 mv hxdb hxdb_bak (保险)

4.去掉参数 innodb_force_recovery
将之前设置的参数去掉后,重新启动数据库

5.导入数据
mysql -uroot -p < mysql_all_bak.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1050 (42S01) at line 25: Table '`hxdb`.`tb_info`' already exists

如果提示表已经存在,这是因为将innodb_force_recovery参数去掉后,数据库会进行回滚操作,会生成相应的ibd文件,所以需要将该文件删除掉,删除后重新导入
mysql -uroot -p < mysql_all_bak.sql

注:

innodb_force_recovery参数解释:崩溃恢复模式,通常只有在严重故障排除情况下才会改变。可以的值是从0到6。

只有在紧急情况下才将这个变量设置为大于0的值,这样你才能启动InnoDB并转储你的表。作为一种安全措施,当innodb_force_recovery大于0时,InnoDB可以防止插入、更新或删除操作。
在5.6.15,innodb_force_recovery设置为4或更大,将InnoDB设置为只读模式。由于relay_log_info_repository=TABLE和master_info_repository=TABLE在InnoDB表中存储信息,这些限制可能导致复制管理命令失败并出现错误。

innodb_force_recovery默认情况下为0(正常启动而不强制恢复)。允许的非零值 innodb_force_recovery是1到6。较大的值包括较小值的功能。例如,值3包含值1和2的所有功能。
如果能够转储 innodb_force_recovery值为3或更小的表,则相对安全的是,仅丢失损坏的单个页面上的某些数据。4或更大的值被认为是危险的,因为数据文件可能会永久损坏。值6被认为是过分的,因为数据库页面处于过时状态,这反过来可能会使B树 和其他数据库结构遭受更多破坏。

为了安全起见,请InnoDB防止 INSERT, UPDATE或 DELETE在innodb_force_recovery大于0 时进行操作 。从MySQL 5.6.15开始, 在只读模式下innodb_force_recovery设置4个或更多位置InnoDB。
1 (SRV_FORCE_IGNORE_CORRUPT)
让服务器运行,即使它检测到一个损坏的页面。尝试让SELECT * FROM tbl_name跳过损坏的索引记录和页面,这有助于转储表。
2 (SRV_FORCE_NO_BACKGROUND)
阻止主线程和任何清除线程运行。如果在清除操作期间发生崩溃,则此恢复值将防止崩溃。
3 (SRV_FORCE_NO_TRX_UNDO)
在崩溃恢复后不运行事务回滚。
4 (SRV_FORCE_NO_IBUF_MERGE)
防止插入缓冲区合并操作。如果它们会导致崩溃,就不要做。不计算表统计信息。此值可能永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。在MySQL 5.6.15中,将InnoDB设置为只读。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
启动数据库时不要查看撤销日志:InnoDB甚至会将未完成的事务视为已提交。此值可能永久损坏数据文件。在MySQL 5.6.15中,将InnoDB设置为只读。
6 (SRV_FORCE_NO_LOG_REDO)
在恢复时不执行重做日志前滚。此值可能永久损坏数据文件。使数据库页面处于过时状态,这反过来可能会给b -树和其他数据库结构带来更多损坏。在MySQL 5.6.15中,将InnoDB设置为只读。

出处:https://www.cnblogs.com/liucx/

参阅官网:
https://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_force_load_corrupted

希望能帮到你

到此这篇关于MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题解决的文章就介绍到这了,更多相关MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 5.7.18 release版安装指南(含有bin文件版本)

    MySQL 5.7.18 release版安装指南(含有bin文件版本)

    这篇文章主要介绍了MySQL 5.7.18 release版安装指南,本文只谈论release版,即含有bin文件版本,需要的朋友可以参考下
    2017-04-04
  • MySQL中分页优化的实例详解

    MySQL中分页优化的实例详解

    这篇文章主要介绍了MySQL中分页优化的实例详解,分页优化是MySQL优化当中的重点,需要的朋友可以参考下
    2015-05-05
  • MySQL数据库INNODB表损坏修复处理过程分享

    MySQL数据库INNODB表损坏修复处理过程分享

    突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。现在记录下解决过程
    2013-08-08
  • MySQL安装提示

    MySQL安装提示"请键入NET HELPMSG 3534以获得更多的帮助"的解决办法

    这篇文章主要介绍了MySQL安装提示"请键入NET HELPMSG 3534以获得更多的帮助"的解决办法
    2017-03-03
  • 如何通过配置文件my.ini修改mysql密码

    如何通过配置文件my.ini修改mysql密码

    这篇文章主要介绍了如何通过配置文件my.ini修改mysql密码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • MySQL数据表分区策略及优缺点分析

    MySQL数据表分区策略及优缺点分析

    项目开发中,随着数据库数据量越来越大,单个表中数据太多,从而导致查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。因此我们需要考虑分表与分区,MySQL分表分区就是为了解决大数据量导致MySQL性能低下的问题。
    2021-05-05
  • MySQL可重复读隔离级别下开启事务的问题解决

    MySQL可重复读隔离级别下开启事务的问题解决

    本文主要介绍了MySQL可重复读隔离级别下开启事务的问题解决,详解在Repeatable Read隔离级别下,mysql的快照生成时机的问题,感兴趣的可以了解一下
    2024-07-07
  • MySQL主从数据库搭建方法详解

    MySQL主从数据库搭建方法详解

    这篇文章主要介绍了MySQL主从数据库搭建方法,较为详细的分析了MySQL主从数据库搭建的原理、步骤与具体操作技巧,需要的朋友可以参考下
    2017-09-09
  • mysql函数全面总结

    mysql函数全面总结

    这篇文章主要介绍了mysql函数,下面文章从MySQL常用的函数开始介绍、还有数值函数,利用举例说明的形式展开内容,需要的朋友可以参考一下
    2021-11-11
  • 一篇文章弄懂MySQL查询语句的执行过程

    一篇文章弄懂MySQL查询语句的执行过程

    这篇文章主要给大家介绍了如何通过一篇文章弄懂MySQL查询语句的执行过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论