web-dev-qa-db-ja.com

pg_restoreを新しいデータベースに

HerokuのPostgresオプションを使用していて、そこからダウンロードしたバックアップがあります。確認できるように、新しいデータベースに復元したいのですが。私はほとんど役に立たないようにさまざまなコマンドを試してきました。私の最初の試み:

$ Sudo -u postgres psql < db/backups/myapp_2018-05-27.pg.dump 
The input is a PostgreSQL custom-format dump.
Use the pg_restore command-line client to restore this dump to a database.

だから私は試してみます:

$ Sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] connection to database "myapp3" failed: FATAL:  database "myapp3" does not exist

-Cオプション がよくわかりません。

-C-作成

復元する前にデータベースを作成します。 --cleanも指定されている場合は、接続する前にターゲットデータベースを削除して再作成します。

このオプションを使用すると、-dで指定されたデータベースは、最初のDROP DATABASEコマンドとCREATE DATABASEコマンドを発行するためにのみ使用されます。すべてのデータは、アーカイブに表示されるデータベース名に復元されます。

新しいデータベースに復元することは、私には理にかなっているように思えます。私は脱線します...(そしておそらくそれは適切に説明されています here

同じスキーマを使用して、以前の別のテンプレートから新しいデータベースを作成してみました。

$ Sudo -u postgres createdb -T myapp myapp3

$ Sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:

<snip>

WARNING: errors ignored on restore: 5

存在せず、データが挿入されていないユーザーに関する多くのエラーが発生します。

私もtemplate0を使用してみましたが、予想どおり、スキーマに関するエラーが発生しました。

要約すると、Heroku Pgバックアップから新しいデータベースに復元したいと思います。インデックスやユーザーの不足などに関するエラーをどのように回避できるかわかりませんおよびスキーマの準備ができています。

ドキュメントのこの行のため、私も-Oを試しました:

-Oを使用すると、初期接続に任意のユーザー名を使用でき、このユーザーは作成されたすべてのオブジェクトを所有します。

画面もエラーでいっぱいだったので、それも誤解しているようです。


編集:-Cリンクされた回答に基づいて、不可解な名前のデータベースに復元できましたが、データベースの名前変更コマンド(alter database rtyghjkuyhgh rename to my_app3)を実行すると、すべてのデータが空になります:(


どんな助けや洞察でも、正しい方向の単なるポイントでさえ、非常に高く評価されます。

Postgresバージョン9.5.12

2
iain

だから、答え:

  1. 新しいデータベースを作成します。

Sudo -u postgres createdb -T myapp myapp5

  1. 別のデータベースに接続し、このコマンドを実行します。

Sudo -u postgres pg_restore -d some_other_db -C -O db/backups/myapp_2018-05-27.pg.dump

  1. データベースの名前を、ダンプされたものから上記で作成したものに変更します。

$ psql \c some_other_db alter database ghji76yhjkj rename to myapp5

  1. ユーザーなどの設定に必要なスクリプトを実行します。
0
iain

1)最初にスーパーユーザーに切り替えsu - postgres

2)次に、新しいデータベースを作成しましたcreatedb myapp3 --DROPはすでに作成されています

3)ここで、ダイレクタをバックアップファイルパスに変更します。つまり、cd db/backups/

4)これを実行して、ダンプのカスタムファイルを復元します

pg_restore -j 8 -U postgres -d myapp3 myapp_2018-05-27.pg.dump

5)それでもデータベースを復元できない場合は、新しいbkupを使用してください。

pg_dump -U postgres -Fc myapp3 > myapp_2018-05-27.dump

.pgを削除して、再度復元してください。

1
Ashiq Ahamed

残りを簡単にコピー/貼り付けできるように、いくつかの変数を定義しましょう(元の質問の名前を使用)

old_db=myapp
new_db=myapp3
db_dump_file="backups/myapp_2018-05-27.pg.dump"

以下は、バックアップが次のような「カスタム」フォーマットで作成されたと想定しています。

pg_dump -U postgres -F custom "$old_db" > "$db_dump_file"

復元するには$db_dump_fileを新しいデータベース名に$new_db

dropdb   -U postgres --if-exists  "$new_db"
createdb -U postgres -T template0 "$new_db"

pg_restore -U postgres -d "$new_db" "$db_dump_file"
1
mivk