
使用 PostgreSQL 9.3。我有一個長時間運行的查詢,更新了大約 800 萬行。顯然出了什麼問題。 2 天后,我收到磁碟空間不足的警報。我停止了查詢,這就是我所看到的。
root@server:/var/lib/postgresql/9.3/main# du -BM * | sort -n
1M global
1M pg_notify
1M pg_serial
1M pg_snapshots
1M pg_stat
1M pg_stat_tmp
1M pg_tblspc
1M pg_twophase
1M PG_VERSION
1M pg_xlog/archive_status
1M mydb.opts
1M mydb.pid
3M pg_subtrans
7M base/1
7M base/12030
7M base/12035
11M base/22029472
21M pg_clog
72M pg_multixact/offsets
315M pg_log
444M pg_multixact/members
516M pg_multixact
625M pg_xlog
3493M base/pgsql_tmp
61851M base/22053373
65372M base
請注意這一點:61851M base/22053373
由於我的實際資料位於儲存在不同磁碟區中的表空間中,因此我認為這是一些堆積起來的臨時交易內容。
有一些關於類似問題的線上帖子,但我沒有找到規範的解決方案。一般來說,建議是“運行 VACUUM FULL”,有時累積的殘留物會消失。這就是我現在正在做的事情,但這需要時間,我擔心我可能會填滿剩餘的磁碟空間(3GB)並導致一切崩潰。
有人有這方面的經驗嗎?這裡存放了什麼?有沒有一種安全的方法可以快速釋放這個空間?或至少將其移至其他地方(我的表空間磁碟上有足夠的空間)。
答案1
我想到了。這是我的錯。這是同事在預設表空間中建立的新資料庫,而不是我們的自訂表空間之一。
對於遇到類似問題的人,以下是我在調查過程中學到的一些內容。base/22053373
就我而言,是資料庫的 oid。你可以看到它是哪個資料庫,如下所示:
SELECT oid, * FROM pg_database
裡面的每個檔案都以 pg 類型(表或其他)的 oid 命名。最大的文件可能來自最大的表。連接到資料庫並從pg_class
集合中選擇以找出哪個。
現在我正在使用將資料庫移至自訂表空間
ALTER DATABASE mydb SET TABLESPACE mytablespace;
我很確定這會解決我的問題。