Câu trả lời:
Đ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.
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"'
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.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
có 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.
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:
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.
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.
-F
tù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 p
tệp tạo văn bản đơn giản với câu sql.
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ạyCREATE DATABASE new_db;
trong psql trước khi chạypg_restore --dbname=new_db
.