Скопировать базу данных postgres без разрешений LOCK - PullRequest
28 голосов
/ 06 декабря 2010

Мне нужно скопировать базу данных postgres с одного сервера на другой, но у меня нет необходимых полномочий для блокировки базы данных, поэтому pg_dump не работает. У меня есть полные права на чтение / обновление / вставку для рассматриваемой БД.

Как я могу сделать копию этой базы данных? Я не беспокоюсь о несоответствиях (это небольшая база данных на сервере разработчиков, поэтому минимальные риски несоответствий при извлечении)

[править] Полная ошибка:

$ 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  

Ответы [ 7 ]

19 голосов
/ 07 декабря 2010

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

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

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

8 голосов
/ 13 мая 2015

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

sudo -u postgres pg_dump -Fc -c db_name > file_name.pgdump  

Затем создайте БД и запустите pg_restore:

 sudo -u postgres /usr/local/pgsql/bin/pg_restore -U postgres -d db_name -v file_name.pgdump
6 голосов
/ 06 декабря 2010

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

4 голосов
/ 11 июня 2015

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;        

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

4 голосов
/ 06 декабря 2010

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

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

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

2 голосов
/ 23 мая 2012

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

HTH

0 голосов
/ 21 февраля 2018

Это сработало для меня -d dbname -n schemaname

pg_dump -v -Fc -h <host> -U <username> -p -d <db_name> -n <schema_name> > file_name.pgdump

схема по умолчанию public

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...