Ответ 1
ОШИБКА: разрешение отклонено для отношения sl_node
Это твоя настоящая проблема.
Убедитесь, что пользовательский боб имеет SELECT
привилегию для _replication.sl_node
. Неужели это системный стол Slony или что-то еще?
Мне нужно скопировать DB Postgres с одного сервера на другой, но у учетных данных у меня нет разрешения на блокировку базы данных, так что pg_dump не работает. У меня есть полные права на чтение/обновление/вставку в соответствующую БД.
Как я могу сделать копию этой базы данных? Меня не беспокоят несоответствия (это небольшая база данных на dev-сервере, поэтому минимальные риски несоответствий во время извлечения)
[править] Полная ошибка:
$ pg_dump --username=bob mydatabase > /tmp/dump.sql
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: permission denied for relation sl_node
pg_dump: The command was: LOCK TABLE _replication.sl_node IN ACCESS SHARE MODE
ОШИБКА: разрешение отклонено для отношения sl_node
Это твоя настоящая проблема.
Убедитесь, что пользовательский боб имеет SELECT
привилегию для _replication.sl_node
. Неужели это системный стол Slony или что-то еще?
Вам нужны SELECT
разрешения (чтение) для всех объектов базы данных для создания дампа, а не LOCK
разрешений (что бы это ни было). Какое полное сообщение об ошибке при запуске pg_dump
сделать дамп?
Это сработало для меня
sudo -u postgres pg_dump -Fc -c db_name > file_name.pgdump
Затем создайте БД и запустите pg_restore it:
sudo -u postgres /usr/local/pgsql/bin/pg_restore -U postgres -d db_name -v file_name.pgdump
pg_dump
не блокирует всю базу данных, но получает явную блокировку для всех таблиц, которые он собирается сбрасывать. Эта блокировка выполняется в "режиме доступа к ресурсам", который является тем же уровнем блокировки, который требуется оператором SELECT: он предназначен только для защиты от того, чтобы одна из таблиц была сброшена между ними, решая, какие таблицы выгружать и затем получать данные.
Итак, похоже, что на самом деле проблема заключается в том, что она пытается сбросить таблицу, на которую у вас нет разрешения? PostgreSQL не имеет прав на чтение/обновление/вставку на уровне базы данных, поэтому, возможно, вам просто не хватает привилегии выбора из одной таблицы где-нибудь...
Как предложил Фрэнк Х., опубликуйте полное сообщение об ошибке, и мы попытаемся помочь его декодировать.
https://forums.aws.amazon.com/thread.jspa?threadID=151526
эта ссылка мне очень помогла. Это относится к другому,
Сначала я изменяю собственное устройство на rds_superuser, затем вставляю этот фрагмент кода,
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$
BEGIN EXECUTE $1; RETURN $1; END; $f$;
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser')
FROM (
SELECT nspname, relname
FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
WHERE nspname in ('tiger','topology') AND
relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;
после этого я могу сбросить всю базу данных.
Запустили ли вы 'pg_dump' с правильным -U (пользователем, которому принадлежит этот db)? Если да, то, как и другие плакаты, проверьте разрешения.
НТН