Estoy usando pg_dump / pg_restore para hacer una copia de seguridad y restaurar una base de datos PostgreSQL, pero recibo algunos mensajes de error (y un estado de salida distinto de cero) de pg_restore. Intenté un caso base súper simple (descrito a continuación) pero aún obtuve estos errores:
pg_restore: [archiver (db)] Error al PROCESAR TOC: pg_restore: [archiver (db)] Error de la entrada 5 de TOC; 2615 2200 SCHEMA public postgres pg_restore: [archiver (db)] no pudo ejecutar la consulta: ERROR: el esquema "público" ya existe El comando era: CREAR ESQUEMA público;
Pasos para reproducir:
- Instale una distribución Ubuntu 14.04 nueva y vainilla (estoy usando Vagrant con esta caja Vagrant ).
- Instale PostgreSQL 9.3, configúrelo para permitir conexiones locales como usuario de PostgreSQL "postgres" de cualquier usuario de Linux.
Crea una base de datos de prueba. Solo estoy haciendo:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Escriba "ayuda" para obtener ayuda. postgres = # crear base de datos mydb; CREAR BASE DE DATOS postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Escriba "ayuda" para obtener ayuda. mydb = # crear datos de tabla (entrada bigint); CREAR MESA mydb = # insertar en valores de datos (1); INSERTAR 0 1 mydb = # insertar en valores de datos (2); INSERTAR 0 1 mydb = # insertar en valores de datos (3); INSERTAR 0 1 mydb = # \ q
Cree una copia de seguridad de la base de datos de esta manera:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Elimine algunas filas de la tabla de datos en mydb para que podamos saber si restauramos los datos con éxito.
Restaurar la base de datos con:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Los datos se restauran, pero el comando pg_restore en el paso 6 sale con el estado 1
y muestra la siguiente salida:
pg_restore: [archiver (db)] Error al PROCESAR TOC: pg_restore: [archiver (db)] Error de la entrada 5 de TOC; 2615 2200 SCHEMA public postgres pg_restore: [archiver (db)] no pudo ejecutar la consulta: ERROR: el esquema "público" ya existe El comando era: CREAR ESQUEMA público; ADVERTENCIA: errores ignorados en la restauración: 1
No puedo simplemente ignorar esto porque estoy ejecutando este comando mediante programación y necesito usar el estado de salida para determinar si la restauración falló o no. Inicialmente, me preguntaba si este problema se debía a que puse mi base de datos en público (el esquema predeterminado). Pensé que --create
pg_restore crearía público como resultado de la opción antes de que se restauraran los datos (lo que posiblemente podría intentar crear ese esquema también, ya que es donde está mi tabla), pero cuando intenté los pasos anteriores con mi tabla en un esquema diferente, los resultados fueron los mismos y los mensajes de error fueron idénticos.
¿Estoy haciendo algo mal? ¿Por qué veo este error?
fuente
--create
sinclean
no soluciona el problema.En mi caso, la razón fue que estaba usando
pg_restore
postgresql-contrib versión 11.2 para restaurar un volcado realizado porpg_dump
9.6 en un clúster PostgreSQL 9.6.Después de que bajé mi
pg_restore
versión a 9.6, esteschema "public" already exists
error desapareció y el proceso de restauración funcionó como antes.fuente