一次修改数据库物理文件造成Mysql宕机的恢复记录

事件起始

某夜,我正在床上冥想准备入睡,忽然同事向我求救:消息内容如下:

Oh My Gold 改了些配置,啥都没了!都没了!没了!了!

我仔细询问,原来是她因为某些原因将某库的物理文件夹改名后,发现数据库找不到了。于是又将名称改回来。结果仍然找不到。这让她觉得数据可能被损坏了,于是赶忙来找我修复。

修复过程

我们数据库用的版本是 MySQL5.7 ,放置在Linux服务器上,在my.cnf 配置了数据库物理文件的存放地址。存放于 data 文件夹下。

表的存储引擎全部使用 InnoDB,data 目录的文件依次如下

  • 用数据库名命名的文件夹,文件夹内存放的 .ibd , .frm 文件依次是数据库表数据文件和表结构文件
  • ibdata1 (存放InnoDB表元数据、undo logs、the change buffer, and the doublewrite buffer) 文件
  • ib_logfile0 ,ib_logfile1 事务日志

这个时候我首先想到的是我本机用Navicat备份过一个文件,立刻打开Navicat尝试还原备份,然而日志全是 Err错误,显示表存在,但是我们是看不到的。这时候我就打算删除该库,直接使用备份恢复,然而数据库删除仍然报错。我只得去备份了一下物理文件然后删除。删除后再使用Navicat还原

经过一番操作,数据库文件是回来了。但是我电脑上的备份文件他不是实时的,虽然恢复了数据库,但仍然丢失了部分数据,我心有不甘。于是我想了一个“妙计”: 我把刚才备份的物理文件里面的 .frm .ibd 文件替换到新创建的物理文件夹中。这样狸猫换太子之后,我岂不是就拥有了最完整的数据?

说干就干,一通 cp -rf 过后,成功替换掉原来的文件。打开Navicat连接没有问题,心里窃喜。就在这时,陆续有同事反应数据库连不上了,我的天呐。什么鬼?我打开MoBa查看linux 进程,发现Mysql 服务已经宕掉了。我尝试重启,报出如下错误:

查看Mysql 错误日志:

This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
Attempting to collect some information that could help diagnose the problem.
As this is a crash and something is definitely wrong, the information
collection process might fail.

经过上网查询,说是可以通过在 my.cnf 添加如下的配置来强制启动数据库官方文档对于该配置的解释同类问题的回答

[mysqld]
innodb_force_recovery = 1
  • 1SRV_FORCE_IGNORE_CORRUPT

    使服务器即使检测到损坏的页也可以运行 。尝试跳过损坏的索引记录和页,这有助于转储表。

  • 2SRV_FORCE_NO_BACKGROUND

    阻止主线程和任何清除线程运行。如果在清除操作期间发生崩溃,则此恢复值可防止崩溃。

  • 3SRV_FORCE_NO_TRX_UNDO

    崩溃恢复后 不运行事务回滚。

  • 4SRV_FORCE_NO_IBUF_MERGE

    防止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表 统计信息。此值可能会永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。设置 InnoDB为只读。

  • 5SRV_FORCE_NO_UNDO_LOG_SCAN

    启动数据库时 不查看撤消日志: InnoDB甚至将未完成的事务也视为已提交。此值可能会永久损坏数据文件。设置InnoDB为只读。

  • 6SRV_FORCE_NO_LOG_REDO

    不进行与恢复有关的重做日志前回滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,这又可能导致B树和其他数据库结构遭受更多破坏。设置 InnoDB为只读。

官方文档特别说明:当级别 >= 4 时,可能会对数据库文件造成不可挽回的破坏。我尝试从1 开始逐步修改该值启动。直到 6 才正常启动。启动后,只能执行查询语句,增删改都不行。于是我将数据库文件全部备份后。关闭数据库,删除原来的 数据库物理文件、ibdata1 文件、ib_logfile0 文件。之后将 innodb_force_recovery 值还原为默认值0。重新恢复了数据库文件。解除了此次危机。

启发

  1. 定时备份数据库!即使是测试库。测试库可以调的时间间隔长一点
  2. 在不懂的情况下不要自作聪明乱动物理文件!

原文地址:https://www.cnblogs.com/keatsCoder/p/12332929.html

时间: 2024-08-01 19:55:50

一次修改数据库物理文件造成Mysql宕机的恢复记录的相关文章

Mysql主从架构-主库宕机如何恢复业务

在我们日常工作场景,首先要做到架构无单点隐患,其次在优化[安全.性能.高可用.高并发等],Mysql这款关系型数据库稳定.高效,所以使用广泛,如果企业架构是1主多从,那如果Mysql主库宕机,如何解决? ----MySQL 主从同步原理图 一.Mysql主库宕机情况分类: 1)硬件问题,(服务器.ecs.虚拟主机等等)宕机 2)service问题,Mysql宕机,服务异常,端口异常等 二.硬件问题处理思路 硬件问题我们可以查看IDC巡检记录,或通过远程控制卡查看硬件运行状态,根据事实情况就行硬件

怎样查看MySql数据库物理文件存放位置

想导出mysql中的数据库文件,死活找不到,网上说在配置文件中有路径,可是我打开我的配置文件,里边的代码全都是注释掉的,没有一句有用的.后来在某一论坛上找到解决方法了,记录下来. 使用如下命令: mysql> show global variables like "%datadir%"; 数据库文件存放在这个位置,每个人可能有所不同哦. C:\ProgramData\MySQL\MySQL Server 5.6\Data\ 经此一役,我还是觉得以后使用mysql还是先自己给配置一

查看及更改MySQL数据库物理文件存放的位置

查看命令:  1 mysql> show global variables like "%datadir%"; 表格第二行即为文件的位置.另外,可以在该文件夹的配置文件my.ini的datadir这行改变文件的默认存储位置:更改位置后记得将原文件夹的内容全部复制到新位置上.

MySQL 物理文件体系结构的简单整理说明

本文出处:http://www.cnblogs.com/wy123/p/7102128.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 本文的数据库版本是MySQL5.7.18,简单介绍一下MySQL数据文件目录的物理结构和作用,从中可以窥见MySQL的整体上的物理文件结构以及逻辑功能.可以从整体结构上了解到MySQL的物理体系架构(本人学习的思路往往是被与已了解的事物对照学习,或者快速了解其轮廓,再逐步细

创建及修改数据库

1 /******创建数据库********/ 2 3 /****** 4 数据库存储文件 5 1.主数据文件 6 主数据文件主要存储数据库的启动信息,并指向其他数据文件,另外,用户数据和对象也可以存储在此文件中,一个数据库只能有一个主数据文件,默认扩展名为.mdf 7 2.辅助数据文件 8 用户可以根据需求建立辅助数据文件,辅助数据文件主要存储用户数据,它可以将数据分散到不同磁盘中,辅助数据文件默认扩展名为.ndf 9 10 技巧:如果数据库超过了单个windows稳健得最大限制,可以使用辅助

mysql主从复制配置操作以及主从宕机切换演练

主从复制目的: 主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器.在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时间. 主服务器:IP地址192.168.80.129,mysql已经安装,无用户数据. 从服务器:IP地址192.168.80.130,mysql已经安装. 注:数据库版本必须一致. 1.主从复制配置 修改从服务器的配置文件/etc/my.cnf,在mysqld里添加一下属性 [mysqld] lo

Mysql DBA 高级运维学习笔记-一主多从宕机从库切换主继续和从库同步过程

1.主库master 宕机 登录从库show processlist\G 看两个线程的更新状态 mysql> show processlist\G *************************** 1. row *************************** Id: 1 User: system user Host: db: NULL Command: Connect Time: 22997 State: Waiting for master to send event Info:

MySQL定时检查是否宕机并邮件通知

我们有时候需要一些检查MySQL是否宕机,如果宕机了应自动重新启动应用并通知运维人员!此脚本用来简单的实现MySQL宕机后自动重启并邮件通知运维,此为SHELL脚本,当然也有一些朋友喜欢用Python之类的实现,其原理是一样的!这儿主要用到的是命令是mysqladmin ping #!/bin/bash # result=`/usr/bin/mysqladmin -u user -ppassword ping` result=`/usr/bin/mysqladmin ping` expected

mysql介绍(关系型数据库),关系型与非关系型数据库,数据库与文件的对应关系,mysql启动与连接,修改mysql配置信息

mysql介绍 数据库是用来存储数据的仓库本质就是存储数据的socket套接字c/s架构 数据库服务端: 存放数据库的主机集群数据库客户端: 可以连接数据库任意客户端数据库管理员:DBA 数据库的基本概念 mysql:关系型数据库 关系型与非关系型数据库 关系型数据库:Mysql access SQLServer Oracle 一般用来存储长期稳定的数据 1.有表的概念 2.以表中一条条记录存储数据 非关系型数据库 :Mongodb Redis Memcache 以键值对的方式存储,快速缓存,即