2010-12-06 2 views
20

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

Как я могу сделать копию этой базы данных? Я не беспокоюсь о несоответствиях (это небольшая база данных на сервере 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 

ответ

13

ERROR: permission denied for relation sl_node

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

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

+0

Это был несколько лет с тех пор, как я задал этот вопрос, но из памяти да, был какой-то материал Slony, который вызывал проблемы. – DrStalker 2012-07-06 03:14:11

6

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

+0

Полный ErrorMessage добавил на вопрос, спасибо – DrStalker 2010-12-06 22:38:58

+0

я вижу. Похоже, у вас нет разрешений SELECT для этой таблицы. Из руководства: «LOCK TABLE ... IN ACCESS SHARE MODE» требует привилегий SELECT в целевой таблице ». http://www.postgresql.org/docs/current/static/sql-lock.html Вам нужно получить разрешения и повторите попытку. – 2010-12-07 06:21:35

3

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

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

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

+0

Полный вопрос об ошибке добавлен в вопрос, спасибо – DrStalker 2010-12-06 22:39:26

2

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

НТН

6

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

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 
3

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

Я первый изменить ownship к 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;   

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

0

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

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

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

Смежные вопросы