web-dev-qa-db-fra.com

Copier une base de données postgres sans les autorisations LOCK

J'ai besoin de copier une base de données postgres d'un serveur à un autre, mais les informations d'identification que j'ai ne sont pas autorisées à verrouiller la base de données, de sorte qu'un pg_dump échoue. J'ai les droits complets de lecture/mise à jour/insertion sur la base de données en question.

Comment puis-je faire une copie de cette base de données? Je ne m'inquiète pas des incohérences (il s'agit d'une petite base de données sur un serveur de développement, donc des risques minimes d'incohérences lors de l'extraction).

[edit] Erreur complète:

$ 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  
25
DrStalker

ERREUR: permission refusée pour la relation sl_node

C'est ton vrai problème. 

Assurez-vous que l'utilisateur bob a le privilège SELECT pour _replication.sl_node. Est-ce par hasard une table système Slony ou quelque chose? 

18

Cela a fonctionné pour moi 

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

Créez ensuite une base de données et exécutez pg_restore it: 

 Sudo -u postgres /usr/local/pgsql/bin/pg_restore -U postgres -d db_name -v file_name.pgdump
8
mamesaye

Vous devez disposer d'autorisations SELECT (lecture) sur tous les objets de base de données pour créer un dump, et non d'autorisations LOCK (quelles qu'elles soient). Quel est le message d'erreur complet lorsque vous démarrez pg_dump pour effectuer un cliché?

6
Frank Heikens

pg_dump ne verrouille pas la totalité de la base de données mais un verrou explicite sur toutes les tables à vider. Ce verrou est utilisé en "mode de partage d'accès", qui correspond au même niveau de verrouillage que celui requis par une instruction SELECT: il a simplement pour but d'éviter que l'une des tables ne soit abandonnée entre elle, décidant quelles tables dump puis récupère les données.

Il semble donc que votre problème pourrait bien être d’essayer de vider une table pour laquelle vous n’avez pas l’autorisation? PostgreSQL n'a pas les droits de lecture/mise à jour/insertion au niveau base de données, alors peut-être que le privilège select d'une table unique est manquant ...

Comme Frank H. l'a suggéré, postez le message d'erreur complet et nous essaierons de le décoder.

4
araqnid

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

ce lien m'a beaucoup aidé. Il fait référence à un autre, 

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

Je change d'abord le propriétaire en rds_superuser, puis je colle ce morceau de code, 

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;        

par la suite, je peux vider toute ma base de données.

4
TonyTony

Avez-vous exécuté 'pg_dump' avec le correct -U (utilisateur à qui appartient cette base de données)? Si oui, alors, comme le dit une autre affiche, vérifiez les autorisations.

HTH

2
zeratool

Cela a fonctionné pour moi -d dbname -n schemaname

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

le schéma par défaut est public

0
Anjaneyulu Batta