web-dev-qa-db-fra.com

erreur pg_restore: le rôle XXX n'existe pas

Essayer de répliquer une base de données d'un système à un autre. Les versions concernées sont 9.5.0 (source) et 9.5.2 (cible).

Le nom de la base de données source est foodb avec le propriétaire pgdba et le nom de la base de données cible sera nommé foodb_dev avec le propriétaire pgdev.

Toutes les commandes sont exécutées sur le système cible qui hébergera la réplique.

Le pg_dump la commande est:

    pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean;

Cela fonctionne sans erreurs.

Le correspondant pg_restore est:

    pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump

ce qui jette une erreur:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3969; 0 0 ACL public pgdba
pg_restore: [archiver (db)] could not execute query: ERROR:  role "pgdba" does not exist
Command was: REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM pgdba;
GRANT ALL ON SCHEMA public TO pgdba;
GRANT ...

Si je génère le fichier de vidage au format texte brut (-Fp) Je vois qu'il comprend plusieurs entrées comme:

REVOKE ALL ON TABLE dump_thread FROM PUBLIC;
REVOKE ALL ON TABLE dump_thread FROM pgdba;
GRANT ALL ON TABLE dump_thread TO pgdba;
GRANT SELECT ON TABLE dump_thread TO readonly;

qui essaient de définir des privilèges pour l'utilisateur pgdba qui bien sûr n'existe même pas en tant qu'utilisateur sur le système cible qui n'a que l'utilisateur pgdev, et donc les erreurs de pg_restore.

Sur la base de données db les privilèges par exemple de dump_thread table:

# \dp+ dump_thread
Access privileges
-[ RECORD 1 ]-----+--------------------
Schema            | public
Name              | dump_thread
Type              | table
Access privileges | pgdba=arwdDxt/pgdba+
                  | readonly=r/pgdba
Column privileges |
Policies          |

Une solution rapide serait d'ajouter simplement un utilisateur pgdba sur le cluster cible et d'en finir avec.

Mais le --no-owner veillez à ne pas inclure les commandes spécifiques au propriétaire dans le vidage en premier lieu?

30
Thalis K.

J'ai réalisé le --no-owner n'est pas le même que le -x. J'ai ajouté le -x à tous pg_dump commandes, ce qui signifie:

-x, --no-privileges          do not dump privileges (grant/revoke)

ce qui en effet exclut les commandes GRANT/REVOKE incriminées du vidage. Problème résolu.

30
Thalis K.