mengapa pg_restore mengabaikan --create? Kesalahan: gagal: FATAL: database "new_db" tidak ada

16

Saya mencoba menjalankan perintah berikut:

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

Saya mendapat:

failed: FATAL:  database "new_db" does not exist
andilab
sumber

Jawaban:

19

Ini karena cara pg_restore bekerja.

manual pg_restore berbunyi sebagai berikut:

-C, --create Buat database sebelum kembali ke dalamnya. Jika --clean juga ditentukan, jatuhkan dan buat kembali basis data target sebelum menghubungkannya.

Ketika opsi ini digunakan, database bernama -d hanya digunakan untuk mengeluarkan perintah DROP DATABASE dan CREATE DATABASE . Semua data dikembalikan ke nama database yang muncul di arsip .

-D akan mengembalikan dalam database yang diberikan jika dan hanya jika -C tidak digunakan. Jika -C digunakan, database digunakan sebagai "launchpad", bukan sebagai tujuan.

SCO
sumber
6
Untuk memperjelas: tidak ada cara untuk membuat nama database yang sewenang-wenang dan mengembalikannya pg_restore. Opsi -C hanya dapat membuat database yang namanya cocok dengan nama database di file dump. Untuk mengembalikan ke database yang berubah-ubah, Anda harus menjalankan CREATE DATABASE new_db;dalam psql sebelum Anda menjalankan pg_restore --dbname=new_db.
Luke
perintah sayadocker-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
5
Mengapa alat harus membingungkan ketika mereka bisa mudah?
Augustin Riedinger
8

Singkatnya, Anda ingin (bersih yang sudah ada): (perhatikan nama database-nya postgres)

pg_restore -c -d postgres db.dump

atau (buat baru)

pg_restore -C -d postgres db.dump

atau (buat baru secara eksplisit)

createdatabase the_database
pg_restore -d the_database db.dump

Lihat apa yang dikatakan SCO untuk lebih jelasnya.

lzap
sumber
Saran pertama Anda tidak berfungsi pada 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan
Saya dapat mengkonfirmasi bahwa ini berfungsi (setelah diedit, dan setelah memperbaiki kesalahan mengeja "postgres"). pg_restore -C -d postgres db.dumpmungkin terlihat menakutkan, tetapi tidak melakukan apa pun pada database postgres, ia hanya menggunakannya untuk koneksi awal.
Zilk
0

Untuk sedikit lebih eksplisit, inilah yang saya lakukan yang memecahkan masalah bagi saya:

  1. Buat database kosong dengan nama yang Anda inginkan: (dalam kasus saya nama pengguna adalah 'postgres')

    psql -U [username]

Ini akan menanyakan kata sandi Anda. Pada titik ini Anda akan masuk sebagai [nama pengguna]. Ketikkan yang berikut ini:

    CREATE DATABASE [dbname];

Sekarang keluar dari sesi dan kembali ke sesi terminal reguler Anda.

  1. Kembalikan database dari file yang telah Anda atur nama database target sebagai nama database yang baru saja Anda buat.

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

Di mana [nama_file_path / nama file] adalah lokasi file db atau file teks yang ingin Anda pulihkan.

AntiPawn79
sumber
Saat membuat cadangan menggunakan -Fopsi de Anda harus menggunakan pg_restore untuk mengembalikan cadangan kecuali Anda menggunakan -F pyang menghasilkan file teks biasa dengan kalimat sql.
EAmez