前置

首先,只有InnoDB引擎的数据库才需要这样恢复,myisam不需要这么麻烦,只要数据文件存在直接复制过去就可以。

其次,mysql数据库必须是按表存放数据的,默认不是,但是大家生产肯定是按分表设置的吧,如果不是,则无法这样恢复数据。mysql.ini的设置为 innodb_file_per_table = 1。

.frm文件是mysql表结构定义文件,使用mysql-utilities中的mysqlfrm来将其转换成mysql的create语句,来重建表结构

.ibd文件存了每个表的元数据,包括表结构的定义等。就知道是用这个来恢复数据就行

工具

mysql-utilities https://downloads.mysql.com/archives/utilities/

恢复过程

建数据库

以一道网站重构题为例

题目给了网站源码和mysql的数据库文件

首先找到网站源码里对数据库连接的config文件,将其参数改为我们自己建立的数据库。

我们要按照它的db.opt来创建对应的数据库

default-character-set=utf8mb4
default-collation=utf8mb4_general_ci

数据库名:quzhen

用户:quzhen

密码:quzhen

注意:用phpstudy创建数据库要用innodb引擎

mysql ibd2sdi 是用 mysql frm ibd_mysql

建表

先将.frm文件的文件名提取出来,他们的文件名对应着一个数据表

dir /b /t >frmname.txt

dir命令

然后利用notepad++的功能将.frm文件剪切出来,然后再去掉后缀

mysql ibd2sdi 是用 mysql frm ibd_数据库_02

mysql ibd2sdi 是用 mysql frm ibd_mysql_03

mysql ibd2sdi 是用 mysql frm ibd_mysql_04

就可以得到.frm的文件名了

mysql ibd2sdi 是用 mysql frm ibd_服务器_05

将其处理成命令行的格式

–server=用户名:密码

所以root:root要按照自己的情况修改

mysqlfrm --server=root:root@localhost:3306 文件路径\文件名.frm > 文件路径\sql\文件名.sql --diagnostic --port=3307

前面是源文件,后面是目标文件

利用正则匹配来处理

mysqlfrm --server=root:root@localhost:3306 文件路径\\\1.frm > 文件路径\\sql\\\1.sql --diagnostic --port=3307

mysql ibd2sdi 是用 mysql frm ibd_mysql_06

然后复制源文件所在的路径和目标路径

将其替换到上面

源文件路径:C:\Users\39473\Desktop\Desktop\ypzxw

目的路径:D:\phpstudy_pro\Extensions\MySQL5.7.26\data\quzhen

然后在mysqlfrm所在的目录打开命令行,复制粘贴上面的命令到命令行执行,在sql文件夹得到.sql文件(sql文件夹要先创建好)

mysql ibd2sdi 是用 mysql frm ibd_文件路径_07

mysql ibd2sdi 是用 mysql frm ibd_文件路径_08

打开后就都是create语句

用命令

copy *.sql 1.sql

将所有的sql语句复制到一个sql文件里

mysql ibd2sdi 是用 mysql frm ibd_数据库_09

然后去掉warning:xxx

mysql ibd2sdi 是用 mysql frm ibd_mysql_10

在行尾加上

ROW_FORMAT=COMPACT;

来设置其行格式(原因不用深究)

mysql ibd2sdi 是用 mysql frm ibd_数据库_11

然后利用这些语句来建表

主要要修改一下

CREATE TABLE `ypzxw`.`m_entries_cache`

CREATE TABLE `自己的数据库名`.`m_entries_cache`

因为是mysqlfrm工具根据上面的源文件路径来自动生成的

表结构就建好了

mysql ibd2sdi 是用 mysql frm ibd_数据库_12

恢复数据

使用命令

alter table `表名` discard tablespace;

删除刚刚通过建表语句生成的.ibd文件

用notepad来处理

mysql ibd2sdi 是用 mysql frm ibd_mysql ibd2sdi 是用_13

执行命令,可以看见idb文件已经没了

mysql ibd2sdi 是用 mysql frm ibd_服务器_14

然后将要恢复的数据库的.ibd文件复制到新建数据库的目录下

phpstudy_pro的一般路径为

mysql ibd2sdi 是用 mysql frm ibd_文件路径_15

可以使用

xcopy *.ibd C:\Users\39473\Desktop\Desktop\ypzxw\ibd

来讲.ibd文件都复制到目标文件夹(只能是绝对路径)

复制.ibd文件到数据库目录后

执行命令

alter table `表名` import tablespace;

来导入表空间文件(.ibd)

还是用notepad处理

mysql ibd2sdi 是用 mysql frm ibd_mysql ibd2sdi 是用_16

然后执行命令

数据就恢复了

mysql ibd2sdi 是用 mysql frm ibd_服务器_17

后续就是用php服务来运行网站源码,来查找相关数据了。

未完待续

后面找时间来做一个直接处理语句的脚本,打取证也方便