InnoDB 異常恢復通常要求主鍵或唯一索引,但實際上可透過表級 index_id(GEN_CLUST_INDEX 類型)進行恢復。
CREATE TABLE `t1` ( `messageId` VARCHAR(30) NOT NULL, `tokenId` VARCHAR(20) NOT NULL, `mobile` VARCHAR(14) DEFAULT NULL, `msgFormat` INT(1) NOT NULL, `msgContent` VARCHAR(1000) DEFAULT NULL, `scheduleDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', `deliverState` INT(1) DEFAULT NULL, `deliverdTime` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 插入測試資料,最終 326,656 筆
./stream_parser -f /var/lib/mysql/ibdata1 # 產生 pages-ibdata1/ 目錄
./recover_dictionary.sh # 建立 test 資料庫及 SYS_TABLES/SYS_COLUMNS/SYS_INDEXES/SYS_FIELDS 表
SELECT * FROM SYS_TABLES WHERE name='test/t1'; -- TABLE_ID = 100 SELECT * FROM SYS_INDEXES WHERE table_id=100; -- 關鍵:TYPE=1 (GEN_CLUST_INDEX), INDEX_ID = 119
./c_parser -5f pages-ibdata1/FIL_PAGE_INDEX/0000000000000119.page -t dictionary/t1.sql > /tmp/2.txt 2>2.sql
-- 輸出範例 -- Page id: 10848, Format: COMPACT, Records list: Valid, Expected records: (73 73) 00000002141B 0000009924F2 80000027133548 t1 "82334502212106951" "SDK-BBX-010-18681" "13718311436" 8 "驗證碼內容" "2010-01-01 00:00:00" 0 "1970-01-01 07:00:00" ... # 共恢復 380,731 行(含少量重複),整體完整度極高
無主鍵情況下透過聚簇索引 ID 仍能較完美恢復資料,僅可能產生少量重複記錄。