J'ai une base de données qui a été exportée avec pg_dump, mais maintenant, quand j'essaie de l'importer à nouveau avec:
psql -d databasename < mydump.sql
Il échoue à essayer d'accorder des rôles à des personnes qui n'existent pas. (l'erreur indique que le "rôle" xxx "n'existe pas")
Existe-t-il un moyen d'importer et de définir automatiquement tous les rôles pour mon utilisateur?
Le comportement par défaut de l'importation est qu'il remplace tous les rôles qu'il ne connaît pas par le rôle avec lequel vous effectuez l'importation. Donc, selon ce pour quoi vous avez besoin de la base de données, vous pourriez bien être en train de l'importer et d'ignorer les messages d'erreur.
Citant de http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE
Avant de restaurer un vidage SQL, tous les utilisateurs qui possèdent des objets ou ont reçu des autorisations sur les objets de la base de données vidée doivent déjà exister. Si ce n'est pas le cas, la restauration échouera à recréer les objets avec la propriété et/ou les autorisations d'origine. (Parfois, c'est ce que vous voulez, mais ce n'est généralement pas le cas.)
La réponse que vous cherchez peut-être est d'ajouter le --no-owner
à la pg_restore
commande. Contrairement à la réponse acceptée pour le moment, la commande doit créer chaque objet avec l'utilisateur actuel même si le rôle dans le vidage n'existe pas dans la base de données.
Donc, aucun élément ne sera ignoré par pg_restore mais si certains éléments importés appartiennent à différents utilisateurs, tous les enregistrements seront désormais détenus par un seul utilisateur pour autant que je sache.
Avec pg_restore
vous pouvez utiliser le --role=rolename
option pour forcer l'utilisation d'un nom de rôle pour effectuer la restauration. Mais le vidage doit être au format texte non ordinaire.
Par exemple, vous pouvez effectuer un vidage avec:
pg_dump -F c -Z 9 -f my_file.backup my_database_name
et que vous pouvez le restaurer avec:
pg_restore -d my_database_name --role=my_role_name my_file.backup
pour plus d'informations: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html
Oui, vous pouvez vider tous les objets "globaux" de votre base de données source avec l'option -g de pg_dumpall:
pg_dumpall -g > globals.sql
Exécutez ensuite globals.sql sur votre base de données cible avant d'importer.