【问题标题】:Postgres ERROR: could not open file for reading: Permission deniedPostgres 错误:无法打开文件进行读取:权限被拒绝
【发布时间】:2013-10-19 06:20:10
【问题描述】:

计算机: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

非常感谢任何帮助!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

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

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

    【讨论】:

    • 我希望每次我不可避免地忘记 `\` 并最终回到这里时,我都可以将此答案标记为有用。请接受我真诚的感谢。
    • 是的,这应该是公认的答案。 @J.M.Janzen,您可以通过单击问题旁边的星号来收藏该主题。
    【解决方案2】:

    将 CSV 文件复制到 /tmp

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

    【讨论】:

      【解决方案3】:
      chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv
      

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

      【讨论】:

      • 嗨,一个可以为你完成这项任务的小班轮:a=pwd;NumOfSlashes=$((echo $a | sed 's/[^/]//g' | wc -c - 1 )); for ((i=1;idirname $a;完成;
      【解决方案4】:

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

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

      【讨论】:

      • 优雅。没有权限更改。不怕。没有麻烦。
      【解决方案5】:

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

      也许这对其他人也有用。

      【讨论】:

        【解决方案6】:

        如果您有 pgAdmin 并且习惯于使用 GUI,那么另一种方法是转到架构中的表,然后右键单击要将文件导入到的表并选择“导入”浏览您的计算机以查找文件,选择您的文件类型,您希望将数据输入的列,然后选择导入。

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

        【讨论】:

        • pgAdmin III 上不再存在此选项
        • 这就像一个魅力。到目前为止,实现目标的最简单方法。
        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案8】:
          COPY your table (Name, Latitude, Longitude) FROM 'C:\Temp\your file.csv' DELIMITERS ',' CSV HEADER;
          

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

          【讨论】:

          • 这个解决方案给我带来了同样的错误。 ``` enceladus=# COPY master_plan enceladus-# FROM 'C:\Windows\Temp\master_plan.csv' enceladus-# WITH DELIMITER ',' HEADER CSV;错误:无法打开文件“C:\Windows\Temp\master_plan.csv”进行读取:权限被拒绝
          【解决方案9】:

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

          sudo chown postgres /users/darchcruise/desktop/items_ordered.csv

          【讨论】:

            【解决方案10】:

            如果您在 Windows 10 下遇到此问题,请在安全选项卡上添加用户组“youcomputer\Users”并授予它完全控制权,这样就解决了我的问题

            【讨论】:

            【解决方案11】:

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

            open /tmp
            

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

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

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

            【讨论】:

              【解决方案12】:

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

              例子:

              GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;
              

              【讨论】:

              • 执行这个给了我ERROR: role "pg_read_server_files" does not exist
              【解决方案13】:

              我收到了同样的错误消息,但我使用 psycopg2 与 PostgreSQL 通信。我通过使用函数copy_fromcopy_expert 修复了权限问题,它们将在用户运行python 脚本时在客户端打开文件,并通过STDIN 将数据提供给数据库。

              请参阅this link 了解更多信息。

              【讨论】:

                【解决方案14】:

                此答案仅适用于 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: 目录, -: 文件

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

                组权利(OWNER 后 3 个字符)

                用户权利(GROUP 后 3 个字符)

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

                这意味着对于 FILE_PATH,所有目录(home、user、training、sql)都应该在 USER RIGHTS 中至少有一个 x

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

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

                我会去用户文件夹并输入chmod a+x training

                1. 如果要写入目标文件夹/目录,请将其更改为w。或者至少一个r,如果你想从中阅读的话

                假设/sql 没有写权限。

                我现在会chmod a+w sql

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

                这很可能会帮助您现在获得成功的预期结果。

                【讨论】:

                  【解决方案15】:

                  我刚刚将源 csv 文件复制到外部 USB 驱动器,它工作正常。

                  【讨论】:

                    【解决方案16】:

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

                    【讨论】:

                    • 这个是真的,但可以解释得更清楚。我必须将文件复制到服务器才能在 pgAdmin 的控制台中加载它。
                    猜你喜欢
                    • 2017-10-31
                    • 1970-01-01
                    • 2013-04-08
                    • 1970-01-01
                    • 2019-10-23
                    • 2015-02-23
                    • 1970-01-01
                    • 2013-01-22
                    • 1970-01-01
                    相关资源
                    最近更新 更多