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上执行的

  1. 下载dbsake
    curl -s http://get.dbsake.net > dbsake
    
  2. 修改权限
    chmod u+x dbsake
    
  3. 解析frm
    ./dbsake frmdump /mnt/d/Desktop/IP_PATENT_APPLICANT_LIST.frm > /mnt/d/Desktop/IP_PATENT_APPLICANT_LIST.sql
    
  4. 执行IP_PATENT_APPLICANT_LIST.sql中的建表语句建表
  5. [可选]批量执行脚本
    目录结构
    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解析失败时, 就需要用到下面的"土方子"

土方子

  1. 创建一张同名表, 字段随便给一个即可, 此时MySQL的./data/<db_name>路径下会生成一个frm和一个ibd文件;
    如果待恢复的表中不包含主键, 则在第1步和第7步的同名表创建时也不要指定主键, 否则会报错
    CREATE TABLE IP_PATENT_APPLICANT_LIST(`id` int, PRIMARY KEY(`id`)) ENGINE=InnoDB;
    
  2. 关闭MySQL服务
  3. 将待恢复的表的frm文件替换第1步中生成的frm文件
  4. 开启MySQL服务
  5. 查看MySQL的报错日志, 一般在安装目录下的data文件夹中的.err后缀的文件, docker MySQL则直接通过docker logs <container_id>命令查看即可, 查找类似下图报错信息:
    在这里插入图片描述
    如上图所示, 实际要恢复的表包含15个字段
  6. 删除第1步中创建的表
    DROP TABLE IP_PATENT_APPLICANT_LIST;
    
  7. 重新创建一张同名的包含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;
    
  8. 重复第2 ~ 4步
  9. 执行SHOW CREATE TABLE IP_PATENT_APPLICANT_LIST命令查看建表语句
  10. 删除第7步创建的表
    DROP TABLE IP_PATENT_APPLICANT_LIST;
    
  11. 用第9步查到的建表语句重新建表, 能正常打开且表字段类型、索引、外键均正常即可

恢复数据

前提: 通过上述**“恢复表结构”**操作, 已完成数据表的创建

  1. 使当前.ibd的数据文件和.frm分离(此时mysql的data路径下, 对应的.ibd文件应该已经消失了)
    ALTER TABLE IP_PATENT_APPLICANT_LIST DISCARD TABLESPACE;
    
  2. 将要恢复数据的.ibd文件放到mysql的data路径下(我的mysql data路径是"F:\mysql-5.7.41-winx64\data\company"供参考, company为db名称)
  3. 使新的.ibd文件与.frm重新链接
    ALTER TABLE IP_PATENT_APPLICANT_LIST IMPORT TABLESPACE;
    
  4. 等待数据加载完成
  5. 能正常打开表, 且数据正常显示即可

参考(侵删): https://blog.csdn.net/zhchs2012/article/details/79013951, https://blog.csdn.net/wkh___/article/details/129841002

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值