Postgresql

為 Postgresql 後端設置臨時文件的位置 (9.3.10)

  • January 12, 2021

是否可以為 Postgresql 後端(版本 9.3.10)設置臨時文件創建的位置?

這是我的場景:我的 Postgresql DB 駐留在帶有 Ubuntu 14.04 作業系統的專用 VM 中。我的 VM 配備了由我的基礎架構提供商提供的200GB 臨時高性能 SSD 儲存,用於應用程序和程序的短期儲存。這是它的樣子:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       221G  9.9G  200G   5% /mnt

我的磁碟空間不足,並且必須執行一些分析查詢,由於臨時文件的創建,這些查詢可能會將我帶到磁碟滿。

除了採取諸如刪除日誌條目以釋放更多空間或temp_file_limit在 postgresql conf 中設置等措施外,我還想知道是否可以設置臨時文件的位置。畢竟,我有 220GB 可用於這些場景,所以要好好利用它們(這裡也設置了交換空間)。

因為我是新手 DBA,所以我如何設置它的說明性範例將非常有幫助。

手冊中所述, Postgres 在$PGDATA/base/pgsql_tmp.

將該目錄設置為指向 的符號連結是安全的/mnt

嘗試:

ln -s /mnt/pgsql_tmp $PGDATA/base/pgsql_tmp
chown -R postgres /mnt/pgsql_tmp
chmod o+x /mnt

a_horse_with_no_name 的解決方案有一個大問題。不是所有的 PostgreSQL 實例甚至都有 $PGDATA/base/pgsql_tmp 因為整個路徑實際上是在這些實例中根據需要創建的。它甚至在需要時才存在,並且在不再需要時被銷毀,因此您不能在整個路徑上創建不存在的符號連結,並且動態創建然後銷毀。您需要使用 temp_tablespaces 參數在 postgresql.conf 文件中配置臨時表空間位置(https://www.postgresql.org/docs/9.3/static/runtime-config-client.html#GUC-TEMP-TABLESPACES)。這是因為 temp_tablespace 參數不僅指定由 CREATE 命令創建的所有臨時表的位置,這些臨時表在創建時沒有顯式命名的表空間,而且還指定用於連接、排序、和其他成本處理(https://www.postgresql.org/message-id/490ABE1D.3060700%40deriva.de)。

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