索引
数据库损坏一直是令人头疼的问题,而且数据又是网站最核心的东西,这篇文章将介绍用 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,有些表的名字会非常相似,但是结构却截然不同,千万不要复制错误的表,不然有可能会导入数据失败。
ㄏ一ㄡˇ 早就災啊