為 Postgresql 後端設置臨時文件的位置 (9.3.10)
是否可以為 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)。