Postgresql

如何回收由部分建構並因斷電而終止的索引佔用的空間

  • August 5, 2015

我在 mac (10.10.4) 上執行 postgres (postgis) 9.4.2。

我有幾張大桌子(幾個 TB)。

在其中一個索引建構過程中,大約需要一周時間,我觀察到可用 HD 空間下降,正如你所期望的那樣,當斷電持續時間超過電池單元和系統時,索引將完成的點幾乎下去了。我關閉了緩衝區,並且fillfactor=100在建構期間因為它是一個靜態數據源。重新啟動時,驅動器上剩餘的可用空間正是索引建構接近結束時的位置。真空分析不會釋放空間。

我嘗試放下桌子並重新攝取,但這並沒有減少空間。現在我在一個沒有足夠空間來建構索引的地方。

索引建構過程中生成的文件是否由於停電期間機器停機的方式而陷入某種困境,系統無法將其刪除?

當我查看數據庫中的表大小 + 索引(這是該驅動器上的唯一數據)時,它們加起來約為6TB。驅動器是8TB,驅動器上只剩下不到500GB的空間,所以似乎在某個地方失去了大約 1.5TB,這大約是索引的大小。

有任何想法嗎?

通常我們希望當 postgres 重新啟動時,崩潰恢復過程會從數據目錄中刪除與回滾索引相關的文件。

讓我們假設它不起作用,或者至少必須手動檢查它。

應該在 datadir 中的文件列表可以通過如下查詢來建立:

select pg_relation_filenode(oid)
  from pg_class
 where relkind in ('i','r','t','S','m')
   and reltablespace=0
 order by 1;

reltablespace=0用於預設表空間。如果有問題的索引是在非預設表空間中創建的,則0必須將其替換為pg_tablespace.

i,r,t,S,m inrelkind分別對應索引、表、toast 空間、序列、物化視圖。所有這些對象的數據都在名稱匹配的文件中pg_relation_filenode(oid)

在磁碟上,數據文件位於通過獲取的數據庫的$PGDATA/base/oid/位置。如果我們不是在談論預設表空間,則被替換為。oid``oid``select oid,datname from pg_database``base``PG_version_somelabel

列出並排序與該目錄中的 relfilenodes 匹配的文件:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(實際上只保留大於 1Gb 的關係的第一段。如果有未附加到任何東西的揮之不去的段,則應單獨考慮)

並將該文件與上述查詢的結果進行比較。

如果存在與 db 知道的任何對像不對應的延遲數據文件,它們應該出現在該差異中。

引用自:https://dba.stackexchange.com/questions/109092