MySQL 5.7 通过解析frm和ibd文件恢复数据
.frm文件存储表结构
.ibd文件存储数据
以恢复表IP_PATENT_APPLICANT_LIST为例, 有待恢复表文件IP_PATENT_APPLICANT_LIST.frm
和IP_PATENT_APPLICANT_LIST.ibd
恢复表结构
dbsake解析frm
dbsake建议在linux系统或者wsl上操作(我在windows上执行dbsake失败), 本示例是在wsl上执行的
- 下载dbsake
curl -s http://get.dbsake.net > dbsake
- 修改权限
chmod u+x dbsake
- 解析frm
./dbsake frmdump /mnt/d/Desktop/IP_PATENT_APPLICANT_LIST.frm > /mnt/d/Desktop/IP_PATENT_APPLICANT_LIST.sql
- 执行
IP_PATENT_APPLICANT_LIST.sql
中的建表语句建表 - [可选]批量执行脚本
transport.sh#!/bin/bash# 设置当前目录current_dir=$(pwd)# 定义路径frm_dir="$current_dir/frm"sql_dir="$current_dir/sql"# 检查目录是否存在,如果不存在则创建if [ ! -d "$sql_dir" ]; then mkdir "$sql_dir"fi# 遍历frm目录中的所有文件for frm_file in "$frm_dir"/*.frm; do # 提取文件名和扩展名 base_name=$(basename "$frm_file") file_name="${base_name%.*}" # 构建sql文件路径 sql_file="$sql_dir/$file_name.sql" # 使用dbsake工具将frm文件转换为sql文件 ./dbsake frmdump "$frm_file" > "$sql_file" # 检查转换是否成功 if [ $? -eq 0 ]; then echo "转换成功: $frm_file -> $sql_file" else echo "转换失败: $frm_file" fidone
部分frm文件用dbsake解析失败时, 就需要用到下面的"土方子"
土方子
- 创建一张同名表, 字段随便给一个即可, 此时MySQL的./data/
路径下会生成一个frm和一个ibd文件;
如果待恢复的表中不包含主键, 则在第1步和第7步的同名表创建时也不要指定主键, 否则会报错CREATE TABLE IP_PATENT_APPLICANT_LIST(`id` int, PRIMARY KEY(`id`)) ENGINE=InnoDB;
- 关闭MySQL服务
- 将待恢复的表的frm文件替换第1步中生成的frm文件
- 开启MySQL服务
- 查看MySQL的报错日志, 一般在安装目录下的data文件夹中的.err后缀的文件, docker MySQL则直接通过
docker logs
命令查看即可, 查找类似下图报错信息:
如上图所示, 实际要恢复的表包含15个字段 - 删除第1步中创建的表
DROP TABLE IP_PATENT_APPLICANT_LIST;
- 重新创建一张同名的包含15个字段的表
CREATE TABLE IP_PATENT_APPLICANT_LIST(`id` int, `id1` int, `id2` int, `id3` int, `id4` int, `id5` int, `id6` int, `id7` int, `id8` int, `id9` int, `id10` int, `id11` int, `id12` int, `id13` int, `id14` int, PRIMARY KEY(`id`)) ENGINE=InnoDB;
- 重复第2 ~ 4步
- 执行
SHOW CREATE TABLE IP_PATENT_APPLICANT_LIST
命令查看建表语句 - 删除第7步创建的表
DROP TABLE IP_PATENT_APPLICANT_LIST;
- 用第9步查到的建表语句重新建表, 能正常打开且表字段类型、索引、外键均正常即可
恢复数据
前提: 通过上述**“恢复表结构”**操作, 已完成数据表的创建
- 使当前.ibd的数据文件和.frm分离(此时mysql的data路径下, 对应的.ibd文件应该已经消失了)
ALTER TABLE IP_PATENT_APPLICANT_LIST DISCARD TABLESPACE;
- 将要恢复数据的.ibd文件放到mysql的data路径下(我的mysql data路径是"F:\mysql-5.7.41-winx64\data\company"供参考, company为db名称)
- 使新的.ibd文件与.frm重新链接
ALTER TABLE IP_PATENT_APPLICANT_LIST IMPORT TABLESPACE;
- 等待数据加载完成
- 能正常打开表, 且数据正常显示即可
参考(侵删): https://blog.csdn.net/zhchs2012/article/details/79013951
, https://blog.csdn.net/wkh___/article/details/129841002
来源地址:https://blog.csdn.net/wacxf_lgl/article/details/130127091