Postgres ERROR: 无法打开文件进行读取: 权限被拒绝

计算机: Mac OS X,版本10.8 数据库: Postgres

尝试将 csv 文件导入 postgres。

pg> copy items_ordered from '/users/darchcruise/desktop/items_ordered.csv' with CSV;
ERROR:  could not open file "/users/darchcruise/desktop/items_ordered.csv" for reading: Permission denied

然后我试了

$> chown postgres /users/darchcruise/desktop/items_ordered.csv
chown: /users/darchcruise/desktop/items_ordered.csv: Operation not permitted

最后,我尽力了

$> ls -l
-rw-r--r--  1 darchcruise  staff      1016 Oct 18 21:04 items_ordered.csv

非常感谢您的帮助!

165301 次浏览
chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv

这将改变您的文件夹的访问权限。请注意,每个人都将能够读取您的文件。 没有管理权限,不能使用 chown 作为用户。 还可以考虑学习 乌玛斯克来简化共享文件的创建。

假设使用 psql命令行工具,您可以使用 \copy而不是 copy

\copy打开文件并将内容提供给服务器,而 copy告诉服务器打开文件本身并读取它,这可能是权限方面的问题,如果客户端和服务器运行在不同的机器上,中间没有文件共享,那么这可能是不可能的。

在底层,\copy实现为 COPY FROM stdin,并接受与服务器端 COPY相同的选项。

也许你正在通过连接远程主机使用 pgadmin,然后你正在尝试从你的系统更新那里,但它在远程系统的文件系统中搜索该文件... 这是我面临的错误,也许是它也为你检查它

将 CSV 文件复制到/tmp

对我来说,这解决了问题。

另一种方法是,如果你有 pgAdmin 并且使用 GUI 感觉舒服,那么你可以在模式中的表格上右键点击你想要导入文件的表格,然后选择“ Import”浏览你的计算机找到文件,选择你的文件的类型,你想要的数据被导入的列,然后选择 Import。

这是使用 pgAdmin III 和9.4版本的 PostgreSQL 完成的

当我试图将数据从远程服务器导出到本地磁盘时遇到了这个问题。我没有意识到 SQLcopy实际上是在服务器上执行的,它试图写入服务器文件夹。相反,正确的做法是使用 \copy,这是 psql 命令,它像我期望的那样写入本地文件系统。http://www.postgresql.org/message-id/CAFjNrYsE4Za_KWzmfgN1_-MG7GTw_vpMRxPk=OEjAiLqLskxdA@mail.gmail.com

也许这对其他人也有用。

对我来说,只需要为 chown 命令添加 sudo (或以 root 身份运行)即可:

Sudo chown postgres/users/darchCruise/desk/item _ ordering. csv

将 CSV 文件复制到/tmp 文件夹中

在 COPY 命令中命名的文件由服务器直接读取或写入,而不是由客户端应用程序读取或写入。因此,它们必须驻留在数据库服务器机器上,或者可以访问,而不是客户端。它们必须能够被 PostgreSQL 用户(服务器运行时的用户 ID)访问并且可读或可写,而不是客户机。COPY 命名文件只允许数据库超级用户,因为它允许读写服务器有权访问的任何文件。

我用父文件夹上的递归 chown 解决了同样的问题:

sudo chown -R postgres:postgres /home/my_user/export_folder

(我的出口是在 /home/my_user/export_folder/export_1.csv)

如果你在 Windows 10下面临这个问题,在安全标签上添加用户组“ youcomputer 用户”,并授予它完全的控制权,这就解决了我的问题

对于 Macbook,我首先打开终端,然后输入

open /tmp

或者在 finder 目录中直接输入 command + shift + g,然后在 go 文件夹中输入/tmp。

它在 finder 中打开临时文件夹。然后我把复制的 csv 文件粘贴到这个文件夹中。然后我再次进入 postgres 终端,输入以下命令,然后把我的 csv 数据复制到 db 表中

\copy recharge_operator FROM '/private/tmp/operator.csv' DELIMITER ',' CSV;

我有相同的错误消息,但是正在使用 psycopg2与 PostgreSQL 通信。我通过使用函数 copy_fromcopy_expert修复了权限问题,这两个函数将作为运行 python 脚本的用户在客户端打开文件,并通过 STDIN将数据提供给数据库。

有关详细信息,请参阅 这个链接

如果不使用 postgressuperuser,则必须向用户授予 pg_read_server_files权限。

例如:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;
COPY your table (Name, Latitude, Longitude) FROM 'C:\Temp\your file.csv' DELIMITERS ',' CSV HEADER;

使用 c:\Temp\"Your File"\

这个答案只适用于 Linux 初学者。

假设最初 DB 用户在客户端没有文件/文件夹(目录)权限。

让我们约束自己:

用户: postgres

用途: 您想要(写入/读取)一个特定的文件夹

工具: psql

连接到特定数据库: YES

文件路径: /home/user/training/sql/csv_example.csv

查询: \copy (SELECT * FROM table_name TO FILE_PATH, DELIMITER ',' CSV HEADER;

实际结果: 在运行查询之后,您得到一个错误: Permission Denied

预期成果: COPY COUNT_OF_ROWS_COPIED

下面是我尝试解决这个问题的步骤。

  1. 确认文件系统上的 FILE _ PATH 权限。

在一个终端中,为了查看文件/文件夹的权限,您需要通过输入命令 ls -l来列出它们。

输出部分显示如下内容-> drwxrwxr-x 其解释如下:

类型 | 所有者权利 | 群体权利 | 用户权利

rwx(r: 读,W: 写,X: 执行)

TYPE (1 Char) = d: 目录,-: file

所有者权利(输入后3个字符)

集体权利(所有者后3个字符)

用户权限(组后3个字符)

  1. 如果权限不够(确保用户至少可以在所需路径中输入所有文件夹)-x

这意味着对于 FILE _ PATH,所有目录(主目录、用户目录、培训目录、 sql)在 USER 权限中应该至少有一个 x

  1. 更改所有需要输入以获得 x的父文件夹的权限。可以使用 chmod rights_you_want parent_folder

假设 /training/没有执行权限。

我会进入用户文件夹,然后输入 chmod a+x training

  1. 如果要写入目标文件夹/目录,请更改该目标文件夹/目录为 w。或者至少是一个 r,如果你想阅读它

假设 /sql没有书面许可。

我现在 chmod a+w sql

  1. 重新启动 postgreql 服务器 sudo systemctl restart postgresql
  2. 再试一次。

这很可能会帮助你现在得到一个成功的预期结果。

我只是将源 csv 文件复制到另一个文件夹中,在这个文件夹中您有更多的权限(C:/temp) ,它工作得很好。

在 Linux 上,您可以通过授予 postgres用户对目标目录的读/写/执行权限来解决这个问题:

setfacl -m u:postgres:rwx /home/hi