drop table!

https://twindb.com/recover-innodb-table-after-drop-table-innodb/

這個blog有介紹,下面是我自己的測試。

首先是安裝工具undrop-for-innodb

這個blog上又說明。其實很簡單自己安裝就是了,報錯的時候應該是缺什麼東西,自己google一下安裝。這裏不介紹這個工具的安裝。這個工具裏面是實驗用的數據庫,執行一些test.sh這個文件就能生成。如果有問題自行解決。

這裏有個條件。innodb_file_per_table 需要關閉,就是mysql是共享表空間

刪掉actor這個表。

然後你要停掉數據庫。
第一步:分析表空間文件。
[root@localhost undrop-for-innodb]# ./stream_parser -f /var/lib/mysql/ibdata1 Opening file: /var/lib/mysql/ibdata1 File information: ID of device containing file:        64768 inode number:                       920134 protection:                         100660 (regular file) number of hard links:                    1 user ID of owner:                       27 group ID of owner:                      27 device ID (if special file):             0 blocksize for filesystem I/O:         4096 number of blocks allocated:          53248 time of last access:            1407318543 Wed Aug  6 17:49:03 2014 time of last modification:      1407318553 Wed Aug  6 17:49:13 2014 time of last status change:     1407318553 Wed Aug  6 17:49:13 2014 total size, in bytes:             27262976 (26.000 MiB) Size to process:                  27262976 (26.000 MiB) All workers finished in 0 sec

第二步:找到表的id
[root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page |-t dictionary/SYS_TABLES.sql | grep sakila/actor -bash: -t: command not found [root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor 000000000580000000041504F4SYS_TABLES"sakila/actor”13 4 1 0 0 “" 0 000000000580000000041504F4SYS_TABLES"sakila/actor”13 4 1 0 0 “" 0 SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/SYS_TABLES' REPLACE INTO TABLE `SYS_TABLES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_TABLES\t' (`NAME`, `ID`, `N_COLS`, `TYPE`, `MIX_ID`, `MIX_LEN`, `CLUSTER_NAME`, `SPACE`);

表ID是13
第三步:找到表的主鍵
[root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 13 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/SYS_INDEXES' REPLACE INTO TABLE `SYS_INDEXES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXES\t' (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`);
接下來是主鍵13的頁 15
第四步:查找葉子節點的數據

[root@localhost undrop-for-innodb]# ./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000015.page -t sakila/actor.sql |  head -5 -- Page id: 50, Format: COMPACT, Records list: Valid, Expected records: (200 200) 00000000051C800000002D0110actor1"PENELOPE""GUINESS""2006-02-15 04:34:33" 00000000051C800000002D011Aactor2"NICK""WAHLBERG""2006-02-15 04:34:33" 00000000051C800000002D0124actor3"ED""CHASE""2006-02-15 04:34:33" 00000000051C800000002D012Eactor4"JENNIFER""DAVIS""2006-02-15 04:34:33

第四步:找回丟失的數據

mkdir -p dumps/default
 cat dumps/default/actor_load.sql 這裏面是找回丟失數據的命令
[root@localhost undrop-for-innodb]#  cat dumps/default/actor_load.sql SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/actor' REPLACE INTO TABLE `actor` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'actor\t' (`actor_id`, `first_name`, `last_name`, `last_update`);


這個前提是你知道表結構定義。。讓後執行一下這兩個命令,丟失的數據回來了。

o了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章