Innodb單表資料物理恢復 • cenalulu's Tech Blog
本文將介紹使用物理備份恢復Innodb單表資料的方法
前言:
隨著innodb的普及,innobackup也成為了主流備份方式。物理備份對於新建slave,全庫恢復的需求都能從容應對。 但當面臨單表資料誤刪,或者單表誤drop的情況,如果使用物理全備進行恢復呢? 下文將進行詳細分析。 恢復過程中需要用到的工具,percona data recover tool PS:以下所有方案僅支援
innodb-file-per-table = 1
的情況 注意: 以下操作非文件推薦,切勿在沒有測試的情況下直接在production環境使用!!!
情況一:邏輯誤操作,誤刪部分資料
這種情況可以用來自同一臺機器的的最近一次物理備份中的ibd恢復覆蓋,且備份後table沒有被recreate過。 這種情況是最簡單的,備份時的ibd檔案(後稱老ibd)中的space id和index id 與 新ibd的space id 和index id一致。 且和ibdata檔案中的space id和index id一致。因此,物理檔案可以直接覆蓋做恢復。
以下是詳細步驟
準備階段
Step pre 1: 物理備份
Step pre 2 : 停止資料庫對外服務
或者 停止所有業務連線並且set global innodb_max_dirty_pages_pct =0
操作階段
Step 0 : apply log
Step 1 : 備份現在的ibd檔案(可選)
Step 2 : 捨棄現在ibd檔案
Step 3 : 複製備份ibd檔案
Step 4 : 匯入ibd檔案
情況二:誤刪 table,表結構已經被drop了
這種情況稍複雜,不過恢復過程還是比較容易操作的。由於table被drop後的space id會留空因此備份檔案的space id不會被佔用。
我們只需要重建表結構,然後把ibdata中該表的space id還原,物理檔案可以直接覆蓋做恢復了。
Step 1 : 重建表
mysql> create table testibd (UserID int);
Step 2 : 關閉mysql服務(必須)
Step 3: 準備ibd檔案 apply log
Step 4 : 備份現在的ibd檔案(可選)
Step 5 : 複製備份ibd檔案
Step 6 : 使用percona recovery tool 修改ibdata
輸出結果
Step 7 : 使用percona recovery tool 重新checksum ibdata
重複執行以下命令,直到程式沒有輸出為止。
輸出結果
Step 8 : 啟動mysql服務
參考文件:
http://www.chriscalender.com/?p=28
http://www.mysqlperformanceblog.com/2011/05/13/connecting-orphaned-ibd-files/
http://blogs.innodb.com/wp/2012/04/innodb-transportable-tablespaces/
http://www.mysqlperformanceblog.com/2012/01/25/how-to-recover-a-single-innodb-table-from-a-full-backup/