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;

至此,整个表结构及数据恢复完成

文档更新时间: 2023-06-08 13:33   作者:admin