0001.MySQL通过句柄恢复文件

2021-08-18 10:43:18 浏览数 (2)

MySQL误删除ibd文件,通过句柄恢复:

1.删除物理ibd文件,sbtest2.ibd已经被删除

2.此时不要关闭mysql服务,查询到mysql的句柄号,通过句柄号恢复ibd文件

步骤1:通过mysql pid进程号在proc进入到mysql当前使用的进程,并且找到删除ibd文件的句柄号

代码语言:txt复制
通过ps命令查询出来mysql的pid
ls -alh /proc/$(cat /data/mysql/mysqld3306.pid)/fd

步骤2:如图看到sbtest2.ibd这条记录对应的句柄号是83

步骤3:为了避免进一步数据写入,造成进一步错误,暂时将数据库设置为只读,或者锁表

3.现在记录一下表的记录数和校验值,以便跟恢复后的数据比较:

4.现在通过文件句柄找到消失的数据文件,并将其复制出来(此处注意磁盘空间)

代码语言:txt复制
[root@localhost proc]# cat /proc/$(cat /data/mysql/mysqld3306.pid)/fd/83 >/tmp/sbtest2.ibd
[root@localhost proc]# ll /tmp/sbtest2.ibd 
-rw-r--r--. 1 root root 134217728 8月  16 22:00 /tmp/sbtest2.ibd
[root@localhost proc]# ls -lh /tmp/sbtest2.ibd 
-rw-r--r--. 1 root root 128M 8月  16 22:00 /tmp/sbtest2.ibd

5.现在将文件拷贝回去:

代码语言:txt复制
[root@localhost proc]# cp /tmp/sbtest2.ibd /data/mysql/data/thn/
c[root@localhost proc]# cd /data/mysql/data/thn/
[root@localhost thn]# chown mysql.mysql sbtest*
[root@localhost thn]# /etc/init.d/mysqld restart
Shutting down MySQL..... SUCCESS! 
Starting MySQL.. SUCCESS! 

代码语言:txt复制
mysql> use thn
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> checksum table sbtest2;
 ------------- ------------ 
| Table       | Checksum   |
 ------------- ------------ 
| thn.sbtest2 | 1112280794 |
 ------------- ------------ 
1 row in set (0.37 sec)

结论:为了验证拷贝回来的是否正常使用,将数据库重启了一下,

注:第五步拷贝回去的时候也可以将数据库关闭,之后在拷贝回去,然后启动数据库

场景为客户环境误操作之后在本地进行还原演练,模拟误删之后的恢复操作!

原理:

Linux 删除文件其实是减少了对文件的使用数,当使用数降为 0 时,才正式删除文件。

所以当我们执行 rm 时,由于 ibd 文件还在被 MySQL 使用,文件其实并没有被真实删除,只是没办法通过文件系统访问。通过 proc 查找文件句柄,可以让我们追踪到消失的文件。

抛半砖以求全玉,班门弄斧,不胜惶恐!

0 人点赞