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
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?
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
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é?
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.
https://forums.aws.Amazon.com/thread.jspa?threadID=151526
ce lien m'a beaucoup aidé. Il fait référence à un autre,
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.
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
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