mysql從5.6.17開始自動設置innodb_file_per_table為on,每個表設置單獨表空間,數據不是集中存放在ibdata1里。下面測試下無備份后drop表后的恢復。
前奏生成數據字典https://www.cnblogs.com/omsql/p/9253234.html
刪除表前的准備 mysql> SHOW VARIABLES LIKE 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec) mysql> show create table tb \G *************************** 1. row *************************** Table: tb Create Table: CREATE TABLE `tb` ( `id` int(11) NOT NULL, `name` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) [root@redis01 tmp]# cd /data/mysql/ht/ [root@redis01 ht]# ls db.opt person.frm person.ibd shirt.frm shirt.ibd tb.frm tb.ibd mysql> select * from tb; +----+-------+ | id | name | +----+-------+ | 1 | zhou | | 2 | 430 | | 3 | YYF | | 4 | ChuaN | | 5 | Faith | | 6 | zhou | | 7 | 430 | | 8 | YYF | | 9 | ChuaN | | 10 | Faith | | 11 | zhou | | 12 | 430 | | 13 | YYF | | 14 | ChuaN | | 15 | Faith | +----+-------+ 15 rows in set (0.00 sec) mysql> checksum table tb; +-------+------------+ | Table | Checksum | +-------+------------+ | ht.tb | 1499182360 | +-------+------------+ 1 row in set (0.00 sec) mysql> drop table tb; Query OK, 0 rows affected (0.11 sec) 刪除表后相對表的表空間文件也刪除 [root@redis01 ht]# ls db.opt person.frm person.ibd shirt.frm shirt.ibd tb.frm tb.ibd [root@redis01 ht]# ls db.opt person.frm person.ibd shirt.frm shirt.ibd 失誤操作后建議關閉mysql,避免空間被占用 mysqladmin -u root -p shutdown [root@redis01 data]# df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg_redis01-lv_root 20830728 10397672 9459576 53% / tmpfs 2022820 72 2022748 1% /dev/shm /dev/sda1 487652 85768 372188 19% /boot /dev/mapper/vg_mysql-lv_mysql01 303788 114540 189248 38% /data 從磁盤里查找,分別得到每個頁文件 stream_parser stream_parser 是分析 ibdata 文件(或者掛載的磁盤),得到每一個數據頁的 ./stream_parser -f /dev/mapper/vg_mysql-lv_mysql01 -t 303788k 查看頁文件里的具體數據 c_parser 其實是按照 innodb 存儲數據的格式來分析哪些是我們需要的數據本身,所以頁上的數據可以分為兩類:1. 用戶數據 2. 元數據。而元數據的功能其實並不相同,有些損壞無傷大雅,有些損壞卻可能導致整個頁無法恢復。 ./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql | head -5 生成建表語句 [root@redis01 undrop-for-innodb]# cat tb.sql CREATE TABLE `tb` ( `id` int(11) NOT NULL, `name` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 查看恢復出來的數據 [root@redis01 undrop-for-innodb]# ./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql | head -6 -- Page id: 3, Format: COMPACT, Records list: Valid, Expected records: (5 5) 000000000507 A70000011B0110 tb 1 "zhou" 000000000507 A70000011B011C tb 2 "430" 000000000507 A70000011B0128 tb 3 "YYF" 000000000507 A70000011B0134 tb 4 "ChuaN" 000000000507 A70000011B0140 tb 5 "Faith" 生成腳本 ./c_parser -6f pages-vg_mysql-lv_mysql01/FIL_PAGE_INDEX/0000000000000041.page -t tb.sql > dumps/default/tb 2> dumps/default/tb_TABLES.sql 先建表在導入恢復出來的數據 mysql -u root -p ht < tb.sql mysql -u root -p ht < dumps/default/tb_TABLES.sql mysql> select * from ht.tb; Empty set (0.00 sec) mysql> select * from ht.tb; +----+-------+ | id | name | +----+-------+ | 1 | zhou | | 2 | 430 | | 3 | YYF | | 4 | ChuaN | | 5 | Faith | | 6 | zhou | | 7 | 430 | | 8 | YYF | | 9 | ChuaN | | 10 | Faith | | 11 | zhou | | 12 | 430 | | 13 | YYF | | 14 | ChuaN | | 15 | Faith | +----+-------+ 15 rows in set (0.00 sec)