首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 異常恢復實戰:無主鍵 InnoDB 表資料提取與恢復完整流程

     編輯:MySQL 綜合教學

MySQL 異常恢復實戰:無主鍵 InnoDB 表資料提取與恢復完整流程

背景

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 筆測試資料

步驟 1:解析 ibdata1 系統表空間

./stream_parser -f /var/lib/mysql/ibdata1
-- 輸出 pages-ibdata1/ 目錄含各類型頁面檔案

步驟 2:恢復資料字典

./recover_dictionary.sh
-- 建立 test 資料庫並導入 SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS

步驟 3:查找目標表的 index_id

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

步驟 4:提取資料

./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 行 (含部分重複,整體恢復完整度高)

關鍵要點總結

  1. 無主鍵表恢復關鍵在於識別 GEN_CLUST_INDEX (TYPE=1)
  2. stream_parser 解析系統表空間而非 .ibd 檔
  3. 恢復出資料可能含重複,需應用層去重
  4. 工具鏈:stream_parser → recover_dictionary.sh → c_parser
  5. 適用場景:誤刪表、檔案系統損壞、無備份環境下的資料搶救
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved