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下面的文件也不再存在