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 查找文件句柄,可以让我们追踪到消失的文件。
抛半砖以求全玉,班门弄斧,不胜惶恐!