本文根据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 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;