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?
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.