首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 異常恢復實戰:無主鍵 InnoDB 表資料提取方法

     編輯:MySQL 資料庫相關知識

背景

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 筆

步驟 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';
-- TABLE_ID = 100

SELECT * FROM SYS_INDEXES WHERE table_id=100;
-- 關鍵:TYPE=1 (GEN_CLUST_INDEX), INDEX_ID = 119

步驟 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 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 仍能較完美恢復資料,僅可能產生少量重複記錄。

相關專題

  • MySQL 日誌操作技巧大全
  • MySQL 交易操作技巧匯總
  • MySQL 預存程序技巧大全
  • MySQL 資料庫鎖相關技巧匯總
  • MySQL 常用函數大匯總
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved