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

 更新时间:2023年07月28日 08:27:26   作者:peachyy  
这篇文章主要介绍了mysql根据.frm和.ibd文件恢复数据表的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

忠人之事受人之托 起因是因为一位朋友的数据库服务器被重装了,只剩下一个zbp_post.frm和zbp_post.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

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

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

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

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

cd zbp_post
mysqlfrm --diagnostic ./zbp_post.frm

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

CREATE TABLE `zbp_post` (
  `log_ID` int(11) NOT NULL AUTO_INCREMENT,
  `log_CateID` int(11) NOT NULL,
  `log_AuthorID` int(11) NOT NULL,
  `log_Tag` varchar(1000) NOT NULL,
  `log_Status` tinyint(4) NOT NULL,
  `log_Type` int(11) NOT NULL,
  `log_Alias` varchar(1000) NOT NULL,
  `log_IsTop` tinyint(4) NOT NULL,
  `log_IsLock` tinyint(4) NOT NULL,
  `log_Title` varchar(1000) NOT NULL,
  `log_Intro` text,
  `log_Content` longtext,
  `log_CreateTime` int(11) NOT NULL,
  `log_PostTime` int(11) NOT NULL,
  `log_UpdateTime` int(11) NOT NULL,
  `log_CommNums` int(11) NOT NULL,
  `log_ViewNums` int(11) NOT NULL,
  `log_Template` varchar(1000) NOT NULL,
  `log_Meta` longtext,
  `log_BdPush` int(11) NOT NULL,
PRIMARY KEY `PRIMARY` (`log_ID`),
KEY `zbp_log_TPISC` (`log_Type`,`log_PostTime`,`log_IsTop`,`log_Status`,`log_CateID`),
KEY `log_CateID` (`log_CateID`),
KEY `log_AuthorID` (`log_AuthorID`),
KEY `log_PostTime` (`log_PostTime`),
KEY `log_CommNums` (`log_CommNums`),
KEY `log_ViewNums` (`log_ViewNums`),
KEY `log_Title` (`log_Title`)
) ENGINE=InnoDB;

数据库配置修改

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

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

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

wait_timeout=600 这个配置可以不加 访问还原数据比较大。执行超时的情况。需要根据场景酌情配置。

开始恢复数据

创建新数据库

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

create database test1;

创建表

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

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

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

ALTER TABLE zbp_post DISCARD TABLESPACE;

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

一般目录在mysql保存数据库的目录。如我当前的服务器mysql数据保存的目录在/usr/local/mysql/data,数据库名 test1 ,表名 zbp_post。

那么拷贝.ibd文件的目录为 /usr/local/mysql/data/zbp_post/test1中。

装载表空间

ALTER TABLE zbp_post IMPORT TABLESPACE;

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

验证

果然完美

mysql> select count(1) from zbp_post;
+----------+
| count(1) |
+----------+
|   785216 |
+----------+
1 row in set (0.15 sec)

到此这篇关于mysql根据.frm和.ibd文件恢复数据表的文章就介绍到这了,更多相关mysql恢复数据表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于mysql主备切换canal出现的问题解决

    关于mysql主备切换canal出现的问题解决

    这篇文章主要给大家介绍了关于mysql主备切换canal出现的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 分享MySQL的自动化安装部署的方法

    分享MySQL的自动化安装部署的方法

    线上的MySQL一般都采用源码编译,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。
    2014-07-07
  • mysql连接查询、联合查询、子查询原理与用法实例详解

    mysql连接查询、联合查询、子查询原理与用法实例详解

    这篇文章主要介绍了mysql连接查询、联合查询、子查询原理与用法,结合实例形式详细分析了mysql连接查询、联合查询、子查询的基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • MySQL大小写敏感导致的问题分析

    MySQL大小写敏感导致的问题分析

    在本篇内容里小编给大家整理了关于MySQL大小写敏感导致的问题的详细分析,有兴趣的朋友们可以学习参考下。
    2019-06-06
  • mysql下修改engine引擎的方法

    mysql下修改engine引擎的方法

    修改mysql的引擎为INNODB,可以使用外键,事务等功能,性能高。
    2011-08-08
  • MySQL死锁解析与解决方法

    MySQL死锁解析与解决方法

    在数据库管理中,死锁是一种常见而又棘手的问题,当多个事务相互等待对方释放锁资源时,死锁就会发生,本文将介绍MySQL中死锁产生的原因、如何查询死锁,以及解决死锁的方法,需要的朋友可以参考下
    2024-01-01
  • MySQL服务器的启动和关闭

    MySQL服务器的启动和关闭

    作为MySQL管理员,一个普通的目标就是确保服务器尽可能地处于运行状态,使得客户机能够随时访问它。但是,有时最好关闭服务器(例如,如果正在进行数据库的重定位,不希望服务器在该数据库中更新表)。保持服务器运行和偶尔关闭它的需求关系不是本书所解 决的。但是我们至少可以讨论如何使服务器启动和停止,以便您具备进行这两个操作的能力。
    2008-04-04
  • 一文搞懂MySQL索引特性(清晰明了)

    一文搞懂MySQL索引特性(清晰明了)

    索引可以提高数据库的性能,提高一个海量数据的检索速度,但是插入,更新,删除的速度相应会降低,下面这篇文章主要给大家介绍了关于MySQL索引特性的相关资料,需要的朋友可以参考下
    2023-04-04
  • MySQL定时删除XX天数据示例代码

    MySQL定时删除XX天数据示例代码

    通过使用MySQL的事件调度器,我们可以方便地创建定时任务来定期清理数据库中的过期数据,本文介绍了如何创建定时任务以及如何删除3个月前的数据作为示例,感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • mysql 行列转换的示例代码

    mysql 行列转换的示例代码

    这篇文章主要介绍了mysql 行列转换的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论