tại sao pg_restore bỏ qua - tạo ra? Lỗi: không thành công: FATAL: cơ sở dữ liệu


16

Tôi đang cố chạy lệnh sau:

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

Tôi có:

failed: FATAL:  database "new_db" does not exist

Câu trả lời:


19

Điều này là bởi vì đó là cách pg_restore hoạt động.

hướng dẫn pg_restore đọc như sau:

-C, - tạo Tạo cơ sở dữ liệu trước khi khôi phục vào đó. Nếu --clean cũng được chỉ định, hãy thả và tạo lại cơ sở dữ liệu đích trước khi kết nối với nó.

Khi tùy chọn này được sử dụng, cơ sở dữ liệu có tên -d chỉ được sử dụng để ban hành các lệnh DROP DATABASE và CREATE DATABASE ban đầu . Tất cả dữ liệu được khôi phục vào tên cơ sở dữ liệu xuất hiện trong kho lưu trữ .

-D sẽ khôi phục trong cơ sở dữ liệu đã cho nếu và chỉ khi -C không được sử dụng. Nếu -C được sử dụng, cơ sở dữ liệu được sử dụng làm "bảng khởi chạy", không phải là đích đến.


6
Để làm rõ: không có cách nào để tạo một tên cơ sở dữ liệu tùy ý và khôi phục vào đó với pg_restore. Tùy chọn -C chỉ có thể tạo cơ sở dữ liệu có tên khớp với tên cơ sở dữ liệu trong tệp kết xuất. Để khôi phục cơ sở dữ liệu tùy ý, bạn phải chạy CREATE DATABASE new_db;trong psql trước khi chạy pg_restore --dbname=new_db.
Luke

lệnh của tôidocker-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
Tại sao các công cụ phải gây nhầm lẫn khi chúng có thể dễ dàng?
Augustin Riedinger

8

Nói tóm lại, bạn muốn một trong hai (sạch hiện có): (lưu ý tên cơ sở dữ liệu là postgres)

pg_restore -c -d postgres db.dump

hoặc (tạo mới)

pg_restore -C -d postgres db.dump

hoặc (tạo mới một cách rõ ràng)

createdatabase the_database
pg_restore -d the_database db.dump

Xem những gì SCO nói để biết thêm chi tiết.


Đề xuất đầu tiên của bạn không hoạt động vào ngày 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan

Tôi có thể xác nhận rằng điều này hoạt động (sau khi chỉnh sửa và sau khi sửa lỗi chính tả của "postgres"). pg_restore -C -d postgres db.dumpcó thể trông đáng sợ, nhưng nó không làm gì với cơ sở dữ liệu postgres, nó chỉ sử dụng nó cho kết nối ban đầu.
Zilk

0

Nói rõ hơn một chút, đây là những gì tôi đã làm đã giải quyết vấn đề cho tôi:

  1. Tạo một cơ sở dữ liệu trống với tên bạn muốn: (trong trường hợp của tôi tên người dùng là 'postgres')

    psql -U [username]

Sau đó nó sẽ nhắc bạn nhập mật khẩu của bạn. Tại thời điểm này, bạn sẽ đăng nhập với tư cách [tên người dùng]. Gõ như sau:

    CREATE DATABASE [dbname];

Bây giờ thoát khỏi phiên và quay trở lại phiên thiết bị đầu cuối thông thường của bạn.

  1. Khôi phục cơ sở dữ liệu từ tệp bạn đã đặt tên cơ sở dữ liệu đích làm tên cơ sở dữ liệu bạn vừa tạo.

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

Trong đó [your_file_path / filename] là vị trí của tệp db hoặc tệp văn bản bạn muốn khôi phục.


Khi tạo bản sao lưu bằng -Ftùy chọn de, bạn phải sử dụng pg_restore để khôi phục bản sao lưu trừ khi bạn sử dụng -F ptệp tạo văn bản đơn giản với câu sql.
EAmez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.