Postgresql

無法使用 PostgreSQL COPY 從 /tmp 讀取,但能夠以完全相同的權限從另一個目錄讀取相同的文件

  • July 27, 2018

我有一個/tmp/foo.csv看起來像這樣的文件:

1,2
10,20
100,200

我在另一個目錄中有相同的文件/mydata/foo.csv。目錄文件都具有相同的權限、所有者,並且是由同一個使用者創建的,但是當我執行時

COPY foo FROM '/tmp/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);

我收到這個錯誤

ERROR:  could not open file "/tmp/foo.csv" for reading: No such file or directory

當我跑

COPY foo FROM '/mydata/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);

我明白了COPY 3

我在這裡想念什麼?

以下是相關文件和目錄資訊:

╭─foo@bar  / ‹py27› 
╰─$ ll -d /mydata /mydata/foo.csv /tmp /tmp/foo.csv                                                                                                                       1 ↵
drwxrwxrwt  2 root root 4.0K Sep  9 08:26  /mydata
drwxrwxrwt 17 root root  420 Sep  9 08:57  /tmp
-rw-r--r--  1 root root   17 Sep  6 12:03  /mydata/foo.csv
-rw-r--r--  1 root root   17 Sep  9 08:36  /tmp/foo.csv
╭─foo@bar  / ‹py27› 
╰─$ diff /mydata/foo.csv /tmp/foo.csv
╭─foo@bar  / ‹py27› 
╰─$ 

我正在執行 Arch Linux

**注意:**我也在另一台執行 CentOS 的 Linux 機器上試過這個,但我無法重現這個問題。

在 Arch 上,PostgreSQL ( /usr/lib/systemd/system/postgresql.service) 的 systemd 腳本啟用私有 /tmp,這意味著 PostgreSQL 伺服器程序無法使用 /tmp 與使用者通信。

兩種可能的解決方案:

  1. 在其他地方創建一個新文件夾並賦予使用者postgres讀取權限:# sudo mount -t tmpfs -o users,rw tmpfs /data
  2. (不推薦)將PrivateTmppostgresql.service 中的選項設置為false.

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