https://juejin.cn/post/6986089504423542814
Mysql5.7下Innodb在只有frm和ibd文件的情况下恢复数据
接到领导的一个紧急任务,线上有一个表报错,表文件存在但打不了表,但没有备份,因此无法直接通过把备份表重新恢复的常规操作来做,目前手头上只有frm和ibd文件。因此需要在只有frm和ibd文件的情况下恢复数据
1.下载 MySQL Utilities
下载MySQL Utilities,链接: downloads.mysql.com/archives/ut….
下载mysql-connector-python(MySQL Utilities依赖mysql-connector-python),
链接: dev.mysql.com/downloads/c….
这里我下载的是mysql-connector-python-2.1.8-1.el7.x86_64.rpm及mysql-utilities-1.6.5-1.el7.noarch.rpm
2.安装MySQL Utilities及mysql-connector-python
rpm -ivh mysql-connector-python-2.1.8-1.el7.x86_64.rpm
rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm
3.根据frm文件查看建表语句
mysqlfrm –diagnostic ./文件目录/sys_dict.frm,查出建表语句,复制查询出来的建表语句在mysql中创建的新数据中使用
示例如下:
c复制代码mysqlfrm –diagnostic /home/liu/sys_dict.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such,
# it may not identify all of the components of the table correctly. This is especially true for damaged files.
# It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for /home/liu/sys_dict.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:
CREATE TABLE `liu`.`sys_dict` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dic_code` varchar(150) NOT NULL comment '字典代码',
`dic_key` varchar(300) NOT NULL comment '字典KEY',
`dic_value` varchar(300) NOT NULL comment '字典值',
`dic_type` varchar(300) NOT NULL comment '字典类型,[0]Properties文件,[1]静态字典,[2]SQL',
`dic_type_value` text DEFAULT NULL comment '字典类型为0时Properties文件路径,等于1时为空,等于2时为sql语句',
`ds_key` varchar(150) DEFAULT NULL comment '字典类型2时非空,代表SQL所在的ds_key数据源',
`descr` varchar(300) DEFAULT NULL comment '描述信息',
`seq` int(11) DEFAULT NULL comment '排序号',
PRIMARY KEY `PRIMARY` (`id`) USING BTREE,
UNIQUE KEY `uk_code_key` (`dic_code`,`dic_key`) USING BTREE
) ENGINE=InnoDB ROW_FORMAT = 2;
4.根据mysqlfrm导出的建表语句执行表的创建
c复制代码CREATE TABLE `sys_dict` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dic_code` varchar(150) NOT NULL comment '字典代码',
`dic_key` varchar(300) NOT NULL comment '字典KEY',
`dic_value` varchar(300) NOT NULL comment '字典值',
`dic_type` varchar(300) NOT NULL comment '字典类型,[0]Properties文件,[1]静态字典,[2]SQL',
`dic_type_value` text DEFAULT NULL comment '字典类型为0时Properties文件路径,等于1时为空,等于2时为sql语句',
`ds_key` varchar(150) DEFAULT NULL comment '字典类型2时非空,代表SQL所在的ds_key数据源',
`descr` varchar(300) DEFAULT NULL comment '描述信息',
`seq` int(11) DEFAULT NULL comment '排序号',
PRIMARY KEY `PRIMARY` (`id`) USING BTREE,
UNIQUE KEY `uk_code_key` (`dic_code`,`dic_key`) USING BTREE
) ENGINE=InnoDB;
5.对已创建的表进行表空间卸载 删除ibd文件
mysql> alter table sys_dict discard tablespace;
然后把要恢复的idb文件替换进去
6.对已创建的表进行空间装载
mysql> alter table sys_dict import tablespace;
至此,整个表结构及数据恢复完成