Hexo

点滴积累 豁达处之

0%

Mysql数据恢复

本文根据innodb引擎,表文件中的.ibd和.frm后缀文件恢复数据

1 表结构恢复

dbsake直接查看mysql的frm表结构文件

安装命令

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

表结构查看命令

1
2
3
4
xxx/dbsake frmdump xxx/***.frm
第一个 xxx 为自己实际安装dbsake的路径
第二个 xxx 为表结构的路径
第三个 *** 为具体的名称

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@izm5e7klp5h59pozbv3fghz tmp]# /tmp/dbsake frmdump /tmp/navList.frm  # 查看表结构

CREATE TABLE `navList` (
`navId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`cont` varchar(100) DEFAULT NULL,
`images` varchar(100) DEFAULT NULL,
`author` varchar(40) DEFAULT NULL,
`rank` varchar(255) NOT NULL,
`their` varchar(255) NOT NULL,
`tag` varchar(255) DEFAULT '0',
`isChild` tinyint(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`navId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2 表数据恢复

表数据恢复包含以下几个步骤

1 根据建表语句建表

1
2
3
4
5
6
7
8
9
10
11
12
mysql> CREATE TABLE `navList` (
-> `navId` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `title` varchar(100) DEFAULT NULL,
-> `cont` varchar(100) DEFAULT NULL,
-> `images` varchar(100) DEFAULT NULL,
-> `author` varchar(40) DEFAULT NULL,
-> `rank` varchar(255) NOT NULL,
-> `their` varchar(255) NOT NULL,
-> `tag` varchar(255) DEFAULT '0',
-> `isChild` tinyint(255) NOT NULL DEFAULT '0',
-> PRIMARY KEY (`navId`) USING BTREE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row_format=compact;

注: 表后加row_format=compact

2 删除当前表的.ibd文件

1
ALTER TABLE 表名 DISCARD TABLESPACE;

操作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 切换到数据库目录查看表文件
[root@izm5e7klp5h59pozbv3fghz bk_FE]# ll
total 328
-rw-r----- 1 polkitd ssh_keys 61 Dec 19 22:59 db.opt
-rw-r----- 1 polkitd ssh_keys 8748 Dec 20 09:50 friendLink.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:52 friendLink.ibd
-rw-r----- 1 polkitd ssh_keys 8818 Dec 20 09:56 navList.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:58 navList.ibd

# 进入MySQL 执行命令丢弃表空间;
mysql> ALTER TABLE `navList` DISCARD TABLESPACE;
Query OK, 0 rows affected (0.01 sec)

# 再次切换到数据库目录查看表文件,此时navList.ibd文件已不存在
[root@izm5e7klp5h59pozbv3fghz bk_FE]# ll
total 328
-rw-r----- 1 polkitd ssh_keys 61 Dec 19 22:59 db.opt
-rw-r----- 1 polkitd ssh_keys 8748 Dec 20 09:50 friendLink.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:52 friendLink.ibd
-rw-r----- 1 polkitd ssh_keys 8818 Dec 20 09:56 navList.frm

3 复制之前的.ibd文件

1
cp /路径/表名.ibd ./

操作示例:

1
2
3
4
5
6
7
8
9
10
11
## 复制
[root@izm5e7klp5h59pozbv3fghz bk_FE]# cp /tmp/navList.ibd ./

## 再次查看,
[root@izm5e7klp5h59pozbv3fghz bk_FE]# ll
total 220
-rw-r----- 1 polkitd ssh_keys 61 Dec 19 22:59 db.opt
-rw-r----- 1 polkitd ssh_keys 8748 Dec 20 09:50 friendLink.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:52 friendLink.ibd
-rw-r----- 1 polkitd ssh_keys 8818 Dec 20 09:56 navList.frm
-rw-r--r-- 1 root root 98304 Dec 20 09:51 navList.ibd

4 授权

1
2
3
4
5
6
7
8
9
10
11
# 授权
chown polkitd:ssh_keys navList.ibd

## 再次查看
[root@izm5e7klp5h59pozbv3fghz bk_FE]# ll
total 220
-rw-r----- 1 polkitd ssh_keys 61 Dec 19 22:59 db.opt
-rw-r----- 1 polkitd ssh_keys 8748 Dec 20 09:50 friendLink.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:52 friendLink.ibd
-rw-r----- 1 polkitd ssh_keys 8818 Dec 20 09:56 navList.frm
-rw-r--r-- 1 polkitd ssh_keys 98304 Dec 20 09:51 navList.ibd

5 导入表空间

1
2
# 导入表空间
ALTER TABLE `navList` IMPORT TABLESPACE;

3 问题处理方案

1 导入表空间报错

1
2
mysql> ALTER TABLE `navList`  IMPORT TABLESPACE;
ERROR 1812 (HY000): Tablespace is missing for table `bk_FE`.`navList`.

报错原因:未对复制的.ibd文件授权,

解决方案:执行授权操作chown polkitd:ssh_keys navList.ibd

2 模式不匹配

1
2
mysql> ALTER TABLE `userInfo`  IMPORT TABLESPACE;
ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

报错原因:ibd文件有ROW_TYSchema错配(表有ROW_TYPE_DYNAMIC row格式)。ibd文件有ROW_TYPE_COMPACT行格式。

解决方案:在建表语句后加: row_format= compact;