1、事情起因
客户为了清理磁盘空间,误删除mysql的ibdata1和ib_logfile文件,但删除后,空间并没有释放。
首先从数据库的进程入手,看看进程所处的状态,在系统的/proc下有每个进程的运行状态,简单
执行几个命令:
[root@localhost ~]# ps -ef|grep mysqld|awk '{print $1,$2}'|grep mysql
mysql 4070
[root@localhost ~]# ll /proc/4070/fd|grep -e ibdata -e ib_
lrwx------ 1 root root 64 3月 21 16:51 3 -> /usr/local/mysql/data/ib_logfile0 (deleted)
lrwx------ 1 root root 64 3月 21 16:51 8 -> /usr/local/mysql/data/ib_logfile1 (deleted)
lrwx------ 1 root root 64 3月 21 16:51 9 -> /usr/local/mysql/data/ibdata1 (deleted)
可以看到,被删除的三个文件ibdata1、ib_logfile0、ib_logfile1在内存中已经标记为deleted了,可见文件
确实是被删除了。
mysqld在运行状态下,会保持ibdata1、ib_logfile0、ib_logfile1这些文件为打开状态,即使把
它们删除了,它们仍旧存在于内存文件系统中,所以,mysqld仍然可以对其进行读写。只要mysqld
服务不重启,就可以通过proc文件系统找到这几个被删除的文件。
这也解释了为何删除这三个文件后,磁盘空间却没有释放的原因。
要恢复mysql数据,首先需要停止目前的写入、更新、删除等操作,最后才能拷贝文件,如何操作
呢,可执行下面几个SQL:
mysql>FLUSH TABLES WITH READ LOCK;
或者干脆断开此数据库服务器的网络
3、恢复被删除的文件
在数据库没有任何写入后,就可以恢复ibdata1、ib_logfile0、ib_logfile1这些文件了,执行如
下操作:
[root@localhost ~]# cp /proc/4070/fd/8 /usr/local/mysql/data/ib_logfile1
[root@localhost ~]# cp /proc/4070/fd/9 /usr/local/mysql/data/ibdata1
[root@localhost ~]# cp /proc/4070/fd/3 /usr/local/mysql/data/ib_logfile0
接着,修改文件权限为mysql,操作如下:
[root@localhost ~]# chown mysql:mysql /usr/local/mysql/data
所有操作完成后,最后,还需要重启下数据库服务:
[root@localhost ~]# /etc/init.d/mysqld restart
今天要分享给大家的数据恢复工具是ext4magic,对于ext4数据恢复支持
非常强大的。可以做到基于时间点、inode、指定文件恢复等等。恢复时
需要卸载分区,或以只读方式挂载恢复。
1、安装ext4magic
这里我们使用centos7.9系统,误删除磁盘分区格式为ext4,进行案例演示。对于已删除
的ext3文件系统,推荐使用ext4magic-0.2.4。对于已删除的ext4文件系统,请使用
ext4magic-0.3.0。
ext4magic的安装包,我已经放在系统镜像盘的/data/day4目录下,使用rpm包快速安装。
[root@dbserver1 ~]# rpm -ivh ext4magic-0.3.2-3.10.x86_64.rpm
[root@dbserver1 ~]# ext4magic -V
2、使用ext4magic恢复数据
这里加入误删除文件所在的分区为/dev/sda7,第一步,执行打印输出删除目录的Inode
[root@dbserver1 ~]# ext4magic /dev/sda7 -f /
[root@dbserver1 ~]# ext4magic /dev/sda7 -I 2
上面两个命令实现的功能一样。接着,就可以进行恢复删除的文件了,可以恢复整个磁盘分区的所
有文件,也可以仅恢复被删除的文件。
如果仅恢复误删除的文件和目录,可执行如下操作:
[root@dbserver1 ~]# ext4magic /dev/sda7 -r -d /backup/data
[root@dbserver1 ~]# ext4magic /dev/sda7 -m -d /backup/data
上面两条命令实现的功能一样,仅恢复误删除的文件或目录。
注意,-d是指定恢复后文件存储路径,此路径建议是一个独立的磁盘分区,并且磁盘空间一定要大,至少大于
要恢复的数据所占用的磁盘空间大小。
2、使用ext4magic恢复数据
几个重点参数选项,总结如下:
-r:恢复目录树,恢复已删除文件
-R:恢复已删除和未删除文件,空文件也恢复,完全恢复目录。
如果磁盘分区所有数据被删除,那么“ -R ”和“ -r ”作用是相同的。
此外,跟-R、-r选项相同功能的还有-M、-m选项:
-m:恢复已删除文件,空文件也恢复
-M:恢复已删除和未删除文件,全盘恢复情况下使用。
最后,ext4magic还可以根据时间点进行恢复,例如,恢复一天内的数据,执行如下命令:
[root@dbserver1 ~]# ext4magic /dev/sda7 -a $(date -d "-1 day" +%s) -b $(date -d "-0 day" +%s) -m
如果不指定恢复数据的路径,那么会在当前目录下自动创建RECOVERDIR,恢复数据会放到此目录下。
给运维的启示
(1)、备份不是万能的,但是没有备份是万万不行的。
(2)、运维要有充足的知识储备,执行每条命令都要能做到“知其然知其所以然”。
(3)、避免“人肉运维” ,DevOps模式可以避免人工失误。
欢迎来撩 : 汇总all