修復損壞的 Firebird 數據庫
我有一個 200 GB 的 Firebird 數據庫(使用 Firebird 2.1.3 創建,目前執行 2.1.5),它似乎已損壞。當我嘗試進行備份時,我得到:
數據庫文件出現損壞<>
錯誤頁麵類型
頁面0是錯誤類型(預期0找到1)
gds_get_segment失敗
gfix
以一個結尾僵局
我該如何解決?
更新
雖然這個特定的數據庫沒有固定,但我想解決方案是嘗試 IB FirstAID。
推薦閱讀:
這是一個簡短的分步演練:
- 斷開使用者並禁用與數據庫的傳入連接
- 製作數據庫文件的副本(或兩個副本)並進行處理
- 使用帶有 -v 選項的 GFIX 來驗證數據庫文件
- 使用帶有 -v 和 -f 的 GFIX 進行全面驗證
如果問題不是太嚴重,你可以嘗試備份損壞的數據庫並以新名稱恢復:
- 使用 GFIX -mend 準備損壞的數據庫進行備份
- 使用 GBAK -b -g 備份數據庫。-g 禁用垃圾收集
- 使用 GBAK -c 將備份恢復到新數據庫。
如果你成功了,你就解決了問題並且擁有了一個功能數據庫。如果沒有,您可以嘗試創建一個具有相同結構的空數據庫並將數據泵入其中。
備份或恢復失敗的原因之一是存在一些損壞的數據庫觸發器,並阻止連接到數據庫。例如,數據庫觸發器可能使用某個索引損壞的表等。要解決此問題,請使用 isql 工具使用 -nodbtriggers 選項連接到數據庫,然後禁用這些觸發器。您可以稍後在修復其他問題並再次獲得工作數據庫時啟用它們。
還原可能失敗的另一個原因是數據損壞,因此無法滿足某些有效性約束(檢查約束等)。在這種情況下,您可以嘗試使用 -N 恢復數據庫
$$ O_VALIDITY $$命令切換到 gbak。 如果您對修復數據庫過程的更詳細資訊以及某些類型的損壞的解釋感興趣,請查看以下頁面:
http://www.ibphoenix.com/resources/documents/search/doc_5
如果一切都失敗了,您可以嘗試 IBSurgeon 工具,它能夠修復大多數問題並提取數據。此外,IBSurgeon 的網站詳細解釋了數據庫損壞的原因和修復方法:
http://ib-aid.com/option,com_content/task,view/id,58/Itemid,62/
您可以使用十六進制編輯器打開數據庫文件,並按照此處的說明將錯誤的頁麵類型從 0 修復到 1 。它對我有用。
將錯誤的頁數乘以數據庫的頁大小。將數字轉換為十六進制值 使用十六進制編輯器打開數據庫,轉到偏移量 - 您計算的數字。在那個位置,您將看到錯誤的數字 - 將其更改為正確的數字,保存並準備好備份恢復。