pg 檔案塊損壞的修復措施。
抄來了的
比較忙,沒有時間測試,先放這裡了
pg 沒有檔案塊級別的資料庫恢復操作。
由於磁碟壞道或者是記憶體問題等硬體上的原因,有時候會導致資料庫的資料檔案的一些資料塊的損壞,使得某些表不能正常訪問,本文談一下PostgreSQL資料塊損壞時候,表資料的恢復方法。
PostgreSQL採用一個表存放在一個或者多個物理檔案,所以資料塊的損壞一般只會影響到一個表,使得該表的資料不能查詢或者是備份,下面是一個常見的異常的例子:
# select * from test ;
ERROR: invalid page header in block 1 of relation base/34780/34781
這個錯誤是說資料所在的目錄下面base子目錄,oid為34780的資料庫,表的檔案id為34781的表(即上述例子的test)的第一頁(注意是從0頁開始)資料塊的頭出現了錯誤,所以資料庫不能訪問。
資料塊的損壞的情形比較複雜,所以如何恢復,或者是能恢復到什麼情形不能一概而論。最好的情況是丟失一個資料塊裡面的所有記錄(也有可能只丟失某些記錄, 但是方法比較複雜),最壞也有可能整個表丟失。PostgreSQL沒有提供像Oracle那樣的檔案恢復或者是塊修復的功能,但也有一些方法可以修復 表,這裡簡單討論一下一個資料塊損壞的情況下,如何恢復。
最簡單的方法是,用備份恢復!如果你有做備份和日誌歸檔,則出現問題以後,恢復到最新即可。如果沒有備份,則請參考下面的方法。
重要:在做下面的操作前,先把資料庫的資料檔案的目錄先備份!!!!!
方法1 利用引數zero_damaged_pages
PostgreSQL提供了一個隱藏引數zero_damaged_pages, 當這個引數為true的時候,會忽略所有資料有損壞的頁面。設定的方法為:開啟postgresql.conf檔案,在檔案的新增一個引數 zero_damaged_pages = true, 重起PostgreSQL。
設定完後,當訪問表的時候,會提示說已經忽略損壞的頁面:
# select count(*) from test ;
WARNING: invalid page header in block 1 of relation base/34780/34781; zeroing out page
count
-------
760
(1 row)
該表原有1000條記錄,由於一個頁面損壞,丟失了240條記錄。表可以訪問以後,可以把表dump下來,或者是select到另外一張臨時表,然後把原來的表刪除掉重建。當然如果有其他外部約束的話,相關的表和索引也要處理,這裡不詳細討論。
這種方法不會對物理檔案作修改,只是把記憶體上,損壞頁面的快取變為0。
方法2 手動清除損壞的頁面
在某些情形下,zero_damaged_pages可能不一定有些,這時可以嘗試手動把壞的頁面清除。
根據錯誤提示 ERROR: invalid page header in block 1 of relation base/34780/34781 我們可以找到相應的檔案, 檔案的路徑為: 資料目錄/base/34780/34781,只要用工具手動把上面提示的壞塊清除即可。在Linux下面可以用dd工具把相應的頁面清除:
$dd if=/dev/zero f=/home/postgres/data/base/34780/42995 bs=8192 seek=1 count=1 conv=notrunc
清除完後,查詢表即可正常訪問。
# select count(*) from test ;
count
-------
760
(1 row)
上面簡單討論了一下資料塊損壞的表的恢復方法。由於這些方法都是有一定的侷限性,而且丟失資料的資料量也不是完全確定,所以平時一定要做好備份工作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-732673/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 修復損壞的資料塊
- SQL Anywhere db檔案損壞修復 DB檔案修復 DB資料庫修復SQL資料庫
- system資料檔案頭損壞修復
- ORACLE中修復資料塊損壞Oracle
- 使用dbms_repair修復塊損壞AI
- InterBase資料庫檔案損壞的修復方法資料庫
- linux檔案系統損壞如何修復Linux
- 利用RMAN修復資料檔案中的壞塊
- 磁碟損壞造成RMAN備份檔案有壞塊的恢復案例
- [轉] Linux Ext3檔案系統超級塊損壞後的修復Linux
- 修復損壞的gzip壓縮檔案之原理篇
- 妙用安裝盤修復損壞的系統檔案(轉)
- Oracle中匯出修復資料塊損壞Oracle
- Oracle中模擬修復資料塊損壞Oracle
- 損壞控制檔案的恢復方法
- 某個表空間的資料檔案損壞的修復思路
- RMAN修復壞塊
- PG 資料庫檔案損壞的另一個不完全恢復方案.資料庫
- Win10系統損壞的cbs.log檔案如何修復Win10
- 資料庫檔案壞塊損壞導致開啟時報錯的恢復方法資料庫
- 單個控制檔案損壞的恢復
- MongoDB 資料檔案損壞修復救命repair與致命危險MongoDBAI
- LINUX 檔案系統損壞後遠端修復方案薦Linux
- ORACLE 10g中使用BBED修復損壞資料檔案Oracle 10g
- SQL Server ldf 檔案損壞恢復SQLServer
- 修復損壞的gz或tar.gz壓縮檔案之方法篇
- Linux檔案系統損壞後的修復技巧詳細介紹Linux
- 圖解gzip壓縮檔案底層結構及檔案損壞的修復方法圖解
- 【BBED】 SYSTEM檔案頭損壞的恢復(4)
- 資料檔案丟失損壞的恢復--
- 某個控制檔案損壞的恢復案例
- REDO檔案丟失或者損壞的恢復
- UNDO 表空間檔案損壞的恢復
- 一次控制檔案損壞的恢復
- linux下修復磁碟損壞Linux
- 修復檔案終結者病毒破壞的檔案
- dataguard主庫壞塊的修復
- 記錄一次 HotPE 導致的檔案系統損壞及修復