本文档为 DBRECOVER for MySQL 官方用户手册。可通过左侧目录跳转到具体的恢复场景;如需了解端到端的整体流程,建议从头到尾通读。

概述

DBRECOVER for MySQL 是一款 MySQL/InnoDB 数据恢复工具。在没有可用备份的情况下,它能够从实例崩溃、InnoDB 数据字典损坏导致数据库无法启动、DROP DATABASEDROP TABLETRUNCATE TABLE、行级 DELETE,以及磁盘或文件系统损坏等故障中恢复数据。

主要特性:

  • 图形化用户界面,无需命令行操作。
  • 支持 MySQL 5.1 至 8.0,包括全新的 MySQL 8.0 数据字典。
  • 仅支持 InnoDB 存储引擎。
  • 支持 DROP DATABASE、DROP TABLE、TRUNCATE TABLE 与行级 DELETE 之后的数据恢复。
  • 支持磁盘故障与文件系统损坏后的数据恢复。
  • 能够读取 FRM 文件并将其还原为 CREATE TABLE 语句。
  • 支持大对象(LOB / TEXT)数据的恢复。
  • 恢复结果以 MYSQLDUMP 格式 SQL 文件输出。
  • 基于 Java,可在 Windows、Red Hat、CentOS 与 Ubuntu 上运行。
  • 免费试用限制:每张表最多 1,000 行;恢复 DELETE 删除的数据时,最多 100 行。
DBRECOVER for MySQL 主界面
DBRECOVER for MySQL 操作流程截图
DBRECOVER for MySQL 操作流程截图
DBRECOVER for MySQL 操作流程截图
DBRECOVER for MySQL 操作流程截图
DBRECOVER for MySQL 操作流程截图

当 DBRECOVER 输出 MYSQLDUMP 格式的 SQL 后,可将其重新导入 MySQL 并核对行数:

MySQL Client
mysql -uroot -p < actor.sql
Enter password: ********


mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.14 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use  employees;
Database changed

mysql> select count(*) from actor;
+----------+
| count(*) |
+----------+
|     200  |
+----------+
1 row in set (0.00 sec)

从 DROP DATABASE 场景恢复

为演示效果,先复现该故障:

MySQL Client
mysql> drop database employees;
Query OK, 14 rows affected (0.16 sec)

#sync
#sync
  1. 启动 DBRECOVER for MySQL 软件,选择 DROP DATABASE recovery scenario(DROP DATABASE 恢复场景)。
选择 DROP DATABASE 恢复场景
  1. 选择正确的 MySQL 数据库版本。
选择 MySQL 版本
  1. 选择 SELECT DIRECTORY(选择目录),输入 @@datadir 目录的路径,然后点击 Start(开始)。
选择 datadir
  1. 软件将扫描 ibdata1mysql.ibd 文件,以及 @@datadir 所在的磁盘。
扫描进度
  1. 点击已删除数据库节点,即可在被删除的数据库中查找并恢复表。
已恢复的表树形结构

从 DROP TABLE 与 TRUNCATE TABLE 场景恢复

这里介绍的恢复步骤同时适用于 DROP TABLE 与 TRUNCATE TABLE 场景。首先复现故障:

MySQL Client
mysql> select count(*) from employees.employees;

+----------+
| count(*) |
+----------+
|   300024 |
+----------+
1 row in set (0.09 sec)

mysql> select @@datadir;
+-----------+
| @@datadir |
+-----------+
| /m01/     |
+-----------+
1 row in set (0.00 sec)

mysql> drop table employees.employees;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails


mysql> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table employees.employees;
Query OK, 0 rows affected (0.02 sec)

mysql> ^DBye


#sync
#sync
DROP TABLE 故障复现
  1. 启动软件并选择 DROP TABLE 恢复场景。
选择 DROP TABLE 恢复场景
  1. 选择正确的 MySQL 数据库版本。
选择 MySQL 版本
  1. 选择 SELECT DIRECTORY(选择目录),输入 @@datadir 目录的路径,然后点击 Start(开始)。
选择 datadir
  1. 软件将扫描 ibdata1mysql.ibd 文件,以及 @@datadir 所在的磁盘。

重要提示:请将 DBRECOVER 指向原始的 @@datadir,而不是故障发生后复制出来的副本。DBRECOVER 会扫描 @@datadir 挂载点的文件系统以查找被删除的数据,复制后的目录会丢失文件系统层面的关键信息。

扫描结果
  1. 点击对应数据库下的已删除表节点,查看被删除的表是否仍可恢复。
已删除表节点

对于 TRUNCATE TABLE,表仍位于其正常的数据库节点之下——在树形结构中展开即可查看并导出数据。

表的内容会显示在界面右侧,按照标准的导出流程操作即可。

恢复被 DELETE 语句删除的数据行

当数据行被误执行的 DELETE 语句删除后,可借助 DBRECOVER for MySQL 的数据反删除功能进行恢复。首先复现故障:

MySQL Client
mysql> use  employees;
Database changed

mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)


mysql> delete from employees;


mysql> flush table employees with read lock;
Query OK, 0 rows affected (0.01 sec)
  1. 定位对应的 .ibd 文件,例如 employees 表对应的 employees.ibd
  2. 启动 DBRECOVER for MySQL,在起始菜单中选择 Add ibd file(添加 ibd 文件),添加该 ibd 文件。
添加 ibd 文件
  1. 右键点击该 ibd 文件并选择 Scan(扫描)。扫描完成后会出现对应的页文件。
扫描 ibd 文件
扫描后的页文件
  1. 右键点击并粘贴该表的 CREATE TABLE 语句(可在 MySQL 中通过 SHOW CREATE TABLE 获取)。
MySQL Client
mysql> show create table employees;
+-----------+-----------------------------------------------------------------------------------+
| Table     | Create Table                                                                      |
+-----------+-----------------------------------------------------------------------------------+
| employees | CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum('M','F') NOT NULL,
  `hire_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+-----------------------------------------------------------------------------------+
1 row in set (0.01 sec)
输入 CREATE TABLE 语句
  1. 点击 Confirm(确认)。表会出现在右侧;点击 Deleted Data(已删除数据)查看可恢复的数据行。
已删除数据视图
  1. 点击 Export to file(导出到文件),将被删除的数据以 MYSQLDUMP 格式的 INSERT 语句恢复出来。
导出到文件

将 FRM 文件转换为 CREATE TABLE SQL

DBRECOVER for MySQL 可以免费读取 FRM 文件并将其还原为 CREATE TABLE 语句——无需任何许可证。

FRM 文件入口
  1. 在软件主界面选择 Add frm file(添加 frm 文件)。
  2. 双击已添加的 FRM 文件(或右键查看)。重建出的 CREATE TABLE 语句会显示在界面右侧,可直接复制。
由 FRM 生成的 CREATE TABLE

查看数据表的可恢复行数

该功能可显示 DBRECOVER 能够从某张表中恢复的数据行数——便于在购买许可证前评估恢复规模。

右键点击表,并选择 Show Table Recoverable Row Count(显示表可恢复行数)。

Show Table Recoverable Row Count 菜单
可恢复行数结果

如本手册未涵盖您遇到的恢复场景,或您希望获得付费恢复支持,请联系 liu.maclean@gmail.com,或访问 DBRECOVER for MySQL 价格页面