neden pg_restore --create'ı yok sayar? Hata: başarısız oldu: FATAL: “new_db” veritabanı mevcut değil


17

Aşağıdaki komutu çalıştırmak çalışıyorum:

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

Alırım:

failed: FATAL:  database "new_db" does not exist

Yanıtlar:


19

Bunun nedeni pg_restore'un çalışma şeklidir.

pg_restore kılavuzu şu şekildedir:

-C, --create Geri yüklemeden önce veritabanı oluşturun. --Clean ayrıca belirtilirse, hedef veritabanını bağlamadan önce bırakın ve yeniden oluşturun.

Bu seçenek kullanıldığında, -d adlı veritabanı yalnızca ilk DROP DATABASE ve CREATE DATABASE komutlarını vermek için kullanılır . Tüm veriler arşivde görünen veritabanı adına geri yüklenir .

-D yalnızca -C kullanılmazsa verilen veritabanında geri yüklenir. -C kullanılırsa, veritabanı hedef olarak değil, "fırlatma rampası" olarak kullanılır.


6
Açıklığa kavuşturmak için: isteğe bağlı bir veritabanı adı oluşturmanın ve içine geri yüklemenin bir yolu yoktur pg_restore. -C seçeneği yalnızca adı döküm dosyasındaki veritabanı adıyla eşleşen bir veritabanı oluşturabilir. Rasgele bir veritabanına geri yüklemek için çalıştırmadan CREATE DATABASE new_db;önce psql'de çalıştırmanız gerekir pg_restore --dbname=new_db.
Luke

Komutadocker-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
Aletlerin kolay olabileceği zaman neden kafa karıştırıcı olması gerekir?
Augustin Riedinger

8

Kısacası, (mevcut olanı temizle): (veritabanı adının olduğunu unutmayın postgres)

pg_restore -c -d postgres db.dump

veya (yeni oluştur)

pg_restore -C -d postgres db.dump

veya (açıkça yeni oluştur)

createdatabase the_database
pg_restore -d the_database db.dump

Daha fazla ayrıntı için SCO'nun söylediklerine bakın.


İlk öneriniz 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan

Bunun çalıştığını onaylayabilirim (düzenlemeden sonra ve "postgres" yazım hatalarını giderdikten sonra). pg_restore -C -d postgres db.dumpkorkutucu görünebilir, ancak postgres veritabanına hiçbir şey yapmaz, yalnızca ilk bağlantı için kullanır.
19'da Zilk

0

Biraz daha açık olmak gerekirse, bu benim için sorunu çözdü yaptım:

  1. İstediğiniz adla boş bir veritabanı oluşturun: (benim durumumda kullanıcı adı 'postgres' idi)

    psql -U [username]

Daha sonra parolanızı girmenizi isteyecektir. Bu noktada [kullanıcı adı] olarak giriş yapacaksınız. Aşağıdakileri yazın:

    CREATE DATABASE [dbname];

Şimdi oturumdan çıkın ve normal terminal oturumunuza geri dönün.

  1. Veritabanını, hedef veritabanı adını yeni oluşturduğunuz veritabanı adı olarak ayarladığınız dosyadan geri yükleyin.

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

Burada [dosya_yolunuz / dosyaadı] geri yüklemek istediğiniz db dosyasının veya metin dosyasının konumudur.


De -Fseçeneğini kullanarak yedek oluştururken, -F psql cümleleri olan düz bir metin dosyası üreten kullanmadığınız sürece yedeklemeyi geri yüklemek için pg_restore'u kullanmanız gerekir .
EAmez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.