我需要将一个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
答案 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
这个链接帮了我很多忙。它指的是另一个,
我首先将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