Jawaban:
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.
docker-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"'
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.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
mungkin terlihat menakutkan, tetapi tidak melakukan apa pun pada database postgres, ia hanya menggunakannya untuk koneksi awal.
Untuk sedikit lebih eksplisit, inilah yang saya lakukan yang memecahkan masalah bagi saya:
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.
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.
-F
opsi de Anda harus menggunakan pg_restore untuk mengembalikan cadangan kecuali Anda menggunakan -F p
yang menghasilkan file teks biasa dengan kalimat sql.
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 menjalankanCREATE DATABASE new_db;
dalam psql sebelum Anda menjalankanpg_restore --dbname=new_db
.