Postgresql ошибка не удалось открыть файл

This answer is only for Linux Beginners.

Assuming initially the DB user didn’t have file/folder(directory) permission on the client side.

Let’s constrain ourselves to the following:

User: postgres

Purpose: You wanted to (write to / read from) a specific folder

Tool: psql

Connected to a specific database: YES

FILE_PATH: /home/user/training/sql/csv_example.csv

Query: copy (SELECT * FROM table_name TO FILE_PATH, DELIMITER ',' CSV HEADER;

Actual Results: After running the query you got an error : Permission Denied

Expected Results: COPY COUNT_OF_ROWS_COPIED

Here are the steps I’d follow to try and resolve it.

  1. Confirm the FILE_PATH permissions on your File system.

Inside a terminal to view the permissions for a file/folder you need to long list them by entering the command ls -l.

The output has a section that shows sth like this -> drwxrwxr-x
Which is interpreted in the following way:

TYPE | OWNER RIGHTS | GROUP RIGHTS | USER RIGHTS

rwx (r: Read, W: Write, X: Execute)

TYPE (1 Char) = d: directory, -: file

OWNER RIGHTS (3 Chars after TYPE)

GROUP RIGHTS (3 Chars after OWNER)

USER RIGHTS (3 Chars after GROUP)

  1. If permissions are not enough (Ensure that a user can at least enter all folders in the path you wanted path) — x.

This means for FILE_PATH, All the directories (home , user, training, sql) should have at least an x in the USER RIGHTS.

  1. Change permissions for all parent folders that you need to enter to have a x. You can use chmod rights_you_want parent_folder

Assuming /training/ didn’t have an execute permission.

I’d go the user folder and enter chmod a+x training

  1. Change the destination folder/directory to have a w if you want to write to it. or at least a r if you want to read from it

Assuming /sql didn’t have a write permission.

I would now chmod a+w sql

  1. Restart the postgresql server sudo systemctl restart postgresql
  2. Try again.

This would most probably help you now get a successful expected result.

>>Если это текстовый дамп — то надо с помощью psql -f. Если бинарный — с помощью pg_restore.

Совсем необязательно. Запрос прекрасно выполняется из pgAdmin или через нужные библиотеки (psycopg2, jdbc и т.д.) при соблюдении трех важных условий.

1.
Надо понимать, что путь к файлу, который указан после from — это путь на сервере posgress, а не на той машине, с которой вы запускаете запрос. Поэтому файл *.csv должен физически находится на сервере posgress.

2.
К файлу должен быть доступ у процесса posgress. Поэтому, например, для Windows плохая идея располагать *.csv на диске C.

3.
Строго соблюсти формат разделителей *.csv, который поймет posgress. Чтобы не гадать — сделайте сначала выгрузку из таблицы командой copy tableName to 'csv_file_path'

Компьютер: 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

Любая помощь очень ценится!

4b9b3361

Ответ 1

chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv

Это изменит права доступа для вашей папки. Обратите внимание, что каждый сможет прочитать ваш файл.
Вы не можете использовать chown, являющийся пользователем без административных прав.
Также рассмотрите возможность обучения umask, чтобы облегчить создание общих файлов.

Ответ 2

Предполагая инструмент командной строки psql, вы можете использовать copy вместо copy.

copy открывает файл и передает содержимое на сервер, тогда как copy указывает серверу открыть сам файл и прочитать его, что может быть проблематичным по разрешению или даже невозможно, если клиент и сервер работают на разные машины без совместного использования файлов.

Под капотом copy реализуется как COPY FROM stdin и принимает те же параметры, что и серверная сторона copy.

Ответ 3

Скопируйте файл CSV в /tmp

Для меня это решило проблему.

Ответ 4

Скопируйте файл CSV в папку /tmp

Файлы, названные в команде COPY, считываются или записываются непосредственно сервером, а не клиентским приложением. Следовательно, они должны находиться на сервере базы данных или быть доступны только ему, а не клиенту. Они должны быть доступны для чтения и записи пользователю PostgreSQL (идентификатор пользователя, на котором выполняется сервер), а не клиенту. КОПИРОВАНИЕ Именование файла разрешено только для суперпользователей баз данных, поскольку оно позволяет читать или записывать любые файлы, на которые у сервера есть права доступа.

Ответ 5

У меня возникла проблема, когда я пытался экспортировать данные с удаленного сервера на локальный диск. Я не понял, что SQL copy на самом деле выполняется на сервере и что он пытается записать в папку сервера. Вместо этого правильная вещь — использовать copy, которая является командой psql, и она записывает в локальную файловую систему, как я ожидал. http://www.postgresql.org/message-id/[email protected]om

Возможно, это может быть полезно и для кого-то другого.

Ответ 6

Другой способ сделать это, если у вас есть pgAdmin и удобнее использовать графический интерфейс, — это перейти к таблице в схеме и щелкнуть правой кнопкой мыши по таблице, в которую вы хотите импортировать файл, и выбрать «Импорт» для просмотра вашего компьютера для файл, выберите тип вашего файла, столбцы, в которые вы хотите вставить данные, а затем выберите импорт.

Это было сделано с использованием pgAdmin III и версии PostgreSQL версии 9.4

Ответ 7

Для меня было просто добавить sudo (или запустить как root) для команды chown:

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

Ответ 8

Я решил ту же проблему с помощью рекурсивного chown для родительской папки:

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

(мой экспорт находится в /home/my_user/export_folder/export_1.csv)

Ответ 9

просто на случай, если вы столкнетесь с этой проблемой под Windows 10, добавьте группу пользователей «youcomputerUsers» на вкладке безопасности и предоставьте ей полный контроль, что решило мою проблему

Ответ 10

для MacBook сначала я открыл терминал, а затем введите

open /tmp

или в каталоге поиска вы напрямую вводите команду + shift + g, затем набираете /tmp и переходите в папку.

он открывает временную папку в Finder. Затем я вставляю скопированный файл CSV в эту папку. Затем я снова захожу в терминал postgres и набираю команду ниже, а затем она копирует мои данные CSV в таблицу БД.

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

Ответ 11

Мой случай:

Я сохраняю свой csv файл в каталог моего хоста. Например: /tmp/geo.csv.

Но я забыл смонтировать этот том хоста в докер-контейнер, поэтому команда COPY команды pg выдает ошибку: No such a file and directory.

Команда COPY /tmp/geo.csv в контейнере /tmp/geo.csv, но она не существует.

Ответ 12

У меня было то же сообщение об ошибке, но я использовал psycopg2 для связи с PostgreSQL. Я исправил проблемы с разрешениями, используя функции copy_from и copy_expert, которые открывают файл на стороне клиента как пользователь, выполняющий скрипт python, и передают данные в базу данных через STDIN.

Обратитесь к этой ссылке для получения дополнительной информации.

Ответ 13

Вы должны предоставить пользователю разрешение pg_read_server_files, если вы не используете postgres superuser.

Пример:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;

Ответ 14

Может быть, вы используете pgadmin, подключая удаленный хост, а затем U пытаетесь обновить его из вашей системы, но он ищет этот файл в удаленной системной файловой системе… его ошибка, с которой я столкнулся, может быть ее также для проверки u это

Этот ответ предназначен только для начинающих пользователей Linux.

Предполагая, что изначально у пользователя БД не было разрешения на файл / папку (каталог) на стороне клиента.

Ограничимся следующим:

Пользователь: 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: выполнение)

ТИП (1 символ) = d: каталог, -: файл

ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)

ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)

ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)

  1. Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) — x.

Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум 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. Попробуй снова.

Скорее всего, это поможет вам получить ожидаемый результат.

Компьютер: 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

Любая помощь высоко ценится!

17 ответов

Лучший ответ

chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv

Это изменит права доступа к вашей папке. Обратите внимание, что каждый сможет прочитать ваш файл. Вы не можете использовать chown как пользователь без прав администратора. Также рассмотрите возможность изучения umask, чтобы упростить создание общих файлов.


23

Basilevs
19 Окт 2013 в 10:43

У меня возникла проблема, когда я пытался экспортировать данные с удаленного сервера на локальный диск. Я не понимал, что SQL copy на самом деле выполняется на сервере и пытается записать в папку сервера. Вместо этого правильнее было использовать copy, которая является командой psql и записывает в локальную файловую систему, как я и ожидал. http://www.org/postgresponse/ /CAFjNrYsE4Za_KWzmfgN1_-MG7GTw_vpMRxPk=OEjAiLqLskxdA@mail.gmail.com

Возможно, это может быть полезно и кому-то другому.


5

nikola
14 Дек 2015 в 14:50

Скопируйте файл CSV в папку / tmp .

Файлы, указанные в команде COPY, читаются или записываются непосредственно сервером, а не клиентским приложением. Следовательно, они должны находиться на сервере базы данных или быть доступным для него, а не для клиента. Они должны быть доступны для чтения или записи пользователю PostgreSQL (идентификатор пользователя, от имени которого работает сервер), а не клиенту. Имя файла COPY разрешено только суперпользователям базы данных, поскольку оно позволяет читать или записывать любой файл, к которому у сервера есть права доступа.


18

Antonio
28 Сен 2017 в 23:18

Скопируйте файл CSV в / tmp

Для меня это решило проблему.


83

user637338
2 Май 2016 в 20:06

Предполагая, что инструмент командной строки psql, вы можете использовать copy вместо copy.

copy открывает файл и передает его содержимое на сервер, тогда как copy сообщает серверу открыть сам файл и прочитать его, что может быть проблематично с точки зрения разрешений или даже невозможно, если клиент и сервер работают. на разных машинах без обмена файлами между ними.

Под капотом copy реализован как COPY FROM stdin и принимает те же параметры, что и серверный COPY.


144

Daniel Vérité
19 Окт 2013 в 17:31

Другой способ сделать это, если у вас есть pgAdmin и вам удобно пользоваться графическим интерфейсом, — перейти к таблице в схеме и щелкнуть правой кнопкой мыши по таблице, в которую вы хотите импортировать файл, и выбрать «Импорт», найти файл на вашем компьютере, выбрать тип вашего файла, столбцы, в которые должны быть импортированы данные, а затем выберите импорт.

Это было сделано с помощью pgAdmin III и версии PostgreSQL 9.4.


4

Jeff Spicoli
22 Июл 2015 в 19:42

Для меня это сработало просто добавить sudo (или запустить от имени root) для команды chown:

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


1

annakeuchenius
3 Мар 2017 в 14:36

У меня было такое же сообщение об ошибке, но я использовал psycopg2 для связи с PostgreSQL. Я исправил проблемы с разрешениями, используя функции copy_from и copy_expert, которые будут открывать файл на стороне клиента в качестве пользователя, запускающего скрипт python, и передавать данные в базу данных через STDIN.

См. эту ссылку для получения дополнительной информации.


0

mx3swish
3 Июл 2019 в 15:54

На всякий случай, если вы столкнулись с этой проблемой в Windows 10, добавьте группу пользователей «youcomputer Users» на вкладку безопасности и предоставьте ей полный контроль, что решило мою проблему.


0

Benderradji Khireddine
29 Апр 2019 в 00:07

COPY your table (Name, Latitude, Longitude) FROM 'C:Tempyour file.csv' DELIMITERS ',' CSV HEADER;

Используйте c:Temp"Your File".


2

double-beep
9 Фев 2020 в 18:47

Для MacBook сначала я открыл терминал, затем набрал

open /tmp

Или в каталоге поиска вы напрямую вводите команду + shift + g, затем набираете / tmp и переходите в папку.

Он открывает временную папку в Finder. затем я вставляю скопированный файл csv в эту папку. затем снова перехожу в терминал postgres и набираю команду ниже, а затем копируются мои данные csv в таблицу db

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


1

Dinesh Gurjar
7 Май 2019 в 09:10

Вы должны предоставить пользователю разрешение pg_read_server_files, если вы не используете postgres superuser.

Примере:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;


1

gehbiszumeis
8 Авг 2019 в 14:56

Этот ответ только для начинающих пользователей Linux .

Предполагая, что изначально у пользователя БД не было прав доступа к файлу / папке (каталогу) на стороне клиента.

Ограничимся следующим:

Пользователь: postgres

Цель: вы хотели (писать в / читать) конкретную папку

Инструмент: psql

Подключено к определенной базе данных: YES

FILE_PATH: /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: выполнение)

ТИП (1 символ) = d: каталог, -: файл

ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)

ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)

ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)

  1. Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) — x.

Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум 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. Попробуй еще раз.

Скорее всего, это поможет вам получить ожидаемый результат.


0

N. Maina
2 Май 2020 в 10:45

Может быть, вы используете pgadmin, подключив удаленный хост, тогда U пытается обновить его из вашей системы, но он ищет этот файл в файловой системе удаленной системы … это ошибка, с которой я столкнулся. Может быть, это также для вас.


-3

raj
22 Мар 2014 в 13:48

Я просто скопировал исходный CSV-файл на внешний USB-накопитель, и он работал нормально.


-1

Zatman
25 Окт 2021 в 17:43

Я решил ту же проблему с рекурсивным chown в родительской папке:

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

(мой экспорт находится в /home/my_user/export_folder/export_1.csv)


2

Benjamin Crouzier
7 Фев 2019 в 18:56

В Linux это можно исправить, предоставив пользователю postgres права на чтение/запись/выполнение в целевом каталоге. Например:

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


0

étale-cohomology
13 Июл 2022 в 07:48

Понравилась статья? Поделить с друзьями:
  • Postgresql ошибка column does not exist
  • Postgresql ошибка 42703
  • Postgresql ошибка 23503
  • Postgresql ошибка 1053
  • Postgresql логирование ошибок