admin管理员组文章数量:1587230
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 > 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" fi done
部分frm文件用dbsake解析失败时, 就需要用到下面的"土方子"
土方子
- 创建一张同名表, 字段随便给一个即可, 此时MySQL的./data/<db_name>路径下会生成一个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 <container_id>
命令查看即可, 查找类似下图报错信息:
如上图所示, 实际要恢复的表包含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/zhchs2012/article/details/79013951
, https://blog.csdn/wkh___/article/details/129841002
版权声明:本文标题:MySQL 5.7 通过frm和ibd文件恢复数据 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725748858a1040552.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论