从ibd文件恢复MySQL数据

2024-06-11 15:12
文章标签 数据 mysql 恢复 database ibd

本文主要是介绍从ibd文件恢复MySQL数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从ibd文件恢复MySQL数据

  • 1.背景
  • 2.操作步骤
    • 2.1 备份源数据库的ibd文件
    • 2.2 准备数据库建表语句
    • 2.3 重新安装新数据库
    • 2.4 新数据库恢复数据具体步骤
  • 3.常见错误
    • 3.1 权限问题
    • 3.2 报错不存在CFG文件
    • 3.3 通过ibd文件恢复数据后自增主键问题报冲突

1.背景

前段时间,我的云服务器被病毒木马入侵了,导致服务器所有服务全部下线,且22端口被侵,远程无法登录,VNC模式也无法登录。尝试备份镜像和云硬盘,并用原来的镜像重装系统,依旧无法登录。

遂只能采用xx云服务器上的救援模式,挂载一下原来的硬盘,把关键的文件导出到本地,再重装系统将文件重新上传。

MySQL数据库数据的恢复的过程中,踩了一些坑,下文给出具体的恢复的操作过程。

2.操作步骤

2.1 备份源数据库的ibd文件

整个MySQL数据库数据的恢复都是基于ibd文件的,所以最重要的自然是将源数据库的ibd文件保存下来。

这里要注意的是,MySQL默认的数据保存地点在/var/lib/mysql目录下,这个目录下会有你创建的具体的schema的文件夹,以及这个schema中所有表的ibd文件,我们直接使用SFTP导出整个文件夹即可,后续的恢复操作都会基于ibd文件来展开。

如果你的MySQL之前安装的时候是自己手动指定的安装目录,可以使用下面的命令查询mysql的安装目录,然后备份的操作同上。

find / -name mysql

2.2 准备数据库建表语句

这里可能有些人没有备份建表语句的习惯,大家可以先断开自己本地的网络连接,然后使用自己平时常用的数据库连接工具,直接查看DDL语句,一般数据库连接工具里面都有缓存的数据库的建表语句。

2.3 重新安装新数据库

在新的系统上安装好新数据库,默认安装会安装到地址/var/lib/mysql下。

2.4 新数据库恢复数据具体步骤

1、创建数据库schema

比如我们创建数据库test,并切换到test数据库。在MySQL中执行如下SQL。

create database test;
use test;

2、创建表

这里直接把前面准备好的数据库建表语句全部执行,在MySQL中执行如下SQL。

create table xxx ...

3、移除表空间

这一步是直接把刚才建好的表空间移除,执行命令如下,在MySQL中执行如下SQL。

alter table xxx discard tablespace;

其中xxx为具体的表名,做完这一步的现象就是在/var/lib/mysql/test目录下,刚才因为我们创建表所生成的ibd文件被删除了。

4、上传源数据库ibd文件

前面我们已经备份了源数据库中表的ibd文件,现在将文件使用SFTP工具上传到刚才的/var/lib/mysql/test目录下。(注意:这里的/var/lib/mysql是我本地数据库的安装目录,而test是我数据库的名称,各位具体情况需要根据自己数据库的情况而定)

5、修改ibd文件权限

上一步通过SFTP上传的ibd文件正常应该是root用户上传的,我们需要使用mysql用户来完成剩下的操作,在LinuxShell的命令行中执行下面的命令。

chown mysql:mysql /var/lib/mysql/test/*.ibd

同理,上述的/var/lib/mysql/test是我本机的数据库位置,各位实际操作的时候需要根据自己本机情况进行相应的修改,而*.ibd表示给所有的ibd文件都修改权限。

6、重导表空间

上一步我们已经上传好ibd文件,并修改了文件权限,这一步要做的就是让MySQL识别到刚才上传的数据,重新导入表空间。这一步可以一个表一个表的进行导入表空间,原因是因为有些表的ibd文件可能已经不支持导入了,导入的时候会报错,我们先把可以恢复的表恢复了,在MySQL中执行如下SQL。

alter table xxx import tablespace;

3.常见错误

在操作恢复数据库的过程中,我遇到了一些错误,并且导致了部分表无法恢复成功,在这里总结几种。

3.1 权限问题

由于上传的ibd文件是root用户上传的,导致在MySQL中执行SQL会报错,这个时候通过Shell工具修改ibd文件的权限即可,具体参考2.4节第5步。

3.2 报错不存在CFG文件

这个报错我网上查了一下,有的文章说,在数据库ibd文件同级目录下存在CFG文件,需要和ibd文件一起导入新的数据库,但是我的MySQL版本是8.0.31并没有相关的CFG文件。

后续查阅官方文档,是因为我在最开始建表以后,使用ALTER操作新增了列,导致表结构的存储发生了变化,这被官方称为DDL INSTANT,所以无法恢复。面对这种问题,建议大家平时对数据库数据多多备份,减少数据丢失。

3.3 通过ibd文件恢复数据后自增主键问题报冲突

我有一些表使用了数据库的自增主键,在恢复完数据以后,重新部署了应用,在使用自增主键的表中出现了主键冲突的情况。

原因是通过原来的ibd文件导入数据并没有同步相应的系统表的结构,所以新的MySQL认为自增主键还是从1开始算,实际上数据库中的数据自增列早已增长到一定数目了。针对这个问题,我目前没有想到好的方法,只能先将恢复好的数据库数据导出到SQL,然后删除原表重新建表以后,再重新导入。

当然如果没有使用到系统能力(比如自增主键)的表,是无需删除表再重新导入数据的。

这篇关于从ibd文件恢复MySQL数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051526

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二