2012-06-14 98 views
10

我與我的PostgreSQL數據庫,從而導致電涌後多個錯誤:修復損壞的數據庫PostgreSQL的

我無法從我的數據庫訪問大多數表。當我嘗試例如select * from ac_cash_collection,我得到的foolowing錯誤:

ERROR: missing chunk number 0 for toast value 118486855 in pg_toast_2619

當我嘗試的pg_dump我收到以下錯誤:

 
Error message from server: ERROR: relation "public.st_stock_item_newlist" does not exist 
pg_dump: The command was: LOCK TABLE public.st_stock_item_newlist IN ACCESS SHARE MODE 

我繼續嘗試運行整個數據庫的重建索引,我其實已經離開了它,去睡覺了,我發現它早上沒有做任何事情,所以我不得不取消它。

我需要一些幫助,以儘快解決這個問題,請幫助。

+0

我想電源故障會破壞硬盤,你很可能需要恢復備份 –

+0

你試過[谷歌](https://www.google.com/webhp?q=postgresql%20ERROR% 3A%20missing%20chunk%20number)? – lanzz

+0

電源浪涌也破壞了備份... –

回答

3

在你做任何事情其他http://wiki.postgresql.org/wiki/Corruption和行爲上的說明。如果不這樣做,風險會使問題變得更糟。


有在Fine Manual列出兩個配置參數可能是使用:ignore_system_indexeszero_damaged_pages。我從來沒有使用過它們,但是如果我絕望了,我會......

我不知道他們是否幫忙對抗吐司桌。無論如何,如果將它們設置爲使您的數據庫再次變得可用,我會{備份+刪除+恢復}將所有表和目錄再次變爲新生的形狀。成功!

+2

添加了關於先複製副本的警告;這是非常重要的。 'zero_damaged_pa​​ges' *會影響TOAST表格(以及索引和其他所有內容)。它通過*擦除數據*來工作,而不是恢復它。在使用它之前,請仔細考慮,或者使用pg_resetxlog或任何其他「大錘子」恢復工具。 –

+0

優秀的建議,恕我直言。重讀OQ,似乎也有損壞的目錄涉及。 – wildplasser

+0

這裏可能無法備份。如果您的表使用擴展存儲,那麼預計'pg_dump'會失敗,並出現「壓縮數據已損壞」等錯誤。 – kontextify

4

如果你有備份,只需從它們中恢復。

如果沒有 - 你剛剛得知你爲什麼需要定期備份。 PostgreSQL沒有什麼可以做,如果硬件不當行爲。另外,如果您再次遇到這種情況,請先停止PostgreSQL,並對所有內容進行完整的文件級備份 - 所有表空間,WAL等。這樣您就有了一個已知的起點。

所以 - 如果你還想恢復一些數據。

  1. 嘗試傾銷單獨的表。以這種方式獲取你的能力。
  2. 刪除索引,如果他們造成問題
  3. 轉儲表部分(id = 0..9999,1000..19999等) - 這種方式,你可以確定哪些行可能會損壞並轉儲更小的部分恢復還有什麼好的。
  4. 嘗試傾銷只是某些列 - 大文本值存儲外的線(在敬酒表),因此避免他們可能會得到你的數據的其餘部分進行。
  5. 如果你的系統表損壞了,那麼你正在進行大量的工作。

這是很多工作,然後你需要審查你已經恢復的東西,並試圖弄清楚什麼是缺失/不正確。

還有更多的事情可以做(創建在某些情況下空塊可以讓你傾倒的部分數據),但他們都比較複雜和繁瑣的,除非該數據顯得尤爲可貴就得不償失了。

主要信息從這個拿走 - 請確保您定期備份,並確保他們的工作。

+1

+1今天我很開心已經瞭解了重要的是如何做BACKUPS和我已經成功地恢復了數據庫。 – Claudix

1

在您執行任何其他操作之前,請先取一個完整的受損數據庫的文件系統級副本。

http://wiki.postgresql.org/wiki/Corruption

如果不這樣做會破壞什麼導致了腐敗證據,也就是說,如果你的修爲努力去不好,更糟糕的是,你不能撤消他們。

立即複製現在