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.
- 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)
- 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.
- Change permissions for all parent folders that you need to enter to have a
x
. You can usechmod 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
- Change the destination folder/directory to have a
w
if you want to write to it. or at least ar
if you want to read from it
Assuming /sql
didn’t have a write permission.
I would now chmod a+w sql
- Restart the postgresql server
sudo systemctl restart postgresql
- 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
Любая помощь очень ценится!
Ответ 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
Вот шаги, которые я предпринял, чтобы попытаться решить эту проблему.
- Подтвердите разрешения FILE_PATH в вашей файловой системе.
Внутри терминала, чтобы просмотреть разрешения для файла / папки, вам необходимо их длинный список, введя команду ls -l
.
На выходе есть раздел, который показывает что-то вроде этого -> drwxrwxr-x
Что интерпретируется следующим образом:
ТИП | ПРАВА ВЛАДЕЛЬЦА | ПРАВА ГРУППЫ | ПРАВА ПОЛЬЗОВАТЕЛЯ
rwx
(r: чтение, W: запись, X: выполнение)
ТИП (1 символ) = d: каталог, -: файл
ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)
ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)
ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)
- Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) —
x
.
Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум x
в ПРАВАХ ПОЛЬЗОВАТЕЛЯ.
- Измените разрешения для всех родительских папок, которые вам нужно ввести, чтобы иметь
x
. Вы можете использоватьchmod rights_you_want parent_folder
Предполагая /training/
не было разрешения на выполнение.
Я бы пошел в папку пользователя и ввел chmod a+x training
- Измените папку / каталог назначения, чтобы
w
если вы хотите написать ему. или по крайней мереr
если ты хочешь читать оттуда
Предполагая /sql
не было разрешения на запись.
Я бы сейчас chmod a+w sql
- Перезагрузите сервер postgresql
sudo systemctl restart postgresql
- Попробуй снова.
Скорее всего, это поможет вам получить ожидаемый результат.
Компьютер: 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
Вот шаги, которые я бы предпринял, чтобы попытаться решить эту проблему.
- Подтвердите разрешения FILE_PATH в вашей файловой системе.
Внутри терминала, чтобы просмотреть разрешения для файла / папки, вам нужно вывести их длинный список, введя команду ls -l
.
В выходных данных есть раздел, который показывает что-то вроде этого -> drwxrwxr-x
Что интерпретируется следующим образом:
ТИП | ПРАВА ВЛАДЕЛЬЦА | ПРАВА ГРУППЫ | ПРАВА ПОЛЬЗОВАТЕЛЯ
rwx
(r: чтение, W: запись, X: выполнение)
ТИП (1 символ) = d: каталог, -: файл
ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)
ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)
ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)
- Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) —
x
.
Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум x
в ПРАВАХ ПОЛЬЗОВАТЕЛЯ.
- Измените разрешения для всех родительских папок, которые вам нужно ввести, чтобы иметь
x
. Вы можете использоватьchmod rights_you_want parent_folder
Предполагая, что у /training/
нет разрешения на выполнение.
Я бы пошел в папку пользователя и ввел chmod a+x training
- Измените папку / каталог назначения, чтобы иметь
w
, если вы хотите писать в него. или хотя быr
, если вы хотите читать с него
Предполагая, что у /sql
нет разрешения на запись.
Я бы сейчас chmod a+w sql
- Перезагрузите сервер postgresql
sudo systemctl restart postgresql
- Попробуй еще раз.
Скорее всего, это поможет вам получить ожидаемый результат.
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