2016-04-27 150 views
5

使用Debian Wheezy,Postgresql 9.3刪除pg_xlog文件後Postgres將不會啓動

我的數據庫因爲保留WAL文件的分區已滿而關閉。 所以,我刪除了./pg_xlog/裏面的所有內容,因爲我不知道它們是什麼(是的,對我而言非常愚蠢)。現在Postgres的服務將無法啓動,雖然問題,根據系統日誌:

00000: could not open tablespace directory "pg_tblspc/16386/PG_9.3_201306121": File or directory not found 
LOCAL: RelationCacheInitFileRemoveInDir, relcache.c:4895 
00000: Primary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6543 
00000: Secondary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6547 
PANIC: XX000: could not locate a valid checkpoint record 
LOCAL: StartupXLOG, xlog.c:5228 

我不是很確定問題是否是它不能找到合適的pg_tblspc關聯或完全沒有檢查點的WAL文件。數據庫存儲位置的實際路徑是/dados/PG_9.3_201306121。我能做些什麼來使服務重新開始?

編輯1: 好吧,我已經設法讓事情回到網上。有些數據庫已經損壞。我已經成功地將其中兩個(他們甚至無法連接到他們,但他們強迫服務重新啓動)DROPDB。我試圖去做另一個腐敗,但錯誤再次與Xlog有關。我試過對它做一個乾淨的恢復,但恢復是不完整的。然後,我創建了一個新的數據庫,並嘗試恢復此數據庫的較舊備份。它也不完整。

現在我不能刪除任何數據庫,也不能創建新的數據庫,我總是得到一個xlog flush request not satisfied錯誤。我試過運行pg_resetxlog,但它似乎沒有做任何事情。錯誤顯示的另一件事是cannot write to block 1 of pg_tblspc/16385/PG_9.3_201306121/36596452/11773,write error may be permanent

EDIT2:上述問題的一部分與該11773文件。我將它重命名爲11773.corrupt,現在數據庫允許我再次創建和刪除。

+0

Nonono,不要繼續使用它!將它備份,關閉它,重命名舊的數據目錄,'initdb'一個新的目錄(或者使用你的包的包裝器,然而你首先設置它),然後將你的轉儲恢復到新的PostgreSQL實例。 –

回答

6

Postgres將不刪除文件pg_xlog裏面

嗯,是後是否啓動。不要這樣做。

我該怎麼做才能使服務重新開始?

那麼,你已經損壞了你的數據庫。從備份中恢復。你有備份,對吧?最好有一個方便的PITR檔案,像PgBarman,你可以在5分鐘前恢復。沒有?

好吧,首先,將損壞的副本歸檔。 https://wiki.postgresql.org/wiki/Corruption

現在。如果幸運的話,pg_resetxlog可以幫助您成功完成數據庫的pg_dump,因此您可以將舊損壞的安裝的datadir放在一邊,initdb一個新的,並將數據庫恢復到該位置。

如果您不幸pg_dump不會成功,或者由於重複主鍵等原因而導致恢復失敗。在後一種情況下,可能需要手動修理垃圾場。如果pg_dump失敗,則適當的操作將取決於它失敗的原因。

所以是的。不要刪除pg_xlog

在PostgreSQL社區中有關於將pg_xlog重命名爲使其更明顯是它是數據庫重要組件的討論,並希望它會在9.7版本中完成。

+0

好吧,我已經備份了,但現在有些數據庫已損壞。那麼,這不會是一個問題,但現在我不能DROP或CREATE數據庫,我總是得到一個「Xlog刷新請求不滿意」錯誤 – Arthur

+0

你必須initdb, –