あるマシンでpg_dumpを使用し、結果ファイルを別のマシンにコピーして、復元しようとしました。スキーマは同じだと思います。しかし、私は得る:
pg_restore: [archiver] input file does not appear to be a valid archive
私は次の操作を行いました:
pg_dump -a -f db.txt dbname
そして:
pg_restore -a -d dbname db.txt
何が悪いのでしょうか?
あるマシンでpg_dumpを使用し、結果ファイルを別のマシンにコピーして、復元しようとしました。スキーマは同じだと思います。しかし、私は得る:
pg_restore: [archiver] input file does not appear to be a valid archive
私は次の操作を行いました:
pg_dump -a -f db.txt dbname
そして:
pg_restore -a -d dbname db.txt
何が悪いのでしょうか?
回答:
psqlにフィードするように設計されたプレーンなsql形式でダンプしています。これはpg_restoreで認識されません。
cat db.txt | psql dbname
トリックを行う必要があります
psql dbname < db.txt
;)
pg_dump
デフォルトでは、データの再作成に必要なsqlコマンドを作成します。回復するには、入力としてファイルを使用してpsql
(ではなくpg_restore
)呼び出すだけです。pg_restore
は、バイナリ形式(デフォルトではなく、あまり一般的ではありませんが推奨されません)にのみ使用されますpg_dump
。ドキュメントを読んでください。
更新:使用するpg_dump
バイナリ形式(-Fc
-Ft
)は問題なくpg_restore
、ある程度の柔軟性を提供します。しかし、それらはあまり標準的ではなく(SQL以外)、一部のツール(PHPフロントエンドなど)からインポートしたり、テキストエディターで操作したりすることは少なく、他のバージョンや他のデータベースへの移植性は少し劣ります。バックアップについては、デフォルトのプレーン形式に固執します。他のシナリオでは、バイナリ+ pg_restoreオプションは同等またはそれ以上に適しています。
維持するポイントは、Postgresqlでは、典型的なシナリオでは、バックアップは通常pg_dump(プレーン)と標準コマンドラインクライアント(psql)による復元によって行われるということです。
に--format=c
オプションを渡してみてくださいpg_dump
。これでpg_restore
復元できます。
pg_restore: [archiver] did not find magic string in file header
ので、これは単純なSQLダンプのために動作しません
pg_dump --format=c ...> archivefile
からpg_restore
on を使用するarchivefile
と、(少なくとも今テストしたときは)正常に動作します。ファイルが壊れている可能性がありますか?または、特定のバグに遭遇しましたか?
これは、古いデータベースをバックアップして復元するために行うことです
データベースをバックアップするには
pg_dump --format=c olddb_name > db_dump_file.dump
そのバックアップを復元するには
pg_restore -v -d newdb_name db_dump_file.dump
pg_dumpおよびpg_restoreの詳細を読む
Windowsユーザーの場合
type db.txt | psql --username="YOURNAME" dbname
魔法のように働く
cat dumpFileName | psql -h ip -d dbName -U userName -W