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
      m
<think>我们正在处理一个MySQL数据恢复问题。用户拥有.frm(存储表结构).ibd(存储数据索引)文件,并希望从中恢复数据。 根据提供的引用,我们可以总结出恢复步骤。注意:此过程适用于MySQL 5.6及以上版本,其中InnoDB表使用独立的表空间(每个表一个.ibd文件)。 步骤概述: 1. 恢复表结构:使用.frm文件生成建表语句。 2. 创建一个新的空表:使用上一步生成的建表语句。 3. 丢弃新表的表空间:使新表的.ibd文件被移除。 4. 将待恢复.ibd文件复制到新表的数据目录下。 5. 导入表空间:将复制的.ibd文件与新表关联。 详细步骤: 步骤1:恢复表结构 - 方法1(推荐):使用mysqlfrm工具(MySQL Utilities的一部分)从.frm文件生成建表语句。 mysqlfrm --server=username:password@localhost:3306 --port=3308 /path/to/table.frm > /path/to/table.sql 注意:--port参数指定一个临时端口(3308或其他未被占用的端口),因为mysqlfrm会启动一个临时服务器实例。 - 方法2:手动创建表结构(如果知道表结构)。 步骤2:创建新表 - 在目标数据库中,使用步骤1生成的SQL语句创建一个新表(假设表名为table_name)。 CREATE DATABASE IF NOT EXISTS target_db; USE target_db; -- 执行生成的table.sql中的建表语句 步骤3:丢弃新表的表空间 - 这将删除新表对应的.ibd文件(在MySQL的data目录下的数据库目录中)。 ALTER TABLE table_name DISCARD TABLESPACE; 步骤4:复制待恢复.ibd文件 - 将待恢复的table_name.ibd文件复制到目标数据库目录下(例如:MySQL的data目录下的target_db目录)。 - 注意:确保文件权限正确(MySQL进程有读写权限)。 步骤5:导入表空间 - 执行以下命令,使MySQL加载复制的.ibd文件: ALTER TABLE table_name IMPORT TABLESPACE; 步骤6:验证数据 - 查询表,检查数据是否恢复。 注意事项: - 恢复过程中,确保MySQL版本与原始数据库版本一致或兼容(最好相同版本)。 - 如果遇到错误,如InnoDB文件格式不匹配,可能需要调整InnoDB的文件格式(如设置为Barracuda)行格式(如设置为DYNAMIC)。 - 引用[5]中提到,如果直接覆盖.ibd文件可能导致表不存在错误,因此必须按照上述步骤(特别是DISCARDIMPORT)操作。 引用[1]提到使用WinHex查看文件,但恢复过程并不需要查看文件内容,而是需要上述步骤。 引用[2]、[3]、[4]提供了类似步骤,其中引用[4]详细说明了DISCARDIMPORT的使用。 如果遇到错误,可以检查错误日志,常见问题及解决: - 表不存在:确保表已经创建,并且在正确的数据库中。 - 表空间ID不匹配:在复制.ibd文件前,确保已经执行了DISCARD TABLESPACE(这会移除原来的.ibd,并将表置为等待导入状态)。 - 版本的兼容性问题:尝试在相同版本的MySQL恢复。 生成相关问题: 由于用户的问题是关于如何恢复,我们可以围绕恢复过程中可能遇到的问题扩展知识提问。 </think>以下是基于提供的引用资料,从`.frm``.ibd`文件恢复MySQL数据的完整步骤: --- ### **恢复步骤总结** 1. **恢复表结构** - 使用`mysqlfrm`工具解析`.frm`文件生成建表语句: ```bash mysqlfrm --server=root:密码@localhost:3306 --port=3308 /路径/表名.frm > /输出路径/表名.sql ``` 注意:`--port`需指定一个**未被占用的端口**(如3308)[^3]。 2. **创建新表** - 执行生成的`表名.sql`文件中的SQL语句创建空表结构: ```sql CREATE DATABASE IF NOT EXISTS 数据库名; USE 数据库名; SOURCE /输出路径/表名.sql; ``` 3. **丢弃新表空间** - 移除新建表的空白`.ibd`文件: ```sql ALTER TABLE 表名 DISCARD TABLESPACE; -- 此时MySQL自动删除.ibd文件[^4] ``` 4. **替换.ibd文件** - 将待恢复的原始`.ibd`文件**复制到MySQL数据目录**: ```bash cp /原路径/表名.ibd /mysql/data/目录/数据库名/ ``` - 修改文件权限: ```bash chown mysql:mysql /mysql/data/目录/数据库名/表名.ibd ``` 5. **导入表空间** - 关联`.ibd`文件与表结构: ```sql ALTER TABLE 表名 IMPORT TABLESPACE; -- 加载数据[^4] ``` 6. **验证数据** ```sql SELECT * FROM 表名 LIMIT 10; -- 检查数据是否恢复 ``` --- ### **关键注意事项** 1. **版本一致性** - MySQL版本需与源数据库一致(建议相同主版本,如5.7.x)[^4]。 - 若版本不同,用`mysqlfrm`的`--diagnostic`参数: ```bash mysqlfrm --diagnostic /路径/表名.frm > 表名.sql ``` 2. **常见错误解决** - **错误1146 (Table doesn't exist)** 直接覆盖`.ibd`而未执行`DISCARD TABLESPACE`导致[^5]。 解决方案:严格按步骤3→4→5操作。 - **Schema mismatch** 新建表结构与原表不兼容。解决方案: - 核对生成的SQL(如行格式`ROW_FORMAT=DYNAMIC`)[^4]。 - 使用`SHOW CREATE TABLE 表名`校对。 3. **工具依赖** - **必需组件**:[MySQL Utilities](https://dev.mysql.com/downloads/utilities/) + [VC++ 2013运行库](https://support.microsoft.com/en-us/topic/update-for-visual-c-2013-and-visual-c-redistributable-package-5b2ac5a5-68d0-4cbd-8f81-824eabda3b4e)[^3]。 --- ### **操作示例** 假设需恢复`user.frm``user.ibd`: ```bash # 1. 生成表结构 mysqlfrm --server=root:123456@localhost:3306 --port=3308 /data/user.frm > /tmp/user.sql # 2. 创建新表 mysql -uroot -p -e "CREATE DATABASE recovery_db;" mysql -uroot -p recovery_db < /tmp/user.sql # 3. 丢弃表空间 mysql -uroot -p -e "USE recovery_db; ALTER TABLE user DISCARD TABLESPACE;" # 4. 复制IBD文件并导入 cp /data/user.ibd /var/lib/mysql/recovery_db/ chown mysql:mysql /var/lib/mysql/recovery_db/user.ibd mysql -uroot -p -e "USE recovery_db; ALTER TABLE user IMPORT TABLESPACE;" ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值