无法使用 PostgreSQL COPY 从 /tmp 读取,但能够以完全相同的权限从另一个目录读取相同的文件

Phi*_*oud 2 postgresql linux postgresql-9.4

我有一个/tmp/foo.csv看起来像这样的文件:

1,2
10,20
100,200
Run Code Online (Sandbox Code Playgroud)

我在另一个目录中有相同的文件/mydata/foo.csv。目录文件都具有完全相同的权限、所有者,并且是由同一个用户创建的,但是当我运行时

COPY foo FROM '/tmp/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

ERROR:  could not open file "/tmp/foo.csv" for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我跑

COPY foo FROM '/mydata/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);
Run Code Online (Sandbox Code Playgroud)

我明白了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› 
??$ 
Run Code Online (Sandbox Code Playgroud)

我正在运行 Arch Linux

注意:我也在另一台运行 CentOS 的 Linux 机器上尝试过这个,但我无法重现该问题。

小智 8

在 Arch 上,PostgreSQL 的 systemd 脚本 ( /usr/lib/systemd/system/postgresql.service) 启用私有 /tmp,这意味着 PostgreSQL 服务器进程无法使用 /tmp 与用户通信。

两种可能的解决方案:

  1. 在其他地方创建一个新文件夹并授予用户postgres读取权限:# sudo mount -t tmpfs -o users,rw tmpfs /data
  2. (不推荐)将PrivateTmppostgresql.service 中的选项设置为false.