環境
Ubuntu20.4
参考
PGBackupの公式サイト
https://devcenter.heroku.com/articles/heroku-postgres-backups
はじめに
HerokuでPGbackupsを使って、PostgreSQLのデータのバックアップ/リストアを行うには、2通りのやり方があります。1つは、Herokuのサーバー上にバックアップダンプを作成して、サーバー上にあるバックアップダンプからリストアする方法。もう1つは、サーバー上に作成したバックアップダンプを、自分のローカル環境にダウンロードして、ローカル環境にあるバックアップダンプからリストアする方法です。
Herokuのサーバー上にバックアップダンプを作る場合は、スケジューリングして、定期的にバックアップダンプを作成することができるが、ローカル環境にダウンロードする場合は、スケジューリングができず、手動で行うしか方法はないようです。ローカル環境にバックアップダンプがあれば、Railsの開発環境やテスト環境にリストアして、本番環境と全く同じデータの状態を作り出すことができます。「開発環境では正常に動作しているのに、本番環境だとエラーになるぅ!」といった場合、本番データを使ってデバックしてみたくなるときもあるはずです。
ただし、PGbackupsを使うと、データベース単位で、全テーブルに対し、一括でバックアップダンプを作成し、全テーブルを一括でリストアします。テーブル単位でバックアップ/リストアしたい場合は、PGbackupを使わず、PostgreSQLのコマンドを使って行うことになるでしょう。
Herokuのサーバー上にバックアップダンプを作成して、サーバー上にあるバックアップダンプからリストアする方法は、以前、こちらに記事を書いたことがあります。
https://qiita.com/pyon_kiti_jp/items/fa32fb5a5bc8d49ce40b
今回は、Herokuのサーバー上に作成したバックアップダンプを、ローカル環境ダウンロードして、ローカル環境からHerokuのリストアしてみます。
では、やってみましょう!
やったこと
Herokuにログインします。
$heroku login --interactive
ログインできていることを確認します。
$heroku whoami
バックアップを行う対象のアプリ名を確認します。
$heroku apps
バックアップダンプの一覧を表示して、ダウンロードする対象のバックアップダンプのIDを確認します。
$heroku pg:backups --app アプリ名
バックアップダンプをローカル環境にダウンロードする方法には2つあります。1つ目の方法は、IDとアプリ名を指定してダウンロードする方法です。次のコマンドを実行すると、ダウンロード元のURLが自動生成されます。生成されたURLをコピーして、ブラウザで指定したURLを表示すると、ダンプファイルがダウンロードされます。この方法だと、なぜだが、dumpの拡張子が付いていません。また、長いダンプファイル名が付いて作成されます。リストアする時は、入力しやすい適当なファイル名にリネームして、dumpの拡張子も付けて、リストアした方がベターです。
URLの有効期限は60分です。バックアップダンプを作成してから、60分以内にダウンロードを行ってください。
$heroku pg:backups:url ID --app アプリ名
このコマンドでも、ダンプファイルをローカル環境にダウンロードすることができます。上記のやり方よりシンプルな方法です。latest.dumpという名前で、カーソルのあるディレクトリにダウンロードされます。IDの指定は不要です。ダンプファイルのタイムスタンプを判断して、最新のバックアップダンプをダウンロードします。IDを指定して、過去履歴のダンプファイルをダウンロードしたい場合は、上記のやり方で行うことになります。
$heroku pg:backups:download
ローカル環境にあるバックアップダンプをHerokuにリストアするときのコマンドです。localhost、myuser、mydbは、各自の環境に合わせて設定します。設定内容を確認する方法は、ブラウザからHerokuのサイトを表示して、Datastores-アプリ名-Settings-Database Credentialsを表示すると、確認することができます。
下記のコマンドでは、リストアするダンプファイルは、カーソルがあるディレクトリに、latest.dumpという名前で保存されていることを前提にして記述しています。latestという名前にリネームしないとリストアできないということはありません。ファイル名は任意です。(dump拡張子を省略しても大丈夫ないかは確認していません。悪しからず。)
ローカル環境のPostgreSQL(開発環境、もしくは、テスト環境)にバックアップダンプをリストアする場合は、Railsを使って開発している場合に限定して書くが、database.ymlに記述している、データベース名、ユーザー名、パスワードを指定すると、ローカル環境に、リストアされます。
development:
database: xxxxx_development
test:
database: xxxxx_test
$pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
コマンドを実行するとパスワードを聞かれます。HerokuのPostgreSQLに接続するためのパスワードです。設定情報を見るとやたら長いパスワードが設定されています。1文字づつ手入力しなくてもコピペで対応できます。コピペしたパスワードは画面表示されませんが、ペーストしてEnterを押すと、リストアが走ります。
Herokuからログアウトします。
$heroku logout