web-dev-qa-db-ja.com

postgres:ファイルが存在するにもかかわらず、psql csvインポートが失敗する

次のように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.

ただし、両方のファイルandテーブルはjira_statistics dbに存在します

[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
1
pkaramol

COPYが失敗する最も一般的な理由は、ヒントに示されているものですが、エラーは「アクセスが拒否されました」です。

「そのようなファイルまたはディレクトリはありません」というメッセージが表示され、単純なlsはファイルが存在することを示しているため、最初に確認する必要のある説明がいくつかあります。

  1. /home/centos/bugs.csv存在しないファイルを指すソフトリンクです。 ls -lを使用して、宛先がソフトリンクであるかどうかを確認してください。

  2. 127.0.0.1:5432は、ネットワークレベルで別のマシンにリダイレクトされます。この手法は、SSHトンネルを介してリモートサービスに接続するために広く使用されています。

  3. お使いのOSは、 Permission denied エラーを発行せずにpostgres/home/centos/bugs.csvを読み取ることを禁止する高度なセキュリティ/分離機能を使用しています。 postgres OSアカウントでls -l /home/centos/bugs.csvをお試しください。

  4. コンテナ化 のため、サーバーとクライアントは同じ MOUNT名前空間 で実行されません。

#2#3または#4の場合は、エラーメッセージのHINT部分で提案されているように\copyを使用します。

1
Daniel Vérité

これは、データベースのアクセス許可の問題、ファイルシステムのアクセス許可の問題、またはファイルのエンコードタイプの問題の可能性があります。 (上記のいずれでもない場合もあります)。これが私の提案です:

データベース権限の場合:スーパーユーザーまたは特別にロールされたユーザーのみがCOPYを使用できます。 COPYコマンドの postgresqlドキュメント を参照してください。

ファイルまたはコマンドの命名COPYは、データベースのスーパーユーザーまたはデフォルトのロールpg_read_server_files、pg_write_server_files、またはpg_execute_server_programのいずれかが付与されているユーザーにのみ許可されます。

ファイルシステムの権限の場合:サービスがファイルの読み取り権限を持っていることを確認します。

0
exax