Подтвердить что ты не робот

Скопировать базу данных postgres без разрешений LOCK

Мне нужно скопировать 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  
4b9b3361

Ответ 1

ОШИБКА: разрешение отклонено для отношения sl_node

Это твоя настоящая проблема.

Убедитесь, что пользовательский боб имеет SELECT привилегию для _replication.sl_node. Неужели это системный стол Slony или что-то еще?

Ответ 2

Вам нужны SELECT разрешения (чтение) для всех объектов базы данных для создания дампа, а не LOCK разрешений (что бы это ни было). Какое полное сообщение об ошибке при запуске pg_dump сделать дамп?

Ответ 3

Это сработало для меня

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

Ответ 4

pg_dump не блокирует всю базу данных, но получает явную блокировку для всех таблиц, которые он собирается сбрасывать. Эта блокировка выполняется в "режиме доступа к ресурсам", который является тем же уровнем блокировки, который требуется оператором SELECT: он предназначен только для защиты от того, чтобы одна из таблиц была сброшена между ними, решая, какие таблицы выгружать и затем получать данные.

Итак, похоже, что на самом деле проблема заключается в том, что она пытается сбросить таблицу, на которую у вас нет разрешения? PostgreSQL не имеет прав на чтение/обновление/вставку на уровне базы данных, поэтому, возможно, вам просто не хватает привилегии выбора из одной таблицы где-нибудь...

Как предложил Фрэнк Х., опубликуйте полное сообщение об ошибке, и мы попытаемся помочь его декодировать.

Ответ 5

https://forums.aws.amazon.com/thread.jspa?threadID=151526

эта ссылка мне очень помогла. Это относится к другому,

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS

Сначала я изменяю собственное устройство на 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;        

после этого я могу сбросить всю базу данных.

Ответ 6

Запустили ли вы 'pg_dump' с правильным -U (пользователем, которому принадлежит этот db)? Если да, то, как и другие плакаты, проверьте разрешения.

НТН