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

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

Db Source nom est foodb avec le propriétaire pgdba et cible db nom sera nommé foodb_dev avec le propriétaire pgdev.

Toutes les commandes sont exécutées sur le système cible qui sera l'hôte de la réplique.

La pg_dump 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

qui déclenche 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érer le fichier d'image 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;

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

Sur la base de données source des privilèges, par exemple, de la 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 de simplement ajouter un utilisateur pgdba sur le cluster cible et être fait avec elle.

Mais ne pas le --no-owner prendre soin de ne pas y compris les propriétaires des commandes spécifiques, dans le dump en premier lieu?

InformationsquelleAutor Thalis K. | 2016-05-17