2010-12-06 93 views
20

あるサーバーから別のサーバーにpostgres DBをコピーする必要がありますが、私の資格情報にはデータベースをロックする権限がないため、pg_dumpが失敗します。私は、問題のDBに対する完全な読み取り/更新/挿入権を持っています。LOCK権限のないpostgresデータベースのコピー

このデータベースのコピーを作成するにはどうすればよいですか?私は矛盾について心配していない(それはの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

これは本当の問題です。

ユーザーボブが_replication.sl_nodeSELECT特権を持っていることを確認してください。それは万一のSlonyシステムのテーブルか何かですか?

+0

私はこの質問をしてから数年経ちましたが、メモリからは問題を引き起こしていたSlonyのものがいくつかありました。 – DrStalker

+0

DrStalker私は同じ問題があります。私はちょうど別のデータベースをバックアップします。何らかの理由でpg_dumpがslonyテーブルをバックアップしようとしています。どんな考え? –

6

あなたはSELECT権限(読み取りを必要とします)をすべてのデータベースオブジェクトに適用して、ダンプを作成します。LOCKのアクセス権はありません。ダンプを作成するためにpg_dumpを起動すると、完全なエラーメッセージは何ですか?

+0

完全にErrorMessageが、疑問を私は見感謝 – DrStalker

+0

が追加されます。このテーブルにSELECT権限がないようです。マニュアルから: "LOCK TABLE ... ACCESS SHARE MODEでは、ターゲット表に対するSELECT権限が必要です。" http://www.postgresql.org/docs/current/static/sql-lock.html権限を取得してもう一度やり直す必要があります。 –

3

pg_dumpはデータベース全体をロックしませんが、ダンプしようとしているすべてのテーブルを明示的にロックします。このロックは、SELECTステートメントで必要とされるのと同じロックレベルである「アクセス共有モード」で実行されます。間にドロップされるテーブルの1つに対して、ダンプするテーブルを決定してからデータを取得することを防ぎます。

あなたの問題は実際にはあなたが許可のないテーブルをダンプしようとしているように聞こえるでしょうか? PostgreSQLには、データベースレベルの読み取り/更新/挿入権限がありません。したがって、選択した権限がどこか一つのテーブルから失われているだけかもしれません...

Frank H.が示唆しているように、それを解読しようとするでしょう。

+0

質問にフルエラーメッセージが追加されました – DrStalker

2

正しい-U(そのdbを所有しているユーザー)と 'pg_dump'を実行しましたか?はいの場合は、他のポスターと同じように、権限を確認してください。このリンクは私をたくさん助けた

sudo -u postgres /usr/local/pgsql/bin/pg_restore -U postgres -d db_name -v file_name.pgdump 
6

HTHは、これが働いていました。それは私が最初に

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;   

はその後、私は私の全体のデータベースをダンプすることができる午前、コードのこの部分を貼り付け、rds_superuserに自機を変更

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

、別のものをいいます。

3

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

:私は

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

その後DBを作成して、pg_restoreの実行のために

+0

これは私がpostgres 9.5から9.6にアップグレードし、RDSでこの問題が発生し始めたときに私のために働いた – psychok7

+0

私にとって最初のステップは 'スキーマトポロジの所有者をrds_superuser;に変更することでした。 – psychok7

0

これは私のために-d dbname -n schemaname

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

デフォルトのスキーマを働いpublic

関連する問題