复制没有LOCK权限的postgres数据库

时间:2010-12-06 05:57:42

标签: database postgresql

我需要将一个postgres数据库从一个服务器复制到另一个服务器,但我拥有的凭据没有锁定数据库的权限,因此pg_dump失败。我对相关数据库拥有完整的读取/更新/插入权限。

如何制作此数据库的副本?我并不担心不一致(它是开发服务器上的一个小型数据库,因此在提取过程中出现不一致的风险很小)

[edit]完整错误:

$ 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 个答案:

答案 0 :(得分:19)

  

错误:关系sl_node

的权限被拒绝

这是你真正的问题。

确保用户bob对SELECT具有_replication.sl_node权限。这有什么机会是Slony系统表还是什么?

答案 1 :(得分:8)

这对我有用

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

答案 2 :(得分:6)

您需要对所有数据库对象SELECT权限(读取)进行转储,而不是LOCK权限(无论可能是什么)。启动pg_dump进行转储时,完整的错误消息是什么?

答案 3 :(得分:4)

pg_dump不会锁定整个数据库,但它确实会对要转储的所有表进行显式锁定。此锁定采用“访问共享模式”,这与SELECT语句所需的锁级别相同:它只是为了防止在它之间删除其中一个表,决定转储哪些表然后获取数据。

所以听起来你的问题可能实际上是它试图转储你没有权限的表? PostgreSQL没有数据库级别的读/更新/插入权限,所以也许你只是从某个表的某个表中错过了select权限...

正如Frank H.建议的那样,发布完整的错误消息,我们将尝试帮助解码它。

答案 4 :(得分:4)

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;        

此后,我可以转储整个数据库。

答案 5 :(得分:2)

您是否使用正确的-U(拥有该数据库的用户)运行'pg_dump'?如果是,那就像其他海报所说的那样,检查权限。

HTH

答案 6 :(得分:0)

这对我有用-d dbname -n schemaname

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

默认架构为public