pg_dump và pg_restore: tệp đầu vào dường như không phải là một kho lưu trữ hợp lệ


66

Tôi đã sử dụng pg_dump trên một máy và sao chép tệp kết quả sang máy khác, nơi tôi đã cố gắng khôi phục nó. Tôi tin rằng lược đồ là như nhau. Tuy nhiên, tôi nhận được:

pg_restore: [archiver] input file does not appear to be a valid archive

Tôi đã thực hiện các thao tác sau:

pg_dump -a -f db.txt dbname

và:

pg_restore -a -d dbname db.txt

Điều gì có thể sai?


Hãy thử nhập kết xuất trên cùng một máy đã tạo ra nó. Ngoài ra, hãy kiểm tra các phiên bản Postgres.
Hank Gay

Tôi không thể thử nhập nó trên cùng một máy, vì đó là máy sản xuất. Bất cứ ý tưởng, tôi có thể làm gì khác?
gruszczy

Giải pháp này cũng có thể phù hợp với một số người: stackoverflow.com/questions/42433414/ cấp
Muhammad Hannan

Câu trả lời:


93

Bạn đang bán phá giá ở định dạng sql đơn giản được thiết kế để cung cấp cho psql. Điều này không được công nhận bởi pg_restore.

cat db.txt | psql dbname

nên làm mánh khóe


5
hoặc psql dbname < db.txt;)
Aleksey Deryagin

26

pg_dumptheo mặc định tạo ra các lệnh chung sql cần thiết để tạo lại dữ liệu. Để khôi phục nó, bạn chỉ cần gọi psql(không pg_restore) với tệp làm đầu vào. pg_restorechỉ được sử dụng cho định dạng nhị phân (không mặc định và ít được khuyến nghị hơn ) pg_dump. Đọc tài liệu .

Cập nhật: Các pg_dumpđịnh dạng nhị phân ( -Fc -Ft) sẽ được sử dụng pg_restorelà ok và cung cấp thêm một số tính linh hoạt. Nhưng chúng ít tiêu chuẩn hơn (không phải SQL), ít có khả năng nhập từ một số công cụ (ví dụ: giao diện php) hoặc thao tác với trình soạn thảo văn bản và ít di động hơn với các phiên bản khác và thậm chí các cơ sở dữ liệu khác. Để sao lưu, tôi sẽ sử dụng định dạng đơn giản mặc định. Đối với các kịch bản khác, tùy chọn nhị phân + pg_restore có thể bằng hoặc nhiều apt hơn.

Điểm cần lưu ý là trong Postgresql, trong kịch bản điển hình , việc sao lưu thông thường được thực hiện bởi pg_dump (đơn giản) và khôi phục với máy khách dòng lệnh tiêu chuẩn ( psql ).


2
[OT] Tôi xin khác về trạng thái "không được đề xuất" của định dạng đầu ra tùy chỉnh - câu "Đây là định dạng linh hoạt nhất ở chỗ nó cho phép sắp xếp lại tải dữ liệu cũng như định nghĩa đối tượng ..." từ hướng dẫn sử dụng với tôi như một sự chứng thực
Milen A. Radev

"Không khuyến khích" là một lời nói quá, tôi đồng ý. Nhưng "linh hoạt nhất" không nhất thiết có nghĩa là "được khuyến nghị nhất". Làm rõ.
leonbloy

13

Hãy thử chuyển --format=ctùy chọn đến pg_dump. Điều này sẽ cho phép pg_restorekhôi phục nó.


Bất cứ ai sửa đổi điều này xuống muốn giải thích tại sao? Câu trả lời được chấp nhận giải thích rằng điều này sẽ hoạt động :-)

@skrafi: quan điểm của bạn là gì?
psmears

1
xin lỗi, sao chép sai đầu ra, đầu ra đúng là pg_restore: [archiver] did not find magic string in file headervì vậy điều này không hoạt động đối với kết xuất sql đơn giản
skrafi

@skrafi: Tôi không chắc ý của bạn là gì. Nếu bạn sử dụng pg_dump --format=c ...> archivefile, và sau đó sử dụng pg_restoretrên archivefile, sau đó (ít nhất là khi tôi thử nghiệm nó chỉ là bây giờ) nó hoạt động tốt. Có lẽ tập tin của bạn bị hỏng bằng cách nào đó? Hoặc bạn đã gặp một lỗi cụ thể?
psmears

6

Đây là những gì tôi sẽ làm để sao lưu cơ sở dữ liệu cũ của mình và khôi phục

Để sao lưu cơ sở dữ liệu của bạn

pg_dump --format=c olddb_name > db_dump_file.dump

Để khôi phục bản sao lưu đó

pg_restore -v -d newdb_name db_dump_file.dump

Đọc thêm về pg_dumppg_restore


5

Đối với người dùng windows hãy thử

type db.txt | psql --username="YOURNAME" dbname

Hoạt động như một lá bùa


Điều này đã cứu tôi cảm ơn bạn! Nên được chấp nhận câu trả lời cho các cửa sổ ít nhất.
Daniel Butler

2

Bạn có thể làm gì đó với SOURCElệnh của MySQL :

psql dbname

Sau đó, trong thiết bị đầu cuối postgresql:

\i filename

2

mèo dumpFileName | psql -h ip -d dbName -U tên người dùng -W


1
Nó thường hữu ích nếu bạn giải thích những gì nó làm và tại sao nó có thể giúp đỡ.
Falcon Momot

1

Thông báo lỗi này cũng có thể có nghĩa là thực sự có lỗi với tệp sao lưu (hoặc giả định của bạn về nó).

Trong một trường hợp, tôi đã gắn một tập tin sao lưu vào bộ chứa Docker và cố gắng khôi phục, nhưng nó đã thất bại does not appear to be a valid archive. Và trên thực tế, tập tin trống, vì việc gắn kết không được thực hiện chính xác.

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.