¿Por qué pg_restore ignora --create? Error: fallido: FATAL: la base de datos "new_db" no existe


16

Estoy tratando de ejecutar el siguiente comando:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Yo obtengo:

failed: FATAL:  database "new_db" does not exist

Respuestas:


19

Esto se debe a que es la forma en que funciona pg_restore.

El manual de pg_restore dice lo siguiente:

-C, --create Crea la base de datos antes de restaurarla. Si también se especifica --clean, suelte y vuelva a crear la base de datos de destino antes de conectarse a ella.

Cuando se usa esta opción, la base de datos nombrada con -d se usa solo para emitir los comandos iniciales DROP DATABASE y CREATE DATABASE . Todos los datos se restauran en el nombre de la base de datos que aparece en el archivo .

La -d se restaurará en la base de datos dada si y solo si no se usa -C. Si se usa -C, la base de datos se usa como una "plataforma de lanzamiento", no como el destino.


66
Para aclarar: no hay forma de crear un nombre de base de datos arbitrario y restaurarlo con pg_restore. La opción -C solo puede crear una base de datos cuyo nombre coincida con el nombre de la base de datos en el archivo de volcado. Para restaurar a una base de datos arbitraria, debe ejecutar CREATE DATABASE new_db;en psql antes de ejecutar pg_restore --dbname=new_db.
Luke

mi comandodocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma

55
¿Por qué las herramientas tienen que ser confusas cuando podrían ser fáciles?
Augustin Riedinger

8

En resumen, desea cualquiera (limpiar existente): (tenga en cuenta que el nombre de la base de datos es postgres)

pg_restore -c -d postgres db.dump

o (crear nuevo)

pg_restore -C -d postgres db.dump

o (crear nuevo explícitamente)

createdatabase the_database
pg_restore -d the_database db.dump

Vea lo que dijo SCO para más detalles.


Su primera sugerencia no funcionó en 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan

Puedo confirmar que esto funciona (después de la edición y después de corregir la falta de ortografía de "postgres"). pg_restore -C -d postgres db.dumppuede parecer aterrador, pero no hace nada a la base de datos de postgres, solo lo usa para la conexión inicial.
Zilk

0

Para ser un poco más explícito, esto es lo que hice que resolvió el problema para mí:

  1. Cree una base de datos vacía con el nombre que desee: (en mi caso, el nombre de usuario era 'postgres')

    psql -U [username]

Luego le pedirá su contraseña. En este punto, iniciará sesión como [nombre de usuario]. Escriba lo siguiente:

    CREATE DATABASE [dbname];

Ahora salga de la sesión y regrese a su sesión regular de terminal.

  1. Restaure la base de datos desde el archivo que tiene configurando el nombre de la base de datos de destino como el nombre de la base de datos que acaba de crear.

    cat [your_file_path/filename] | psql -U [username] [dbname]

Donde [your_file_path / filename] es la ubicación del archivo db o archivo de texto que desea restaurar.


Al crear la copia de seguridad usando la -Fopción de, debe usar pg_restore para restaurar la copia de seguridad, a menos que use una -F pque produzca un archivo de texto sin formato con frases sql.
EAmez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.