我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【mysql数据损坏,通过ibd和frm文件批量恢复数据库数据】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【mysql数据损坏,通过ibd和frm文件批量恢复数据库数据】

问题描述

客户那边的测试服务器下午3:00左右因不明原因,所有服务访问不了,ssh也无法连接,客户手动进行强制重启服务器,重启后将所有应用、中间件重启,重启nacos时发现无法连接数据库,通过账号密码登录到数据库发现可以正常登录,但是奇怪的问题来了。。。show tables 时可以正常看到表,但是查询表中数据时发现提示表不存在。。如下图:
在这里插入图片描述

查看mysql日志:
在这里插入图片描述

作为一名mysql菜的不能再菜的小白。。这属实难到我了,看起来像是数据损坏。。没办法,通过多方查询资料,解决办法如下:

解决办法:

首先了解InnoDB引擎创建数据库会产生的文件:

  • .ibd:包含每个表的数据和索引
  • .frm:描述表的结构
  • ibdata1:包含所有表的字典和历史操作

在这里插入图片描述

在test目录下,包含每个表的.ibd和.frm文件
在这里插入图片描述

恢复前提:ibd文件的数据都是正常的
之后也是需要通过这些文件进行恢复,我这边新启了一个mysql实例,过程略,
大体的恢复步骤如下:

  1. 在新的mysql实例中创建数据库,需要跟原数据库的库名和字符集保持一致
  2. 创建数据表,表名要求一致,对应原库data目录下的表名(我这里用工具对原库表的表结构导出创建的)
  3. 通过.ibd文件批量恢复表数据信息
    3.1 让表结构和表空间脱离
    3.2 将需要恢复的.ibd替换到新实例的/data的对应库下

1、安装mysqlfrm 工具

下载链接:

wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gztar -xvf mysql-utilities-1.6.5.tar.gzcd mysql-utilities-1.6.5/安装(需要Python环境,python2.6及以上)python ./setup.py buildpython ./setup.py install检查是否安装成功mysqlfrm --version

2、使用mysqlfrm查看表结构创建语句

mysqlfrm 有–basedir模式以及–server 模式,推荐–server,能够还原最为准确的信息

使用方式(需要启动原mysql):

格式:mysqlfrm --server=用户名:密码@数据库地址:端口 需恢复的frm文件目录 --diagnostic > 保存SQL文件名.sql

mysqlfrm --server=root:password@x.x.x.x:13306 /home/mysql/data/test/*.frm --diagnostic > test_frm.sql

在这里插入图片描述
执行所生成的SQL文件
注:mysqlfrm仅仅显示整个数据库的表结构创建语句,可以显示在控制台也可以输出到文件,不过需要手动执行这些表的创建SQL语句。
先创建数据库

CREATE database  test;

可以查看生成的sql文件手动删除相关无用信息等,可命令行执行或者客户端执行等
命令行导入:

mysql -uroot -ppassword test < test_frm.sql

此时执行完就可以通过desc命令查看到表结构了(报错1:这步我遇到报错,下面有解决方法)

3、通过.ibd文件批量恢复表数据信息

1)让表结构和表空间脱离
生成表结构和表空间脱离的sql:

mysql -uroot -ppassword -h x.x.x.x  -P 13306 -e " SELECT concat('alter table ', table_name, ' discard tablespace;') FROM information_schema.tables WHERE table_schema = 'test';" > /root/test.sql

将sql文件中没有用的内容删除

sed '/^c/d' /root/test.sql> /root/test_discard_new.sql

将sql文件导入到新库

mysql -uroot -ppassword -h x.x.x.x -P 13307 test_AII < test_discard_new.sql

2)将需要恢复的.ibd文件替换到新库所在的/data/库名 目录下

cp /home/mysql/data/test/*.ibd  /home/mysql-test/data/test/

3)权限设置

chown -R mysql.  /home/mysql-test/data/test

4)导入表空间

mysql -uroot -ppassword -h x.x.x.x -P 13306 -e " SELECT concat('alter table ', table_name, ' import tablespace;') FROM information_schema.tables WHERE table_schema = 'test';" > /root/tem_import.sql

清除没用的数据

sed '/^c/d' /root/tem_import.sql > /root/config_import.sql

将sql文件导入(报错2:有报错,下面有解决方法)

mysql -uroot -ppassword -h x.x.x.x -P 13307 test_aii < /root/config_import.sql

此时如果操作没问题,查看数据库表已经有了原始数据了(报错3:有报错,查看下面解决方法)

恢复过程中遇到的问题:

报错1、在导入创建表结构语句的时候报错了,显示语法错误我的创建表语句如下:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '5, COMMENT 'config_info'' at line 21, Time: 0.011000s

建表语句:

CREATE TABLE `test_config`.`config_info` (  `id` bigint(20) NOT NULL AUTO_INCREMENT comment 'id',   `data_id` varchar(255) COLLATE `utf8_bin` NOT NULL comment 'data_id',   `group_id` varchar(255) COLLATE `utf8_bin` DEFAULT NULL,   `content` longtext COLLATE `utf8_bin` comment 'content',   `md5` varchar(32) COLLATE `utf8_bin` DEFAULT NULL comment 'md5',   `gmt_create` datetime NOT NULL comment '创建时间',   `gmt_modified` datetime NOT NULL comment '修改时间',   `class="lazy" data-src_user` text COLLATE `utf8_bin` DEFAULT NULL comment 'source user',   `class="lazy" data-src_ip` varchar(50) COLLATE `utf8_bin` DEFAULT NULL comment 'source ip',   `app_name` varchar(128) COLLATE `utf8_bin` DEFAULT NULL,   `tenant_id` varchar(128) COLLATE `utf8_bin` DEFAULT NULL comment '租户字段',   `c_desc` varchar(256) COLLATE `utf8_bin` DEFAULT NULL,   `c_use` varchar(64) COLLATE `utf8_bin` DEFAULT NULL,   `effect` varchar(64) COLLATE `utf8_bin` DEFAULT NULL,   `type` varchar(64) COLLATE `utf8_bin` DEFAULT NULL,   `c_schema` text COLLATE `utf8_bin` DEFAULT NULL,   `encrypted_data_key` text COLLATE `utf8_bin` comment '秘钥', PRIMARY KEY `PRIMARY` (`id`) USING BTREE,UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`(255),`group_id`(255),`tenant_id`(128)) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8, ROW_FORMAT = 5, COMMENT 'config_info';

解决方法:
将ROW_FORMAT 改为COMPACT或DYNAMIC就可以解决

报错2:导入表空间时,报错

ERROR 1812 (HY000): Tablespace is missing for table ops.tt7.

解决方法:
查看从原库/data/目录copy的.ibd文件的属主和属组是否是mysql的启动用户,不是则修改即可

报错3:所有步骤执行完成后,重启mysql时启动失败,查看mysql日志如下报错:

[InnoDB] [FATAL] Tablespace id is xx in the data dictionary but in file .\test\config.ibd it is xx!

这个错误意思就是库名表名一致,但是表空间id已经不同了,说明上面的执行步骤有错误,导致表空间id记录在两个地方,一个在系统表空间中的字典表,一个记录在表对应的ibd文件里。这个时候,不管出于何种原因,ibd文件使用了旧文件,就会报这个错误。并且导致mysqld进程崩溃退出。

解决方法:
将对应的库中的某个表删除,并重新生成表结构并创建表,然后重新将原表结构和表空间脱离并重新导入表空间,操作上面都有,重新执行即可

来源地址:https://blog.csdn.net/qq_31055683/article/details/128671188

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【mysql数据损坏,通过ibd和frm文件批量恢复数据库数据】

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

通过.frm和.idb文件恢复mysql数据库

本文对该文章进行参考,地址https://baijiahao.baidu.com/s?id=1675966756498698574&wfr=spider&for=pc现在有一个数据库需要恢复,已经获取到.frm和.ibd文件这些文件即是我之前的文章2021长安
通过.frm和.idb文件恢复mysql数据库
2021-12-18

MySQL 利用frm文件和ibd文件恢复表数据

frm文件和ibd文件简介 在MySQL中,如果我们使用了默认的存储引擎innodb创建一张表,那么在文件夹下面就会出现表名.frm和表名.ibd两个文件,如果我们使用的是Myisam存储引擎,那么就会出现三个文件,这里我们给出例子:
2022-05-13

Mysql怎么通过ibd文件恢复数据

这篇文章主要介绍了Mysql怎么通过ibd文件恢复数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Mysql怎么通过ibd文件恢复数据文章都会有所收获,下面我们一起来看看吧。恢复步骤1、创建数据库(随意创建)
2023-07-02

Mysql通过ibd文件恢复数据的详细步骤

恢复步骤1、创建数据库(随意创建)2、创建数据表(备注:表结构要和要恢复的表结构一致,row_format要和ibd文件的row_format一致,否则,会提示两者不一致。 当前row_form编程客栈at=dynamic)3、表的属
2022-06-28

MYSQL8 通过ibd文件恢复表数据的方法

通过MySQL8中的.ibd文件,可以恢复表数据。步骤包括:复制.ibd文件:在目标数据库中创建新表,并使用IMPORTTABLESPACE命令导入.ibd文件。重建表索引:使用REBUILD命令重建表索引。验证恢复:使用SELECT语句验证表数据是否正确恢复。此外,还需要恢复表元数据,包括结构、索引和约束:导出表定义:使用SHOWCREATETABLE命令导出表定义。导入表定义:在目标数据库中导入表定义。验证元数据恢复:使用SHOWCREATETABLE命令验证元数据是否正确恢复。
MYSQL8 通过ibd文件恢复表数据的方法
2024-04-02

如何从 ibdata 和 frm 文件恢复 InnoDB MySQL 表数据?

MySQL Server 使用两种类型的数据库存储引擎 – InnoDB 和 MyISAM。当使用InnoDB存储引擎时,MySQL服务器将数据和索引存储在.ibdata文件中,表模式存储在.frm文件中。如果 InnoDB 表损坏,您可以
如何从 ibdata 和 frm 文件恢复 InnoDB MySQL 表数据?
2024-09-12

mysql数据如何通过data文件恢复

目录mysql数据通过data文件恢复mysql数据恢复方法个人总结步骤其它笔记总结mysql数据通过data文件恢复mysql磁盘文件被损坏,无法启动,能看到data文件,在没有备份的话如何复原?情景1:知道数据库中的表结构1、先执
2022-12-13

编程热搜

目录