事件起始

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

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. 在不懂的情况下不要自作聪明乱动物理文件!

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

  1. 误删mysql表物理文件的解决方法(不涉及恢复数据)

    该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm和idb文件放 ...

  2. sql 查看数据库物理文件路径

    方式一:用于查询all数据库,适用于SQL2005及以上版本. USE [Master] GO /****** 对象 :  Table [dbo].[Master]    脚本日期 : 06/29/2 ...

  3. (转)从史上八大MySQL宕机事故中学到的经验

    一.Percona网站宕机事件 震级:3 发生时长:2011年7月11日 持续时长:数日 地点:加州Pleasanton(幸福屯) 宕机原因:Percona网站主服务器上的3块硬盘损坏,同时因为人员变 ...

  4. 记录一次mysql宕机的解决办法

    首先先粘贴出来我的错误信息,如下: 2019-07-16T00:53:18.285919Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysq ...

  5. 记-ItextPDF+freemaker 生成PDF文件---导致服务宕机

    摘要:已经上线的项目,出现服务挂掉的情况. 介绍:该服务是专门做打印的,业务需求是生成PDF文件进行页面预览,主要是使用ItextPDF+freemaker技术生成一系列PDF文件,其中生成流程有:解 ...

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

    想导出mysql中的数据库文件,死活找不到,网上说在配置文件中有路径,可是我打开我的配置文件,里边的代码全都是注释掉的,没有一句有用的.后来在某一论坛上找到解决方法了,记录下来. 使用如下命令: my ...

  7. 查看MySql数据库物理文件存放位置

    查找数据库文件位置使用命令 show global variables like "%datadir%";

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

    查看命令:   mysql> show global variables like "%datadir%"; 表格第二行即为文件的位置.另外,可以在该文件夹的配置文件my.i ...

  9. mysql宕机,导致innodb_force_recovery恢复不了

    https://serverfault.com/questions/698038/mysql-innodb-recovery-from-datafiles https://serverfault.co ...

随机推荐

  1. 【Springboot】注解@ConfigurationProperties让配置整齐而简单

    1 简介 前面我们用一篇文章<[Spring]只想用一篇文章记录@Value的使用,不想再找其它了(附思维导图)> 详细讲解了在Spring中如何使用@Value来实现我们对配置的需求,它 ...

  2. 侠说java8--Stream流操作学习笔记,都在这里了

    前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...

  3. 小技巧(2) 查询自己博客的SEO(如果违规,请先提醒)

    今天,教大家查看自己博客的SEO. 首先,上网站http://seo.chinaz.com/ 接着,在网页输入框中输入自己博客地址(带后面路径,不是cnblogs.com这样的,类似https://w ...

  4. 跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手

    一 前言 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库:其强大的提取能力让知识追寻者放弃了使用正则匹配查找HTML节点:Beautifu Soup 其能直接 ...

  5. java main 方法

    public static void main(String[] args) { BigDecimal b1 = new BigDecimal(0.01000000); BigDecimal b2 = ...

  6. 成功填坑! Java引入QQ登录时,AccessToken [accessToken=, expireIn=];

    主要就是会一直进入下面这一行,也就是accessTokenObj.getAccessToken().equals("") 此时前端显示如下 AccessToken [accessT ...

  7. iOS的项目目录结构

    一.一般面试官都会问这样的一个问题,你怎样划分你项目的目录结构,就能测试出这个人是否有经验? 目前,比较常规的两种结构: 1.主目录按照业务分类,内目录按照模块分类(主目录按照MVC架构分类,内部根据 ...

  8. sqlserver2008:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。

    在开始菜单中找到: 进入,点击左侧SQL Server服务, 将SQL Server(MSSQL.....)服务开启, 即可成功连接.

  9. 如何修改win7文件夹的显示方式为详细信息

    1.首先对着空白处,鼠标右键单击,然后点击“排列方式” 选一个 还有 你还可以点击“查看” 选择图标大小.详细信息.平铺.列表 等2.点击我的电脑左上角的 组织 按钮 随后选择“文件夹和搜索选项” 再 ...

  10. windows下生成文件目录树

    1.命令提示: tree /? 2.显示当前目录下的目录树(不显示文件) tree 3.递归显示目录结构(显示文件,常用于项目说明) tree /F 4.将显示的内容重定向到txt tree > ...