database - please - psql restore sql file
Error pg_restore: el rol XXX no existe (1)
Me di cuenta de que el --no-owner
no es lo mismo que el -x
. pg_dump
el -x
a todos los comandos pg_dump
, lo que significa:
-x, --no-privileges do not dump privileges (grant/revoke)
que en efecto excluye los comandos GRANT
/ REVOKE
ofensivos del volcado. Problema resuelto.
Intentando replicar una base de datos de un sistema a otro. Las versiones involucradas son 9.5.0 (fuente) y 9.5.2 (objetivo).
El nombre de la fuente db es foodb
con el propietario pgdba
y el nombre de la db de destino se llamará foodb_dev
con el propietario pgdev
.
Todos los comandos se ejecutan en el sistema de destino que albergará la réplica.
El comando pg_dump
es:
pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean;
Esto se ejecuta sin errores.
El pg_restore
correspondiente es:
pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump
que arroja error:
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 genero el archivo de volcado en formato de texto plano ( -Fp
) veo que incluye varias entradas como:
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 intentan establecer privilegios para el usuario pgdba
que, por supuesto, ni siquiera existe como usuario en el sistema de destino que solo tiene usuario pgdev
y, por lo tanto, los errores de pg_restore
.
En la fuente db los privilegios, por ejemplo, de la tabla dump_thread
:
# /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 |
Una solución rápida sería simplemente agregar un usuario pgdba
en el clúster de destino y terminar con él.
Pero, ¿no debería el --no-owner
hacerse cargo de no incluir los comandos específicos del propietario en el volcado en primer lugar?