InnoDB 異常恢復通常要求有主鍵或唯一索引,但實際上可透過表級 index_id (GEN_CLUST_INDEX) 進行恢復,無主鍵亦可操作。
CREATE TABLE t1 ( messageId VARCHAR(30) NOT NULL, tokenId VARCHAR(20) NOT NULL, mobile VARCHAR(14), msgFormat INT(1) NOT NULL, msgContent VARCHAR(1000), scheduleDate TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', deliverState INT(1), 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'; -- ID=100, TYPE=1 SELECT * FROM SYS_INDEXES WHERE table_id=100; -- TABLE_ID=100, ID=119, NAME=GEN_CLUST_INDEX, TYPE=1, PAGE_NO=2951 -- 關鍵:無主鍵表的聚簇索引名為 GEN_CLUST_INDEX,TYPE=1
./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 ... t1 "82334502212106951" "SDK-BBX-010-18681" "13718311436" 8 "驗證碼內容" "2010-01-01 00:00:00" 0 "1970-01-01 07:00:00" ... # 統計行數 cat /tmp/2.txt | grep -v "Page id:" | wc -l -- 380,731 行 (含部分重複,整體恢復完整度高)
GEN_CLUST_INDEX (TYPE=1)stream_parser 解析系統表空間而非 .ibd 檔