专注是一种工匠精神

如何用 dbsake 藉由 .frm 跟 .ibd 文件修复数据库

文章目录

数据库损坏一直是令人头疼的问题,而且数据又是网站最核心的东西,这篇文章将介绍用 dbsake 工具来恢复数据。

我们恢复的数据库环境是 MySQL 5.7,dbsake 也可以恢复 MySQL 8.0 以上的版本。

 

Dbsake 是一个开源的 MySQL 和 MariaDB 管理工具包,提供了一系列实用工具来管理数据库。它是用 Python 编写的,通常用于从 .frm 文件中提取表结构定义(即表的元数据),而无需 MySQL 服务器运行。Dbsake 可以帮助用户恢复丢失或损坏的表结构,尤其是在 MySQL 数据库损坏的情况下。

一些常用的功能包括:

  • 打印表结构:从 .frm 文件中提取和显示表结构定义。
  • 转换 SQL 语句:提供了一些实用工具来帮助转换和处理 SQL 语句。

Dbsake 对于需要手动恢复 MySQL 数据库中的表结构的场景特别有用,例如在没有可用备份的情况下。

你可以通过 pip 安装 dbsake,然后使用相关命令提取 .frm 文件中的表结构信息。

在恢复数据库之前,我们先安装 dbsake:

curl -s get.dbsake.net > dbsake
chmod u+x dbsake

可以自己选择自己方便的安装路径。
因为恢复步骤稍嫌繁琐,如果你不是专业DBA,请仔细遵照每一个步骤进行,切莫操之过急。

恢复步骤

1. 先在 my.cnf 文件配置里添加一行参数

[mysqld]
innodb_force_recovery = 1

innodb_force_recovery 设置是为了防止在修复数据过程中防止数据库被写入资料,仅能读取而已,而值从1至6分别有不同行为:

  • 1 (SRV_FORCE_IGNORE_CORRUPT): 忽略检查表的损坏。
  • 2 (SRV_FORCE_NO_BACKGROUND): 阻止后台线程运行(如主线程)以及阻止检查表的操作。
  • 3 (SRV_FORCE_NO_TRX_UNDO): 不执行事务回滚。
  • 4 (SRV_FORCE_NO_IBUF_MERGE): 不合并插入缓冲区。
  • 5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 不检查撤消日志,跳过撤消操作。
  • 6 (SRV_FORCE_NO_LOG_REDO): 不执行 redo 日志恢复。

 

2. 根据你所配置的MySQL存储位置,找寻损坏的数据库的目录夹,例如:/home/data/db,接着你会看到很多物理文件(.ibd 跟 .frm)

.frm 文件是数据库表的结构,而 .ibd 是InnoDB格式的数据,里面还有一个 .opt 文件,我们先忽略 .opt 文件。

如果你有安装 phpmyadmin,可以直接用 phpmyadmin 打开数据库(比较直观),此时数据库里面的表都还在,但是每张表里面的所有结构都遗失而且也找不到数据,这时候可以先将 phpmyadmin 搁置一旁不要关闭。

3. 新建一个数据库,这个新的数据库是要用来导入旧的数据库,所以我们先准备一个新数据库。

这边建议新数据库命名尽量沿用旧数据库名去拓展,例如旧数据库名为 db,而新数据库就命名为 db_1,这么做是因为假设你今天所遭遇的问题是MySQL环境系统毁损而导致多个数据库数据遗失,那么在修复多个数据库的过程可能会出错,所以在命名时,一定要谨慎。

4. 利用 dbsake 查询旧数据库的表结构,范例命令如下:

./dbsake frmdump /home/data/db/wp_users.frm

终端机此时会显示如下图所示:

接着键入指令用root最高权限账户登入mysql:

mysql -u root -p

然后输入密码进去。

 

5. 进入mysql之后,选择刚刚新建的数据库:

mysql> use db_1

将刚刚dbsake打印出来的表结构整个复制起来,贴到命令行(这边请记得,不可以分行,直接一行到底),然后按下回车键,它会返回ok,表示创建表成功。

 

6. 新创建的表会自动建立新的 .ibd 跟 .frm 文件 在新的数据库目录夹底下,我们要把新建的 .ibd 文件丢弃:

mysql> alter table wp_users discard tablespace;

 

7. 将旧数据库目录夹底下的 wp_uesrs.ibd 文件复制到新数据库目录夹底下。

如果复制 .ibd 文件遇到需要重命名文件或覆盖文件,表示第6个步骤没有执行成功

8. 接着导入旧数据:

mysql> alter table wp_users import tablespace;

导入成功后,键入exit 离开mysql环境,然后循环第4至第8步骤,将其它的表循序渐进的恢复。

9. 所有表结构跟数据都恢复完成之后,在网站数据库配置代码底下修改成新的数据库名跟数据库密码,然后测试网站是否正常访问。

10. 将恢复好的数据库做备份。

 

 

小贴士:

以上步骤不要跳着做,也不要尝试直接用捷径方法一次恢复所有表,数据库里的表要一个一个恢复,因为数据库有些表的结构很复杂,不可能记得住。

在恢复表的时候要注意 table name,有些表的名字会非常相似,但是结构却截然不同,千万不要复制错误的表,不然有可能会导入数据失败。

赞(0)
未经允许不得转载:伦客网 » 如何用 dbsake 藉由 .frm 跟 .ibd 文件修复数据库

评论 1

9 + 4 =
  1. #1

    ㄏ一ㄡˇ 早就災啊

    匿名 1周前 (09-04) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 美国 CloudFlare公司CDN节点回复