编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

mysql根据.frm和.ibd文件恢复数据表

wxchong 2024-08-08 01:17:11 开源技术 30 ℃ 0 评论

背景是我们公司需要与某CRM厂商同步数据库,对方表示他们有完善的数据备份机制。我们满怀信心地开始实施,但后来发现他们的备份方式是直接备份数据库的数据源文件,如xxx.frm和xxx.ibd。我一直使用的是mysqldump这样的工具来导出和恢复数据,这种直接备份物理存储文件的方式我尚未尝试过。

在此之前,需要确保历史ibd文件所属的数据库版本与我们还原的新数据库版本相一致,这样才能最大程度地避免出现问题。

创建表结构

要想恢复数据,表结构需要和.ibd里面的结构保持一致,如果不一致将恢复不成功 可能会报如下错误。或者其他异常。

 [ERROR] InnoDB: Trying to access page number 426442752 in space 24, 
 space name test1/zbp_post, which is outside the tablespace bounds. 
 Byte offset 0, len 16384, i/o type read. If you get this error at mysqld startup, 
 please check that your my.cnf matches the ibdata files that you have in the MySQL server.

获取表结构

如果明确知道表结构 这一步可跳过。不知道表结构可从这一步操作中获取到表结构。

借助了mysql utilities工具来查看表结构。

安装mysql utilities

https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5-winx64.msi

这里我适用window 其他系统也是类似的操作 下载后安装好。

其他系统下载地址 https://downloads.mysql.com/archives/

安装的时候可能遇到错误

mysql This application requires Visual Studio 2013 Redistributable

问题原因:mysql找不到Visual C++ Redistributable

所以解决方案是从下载 Visual C++ Redistributable安装 (几兆,很小)

下载路径为:https://www.microsoft.com/zh-CN/download/details.aspx?id=40784

进入xxx.frm目录中执行获取表结构命令。

cd zbp_post
mysqlfrm --diagnostic ./xxx.frm

执行完mysqlfrm命令后 输出如下表结构

CREATE TABLE `ld_profile2field` (
  `profileid` int(11) NOT NULL,
  `tabid` int(10) DEFAULT NULL,
  `fieldid` int(19) NOT NULL,
  `visible` int(19) DEFAULT NULL,
  `readonly` int(19) DEFAULT NULL,
  `editreadonly` int(19) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`profileid`,`fieldid`),
KEY `profile2field_profileid_tabid_fieldname_idx` (`profileid`,`tabid`) USING BTREE,
KEY `profile2field_tabid_profileid_idx` (`tabid`,`profileid`) USING BTREE,
KEY `profile2field_visible_profileid_idx` (`visible`,`profileid`) USING BTREE
) ENGINE=InnoDB;

数据库配置修改

编辑MySQL的配置文件,通常是my.cnf或my.ini文件,在[mysqld]部分添加以下行:

这将确保每个表有单独的.ibd文件。

[mysqld]
innodb_file_per_table=1
wait_timeout=600 #600秒(10分钟)

开始恢复数据

创建新数据库

创建一个数据库 任意数据库名。

create database test1;

创建表

进入到新创建的数据库中(use test1),复制上一步中的表结构SQL。执行创建表结构操作。

使用.ibd文件恢复数据到新表

卸载表空间 执行此步会自动删除新表对应的.ibd文件

ALTER TABLE xxx DISCARD TABLESPACE;

拷贝备份的.ibd文件到新创建数据库对应的目录中。

一般目录在mysql保存数据库的目录。如我当前的服务器mysql数据保存的目录在D:\AppData\MySQL\MySQL Server 5.7\Data\,数据库名 test1 ,表名 xxx。

那么拷贝.ibd文件的目录为 D:\AppData\MySQL\MySQL Server 5.7\Data\test1中。

装载表空间

ALTER TABLE xxx IMPORT TABLESPACE;

完成以上步骤后,您应该能够成功还原.ibd文件。请注意,这种方法仅适用于InnoDB引擎的表。如果.ibd文件损坏或不匹配,可能需要使用MySQL的数据恢复工具来修复数据库。

验证

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表