質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

2回答

8254閲覧

PostgreSQLのpg_restoreコマンドについて

takashiro7300

総合スコア12

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2021/11/05 14:12

AサーバとBサーバ、それぞれにPostgreSQLのデータベースがあります。

Bサーバから、AサーバのDBバックアップを取得しています。

バックアップ取得コマンド:
pg_dump -U ${pg_user} -h ${pg_host} -w --format=custom ${pg_db} > /aaa/bbb/db_backup.dmp

今回、Bサーバの /aaa/bbb/db_backup.dmpで、
BサーバのPostgreSQLデータベースにリストアしたいです。

そして、リストアコマンドとして、

①BサーバのDBをドロップする。
dropdb -p 5432 -U postgres ${pg_user}

②DBを作る。
createdb -p 5432 -U postgres -O ${pg_db} -E UTF8 ${pg_db}

③リストアする。
pg_restore -p 5432 -d ${pg_user} /aaa/bbb/db_backup.dmp

と、打ったのですが、
③の後、約2時間後、
pg_restore -p 5432 -d ${pg_db} /aaa/bbb/db_backup.dmp
pg_restore: [カスタムアーカイバ] 入力ファイルから読み込めませんでした: ファイルの終了です
というメッセージが表示されました。
BサーバのDBの中を見ても、データは入ってませんでした。

この場合、どのように対応したら良いでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/11/12 08:43

バックアップしたファイルのサイズはどの程度ですか?
guest

回答2

0

③の後、約2時間後、
pg_restore -p 5432 -d ${pg_db} /aaa/bbb/db_backup.dmp
pg_restore: [カスタムアーカイバ] 入力ファイルから読み込めませんでした: ファイルの終了です
というメッセージが表示されました。

db_backup.dmpの末尾が不正に終了しているようです。要するに、db_backup.dmpの内容が途中で切れているようです。
原因は2つ考えられます。
1つは、db_backup.dmpファイル自体が破損している可能性です。
もう1つは、pg_restore実行時のメモリ不足の可能性です。カスタム形式で圧縮されているdb_backup.dmpを、pg_restore実行時にメモリ不足で展開できていないのかもしれません。

まず、db_backup.dmpファイル自体が破損していないか確認してください。
pg_restore -f /aaa/bbb/db_backup.sql /aaa/bbb/db_backup.dmpを実行して、カスタム形式のバックアップをプレーン形式に変換して/aaa/bbb/db_backup.sqlに出力できるか確認してください。
エラーが発生するようなら、db_backup.dmpファイル自体が破損しています。正常なバックアップを取得し直してください。
エラーが発生しなければ、db_backup.dmpファイル自体は正常で、pg_restore実行時のメモリ不足が考えられます。上の確認でプレーン形式のバックアップファイルは作成できているので、プレーン形式のバックアップでリストアできないか確認してください。プレーン形式のバックアップのリストア方法はpsql -p 5432 -d ${pg_db} -f /aaa/bbb/db_backup.sqlです。

投稿2021/11/13 17:56

編集2021/11/14 04:53
synydy

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

pg_dumpのオプションでFcをつけているので、当然pg_restoreでもFcをつけないとだめです。
Fcは、--format=customの事でもあります。
短いほうが好きなので、自分は-Fcをいつも使っています。
pg_dump -Fc ...でダンプした場合は、pg_restore -Fc ...で復元しなければいけません。
それだけの事です。

今回は、pg_dump -U ${pg_user} -h ${pg_host} -w --format=custom ${pg_db} > /aaa/bbb/db_backup.dmp
でダンプしたファイルを、
pg_restore -p 5432 -d ${pg_user} /aaa/bbb/db_backup.dmpで復元しようとしたという事ですが、
先程指摘したように、カスタムフォーマットの指定がありません。
それで失敗したのではないかと推測します。

pg_restore -p 5432 --format=custom -d ${pg_db} /aaa/bbb/db_backup.dmp
または
pg_restore -p 5432 -Fc -d ${pg_db} /aaa/bbb/db_backup.dmp
で実行したら復元できたりしないでしょうか?

投稿2021/11/05 14:45

mingos

総合スコア4207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takashiro7300

2021/11/08 04:36

ご回答ありがとうございます。 ですが試したところ、 「--format=custom」 「-Fc」 両方ともダメでした・・・。 同じメッセージ、 pg_restore: [カスタムアーカイバ] 入力ファイルから読み込めませんでした: ファイルの終了です になりました。 ちなみに、この状態で「df -h」をしてみると、 一応DBのディレクトリは十分にそれらしいだけの容量が入っていますが、 適当なテーブルの件数を確認すると0件で、やはり上手く行ってないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問