200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > MySQL 5.7 通过frm和ibd文件恢复数据

MySQL 5.7 通过frm和ibd文件恢复数据

时间:2020-09-04 23:33:36

相关推荐

MySQL 5.7 通过frm和ibd文件恢复数据

MySQL 5.7 通过解析frm和ibd文件恢复数据

.frm文件存储表结构

.ibd文件存储数据

以恢复表IP_PATENT_APPLICANT_LIST为例, 有待恢复表文件IP_PATENT_APPLICANT_LIST.frmIP_PATENT_APPLICANT_LIST.ibd

恢复表结构

dbsake解析frm

dbsake建议在linux系统或者wsl上操作(我在windows上执行dbsake失败), 本示例是在wsl上执行的

下载dbsake

curl -s > 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" ]; thenmkdir "$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 ]; thenecho "转换成功: $frm_file -> $sql_file"elseecho "转换失败: $frm_file"fidone

部分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;

等待数据加载完成能正常打开表, 且数据正常显示即可

参考(侵删):/zhchs/article/details/79013951,/wkh___/article/details/129841002

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。