前提条件
之前经常有恢复Windows上文件的经历,其实Linux也有同样的机制。
只要保证,误删除文件之后,不要重启电脑即可。这时候如果你是慌的一比,请找资深Liunx专家,因为每个企业的数据都是宝贵的,可以尝试用工具修复,但是你不知道某个工具的特点,和文件系统类型和某个版本的特点等。恢复失败之后对底层数据的伤害有多大,谁也无法预料,术业有专攻。如果有兴趣可以研究一下linux底层文件系统,恢复的手段。
误删除mysql文件之后不能进行服务器重启并且保证mysqld进程不挂掉。
模拟误删除并进行恢复
1、使用rm -rf ib* 删除数据文件和重做日志文件。
删除前状态。
删除后状态:
mysqld进程状态:(这里并不影响数据库的登陆和基本功能,但是只要你一重启服务器,神仙也救不了你!)
2、我们要得到mysqld进程的pid号:1776
netstat -ntlp | grep mysqld
3、查找我们要恢复的文件
ll /proc/1776/fd | egrep 'ib*|ibdata'
图中被圈起来的id(10,14,4,9) 所对应的文件,并且后面标(deleted)的就是我们刚刚rm -rf 删除的文件。
4、锁表,防止恢复时候,数据库写入,恢复失败,哭都来不及。
FLUSH TABLES WITH READ LOCK;
5、把脏页刷入磁盘
set global innodb_max_dirty_pages_pct =0;
show master status; //验证binlog 和pos的信息
show engine innodb statusG;
注意关键信息,表明表被锁住了,且脏页也被刷入磁盘了,lsn等也不变了,在进行下面的恢复。
Modified db pages 0,
Purge done for trx's n:o < 8713 undo n:o < 0 state: running but idle
Ibuf: size 1, free list len 0, seg size 2, 0 merges
Modified db pages 0
mysql> show engine innodb statusG
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
2018-08-30 19:35:26 0x7f2dadfb4700 INNODB MONITOR OUTPUT
=====================================
------------
TRANSACTIONS
------------
Trx id counter 8718
Purge done for trx's n:o < 8713 undo n:o < 0 state: running but idle
FILE I/O
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 19565267
Log buffer assigned up to 19565267
Log buffer completed up to 19565267
Log written up to 19565267
Log flushed up to 19565267
Added dirty pages up to 19565267
Pages flushed up to 19565267
Last checkpoint at 19565267
20 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 424985
Buffer pool size 8192
Free buffers 7232
Database pages 956
Old database pages 372
Modified db pages 0
----------------------------
END OF INNODB MONITOR OUTPUT
============================
1 row in set (0.01 sec)
6、切换目录到
cd /proc/1776/fd
ls
7、开始恢复被rm -rf 删除的数据
通过步骤3,找到恢复文件的id号(10,14,4,9),来进行恢复到被删除文件的之前的具体路径。
cp 10 /usr/local/mysql/data/ib_logfile1
cp 14 /usr/local/mysql/data/ibtmp1
cp 4 /usr/local/mysql/data/ib_logfile0
cp 9 /usr/local/mysql/data/ibdata1
8、验证被删除文件是否被恢复到原来的目录下(结果是文件回来辣,特别开心有木有~)
9、权限处理,(被恢复的文件是在root账户下恢复的,权限就不对了)
10、重启数据库,看看有没有问题!