Postgresql

postges:儘管文件存在,但 psql csv 導入失敗

  • February 15, 2019

嘗試csv按如下方式導入文件:

psql -h 127.0.0.1 -d jira_statistics -U admin -p 5432 -c "COPY bugs FROM '/home/centos/bugs.csv' delimiter '|' csv;"
Password for user admin: 
ERROR:  could not open file "/home/centos/bugs.csv" for reading: No such file or directory
HINT:  COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy.

但是文件表都存在於jira_statisticsdb中

[root@jira-statistics ~]# ls /home/centos/bugs.csv
/home/centos/bugs.csv


[root@jira-statistics ~]# psql -h 127.0.0.1 -p 5432 -U admin jira_statistics
Password for user admin: 
psql (9.2.24, server 11.1 (Debian 11.1-3.pgdg90+1))
WARNING: psql version 9.2, server version 11.0.
        Some psql features might not work.
Type "help" for help.

jira_statistics=# \dt
        List of relations
Schema |   Name   | Type  | Owner 
--------+----------+-------+-------
public | bugs     | table | admin
public | devtasks | table | admin
public | releases | table | admin
public | stories  | table | admin

COPY 失敗的最常見原因是提示中的建議,但錯誤是“權限被拒絕”。

由於您得到“沒有這樣的文件或目錄”,並且簡單ls地表明該文件存在,因此您首先要檢查一些看似合理的解釋:

  1. /home/centos/bugs.csv指向不存在文件的軟連結。如果ls -l它是軟連結,請確保檢查目的地。
  2. 127.0.0.1:5432在網路級別被重定向到另一台機器。這種技術廣泛用於通過SSH 隧道連接到遠端服務。
  3. 您的作業系統使用花哨的安全/隔離功能,禁止在不發出Permission denied錯誤的情況下postgres進行讀取。在作業系統帳戶下嘗試。/home/centos/bugs.csv``ls -l /home/centos/bugs.csv``postgres
  4. 由於容器化,您的伺服器和客戶端不在同一個MOUNT 命名空間下執行。

在 #2 #3 或 #4 的情況下,只需\copy按照錯誤消息的提示部分中的建議使用。

這可能是數據庫權限問題、文件系統權限問題,也可能是文件編碼類型的問題。(也可能不是上述任何一種)。以下是我的建議:

對於數據庫權限:只有超級使用者或特定角色的使用者才能使用 COPY。請參閱有關COPY 命令的postgresql 文件:

COPY 命名文件或命令只允許數據庫超級使用者或被授予預設角色 pg_read_server_files、pg_write_server_files 或 pg_execute_server_program 之一的使用者,因為它允許讀取或寫入任何文件或執行伺服器有權訪問的程序。

對於文件系統權限:檢查服務是否對文件具有讀取權限。

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