本文主要是介绍从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
用户来完成剩下的操作,在Linux
中Shell
的命令行中执行下面的命令。
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数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!