linux系统利用proc目录恢复删除文件,linuxproc


ref: http://blog.csdn.net/jesseyoung/article/details/42236615
修改innodb共享表空间转换为独立的表空间

使用mysql模拟演示在linux下使用/proc目录来恢复删除数据

具体的操作如下,为了便于演示,这里将mysql的共享表空间设置为独立表空间

; 保证此变量的值为on
mysql> show variables like '%per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

; 创建表
CREATE TABLE `t` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

; 插入数据
INSERT INTO t VALUES (NULL);

; 查看数据条数
mysql> select count(*) 'sum' from t;
+-----+
| sum |
+-----+
|   8 |
+-----+
1 row in set (0.00 sec)

; 删除数据
[root@MC-M mongo]# pwd
/var/lib/mysql/mongo
[root@MC-M mongo]# ls
db.opt  t.frm  t.ibd
[root@MC-M mongo]# rm t.ibd
rm: remove regular file `t.ibd'? y
[root@MC-M mongo]# ls
db.opt  t.frm

# 从这里也可以看出数据并没有删除
mysql> INSERT INTO t VALUES (NULL);
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> INSERT INTO t VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

mysql> select count(*) 'sum' from t;
+-----+
| sum |
+-----+
|  11 |
+-----+
1 row in set (0.00 sec)

# 查看mysql进程号
# 可以从lsof中看出该文件对应的文件描述符是32
[root@MC-M fd]# lsof | grep t.ibd
mysqld    19760     mysql   32uW     REG                8,3    98304       2450 /var/lib/mysql/mongo/t.ibd (deleted)
[root@MC-M fd]# ll /proc/$(pidof mysqld)/fd | grep t.ibd
lrwx------ 1 root root 64 Jan  9 19:28 32 -> /var/lib/mysql/mongo/t.ibd (deleted)

# 在恢复前,如有必要需要先锁表
lock table t read;
# 如果恢复完成后,执行下面命令解锁
unlock tables;

# 恢复文件
[root@MC-M fd]# cp  /proc/$(pidof mysqld)/fd/32 /var/lib/mysql/mongo/t.ibd
[root@MC-M fd]# chown mysql:mysql !$
chown mysql:mysql /var/lib/mysql/mongo/t.ibd
[root@MC-M fd]# ls -l /var/lib/mysql/mongo/
total 112
-rw-rw---- 1 mysql mysql    61 Oct 19 16:23 db.opt
-rw-rw---- 1 mysql mysql  8556 Jan  9 19:22 t.frm
-rw-r----- 1 mysql mysql 98304 Jan  9 19:37 t.ibd

# 可以通过重启服务来验证数据有没有丢失,因为重启之后pid肯定会发生变化,所以proc下面的文件也不再存在。

相关内容