2011-05-04 77 views
0

我使用PostgreSQL有限硬盤空間的嵌入式系統上。現在DB驅動器已滿。當我刪除數據時,似乎並沒有釋放任何空間。我嘗試了VACUUM FULL,但那需要空間。那麼刪除最後剩下的索引。PostgreSQL的:DELETE不會釋放內存

如何騰出空間而不亂刪東西,任何想法?我可以承受從後面丟失一些數據,但我似乎無法真正做到這一點,因爲沒有足夠的空間來使用VACUUM FULL。

+1

哪個'PostgreSQL'版本? – Quassnoi 2011-05-04 12:48:43

+0

查看下面的答案,但一般注意事項:如果您運行通用OLTP式PostgreSQL數據庫,並且磁盤運行已滿,則將其擰緊。添加監控併爲這些情況保留一些備用磁盤空間。 – 2011-05-04 17:14:47

回答

0

此時最簡單的答案是將數據庫轉儲到其他驅動器/計算機(例如,如果您有多個數據庫,則使用pg_dumppg_dumpall,並且要記住需要特殊的大對象備份/恢復進程),然後刪除並重新創建數據庫。

如果只剩下一點空間,您可以嘗試vacuum full smallesttable,這可能會完成並釋放一些空間來吸取下一個最小的表格,依此類推。

如果你最終完全填滿驅動器,數據庫服務器可能會拒絕啓動,你將不能夠做任何的那些。在這種情況下,可以將整個數據目錄移動到具有相同CPU架構和更多磁盤空間的另一臺計算機上,然後在那裏啓動postgresql以執行真空。

+0

問題是我通過56k調制解調器連接到嵌入式系統..所以備份數百兆數據庫是不可能的(由於連接不良每隔幾分鐘就會斷開連接)。而且只有一張桌子需要很多空間,所以我不能真正將最小的空間倒閉 - 只有一張桌子需要所有的數據。 – MrB 2011-05-04 13:08:15

+0

噢,有一個想法:寫預先鎖(或某事)有所謂的檢查點,佔用大量空間(總共幾個100MB)。我可以以某種方式刪除這些檢查點嗎?這應該夠了。 – MrB 2011-05-04 13:13:26

+0

@MrB預寫日誌文件是postgresql存儲尚未寫入數據庫的數據的地方,如果您未使用歸檔,它會在循環中重用相同的文件,因此即使在檢查點之後來自WAL的數據並將其寫入數據庫文件),您不能只刪除文件。 postgresql.conf中的'checkpoint_segments'設置是什麼? – DerfK 2011-05-04 15:24:14

1

PostgreSQL使用MVCC模型,這意味着刪除的記錄將它們的空間標記爲空閒(在刪除它們的事務已被提交之後),但它仍保留在表中。

之前PostgreSQL 9.0VACUUM FULL用於移動表內的數據,而不需要額外的空間。

PostgreSQL 9.0中,VACUUM FULL的行爲發生了變化,現在需要額外的空間來存放表的完整副本。

您可以嘗試從表中刪除索引和真空他們一個接一個,從至少一個開始。

0

在某些情況下,真空(不完全)可以回收一些磁盤空間。 (我認爲它會返回完全死於操作系統的頁面。)這可能釋放足夠的空間,從VACUUM FULL開始。但是讓一個表增長到超過磁盤可用空間的數量並不是一個好主意。