vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

Herokuのデータベースをバックアップ・リストアする方法

      2018/05/29

LINEで送る
Pocket


こんにちは、okutani(@okutani_t)です。本記事では、Herokuで利用しているDBのデータをバックアップ・リストアする方法について解説しています。

今回は、Heroku公式が対応している「Heroku Postgres」を対象にしています。

本記事では、「バックアップ方法」「バックアップデータのダウンロード方法」「リストア方法」について解説していきます。

なお、Herokuのかんたんな使い方は以下のページを参考にしてください。

【Rails】Herokuの登録&初期設定からデプロイ方法までまとめ
こんにちは、okutani(@okutani_t)です。本記事では『Heroku』の登録方法、かんたんな初...
2017-08-25 02:03
はてブ

それでは、HerokuのDBをバックアップする方法から見ていきましょう。

参考Heroku PGBackups | Heroku Dev Center

スポンサーリンク

バックアップ方法

バックアップの方法には「手動バックアップ」「自動バックアップ」があるので、それぞれ解説していきます。

ターミナル上で手動バックアップ

手動バックアップ方法は以下の手順でおこないます。

$ heroku pg:backups:capture -a アプリ名

上記コマンドで、Heroku上にバックアップを記録してくれます。

バックアップの一覧をターミナルで確認する場合は以下。

$ heroku pg:backups -a アプリ名
Backups
ID    Created at                 Status                               Size     Database
────  ─────────────────────────  ───────────────────────────────────  ───────  ────────
b001  2017-09-17 07:08:48 +0000  Completed 2017-09-17 07:08:51 +0000  44.46kB  DATABASE

=== Restores
No restores found. Use heroku pg:backups:restore to restore a backup

=== Copies
No copies found. Use heroku pg:copy to copy a database to another

「bxxx」という形式でバックアップがおこなえていることが確認できました。

バックアップの詳細を見たい場合は、以下のコマンドで調べることができます。「bxxx」は対応するIDに置き換えてください。

$ heroku pg:backups:info bxxx -a アプリ名

バックアップをおこなった日付やバックアップ時のlogなどが確認できました。

バックアップをキャンセルしたい場合は、以下のコマンドを利用します。

$ heroku pg:backups:cancel -a アプリ名

キャンセルコマンドの利用頻度は低いかと思いますが、覚えておくと良いですね。

Web管理画面上で手動バックアップ

Heroku管理画面上でも手動バックアップをおこなうことができます。

「Heroku Postgres」→「Durability」→「Create Manual Backup」をクリックすればOK。

手動バックアップがおこなえることが確認できました。

自動(定期)バックアップ

次に自動(定期)バックアップの方法について解説します。

ターミナル上で以下のコマンドを実行してみてください。

$ heroku pg:backups schedule DATABASE_URL --at '02:00 Asia/Tokyo' -a アプリ名

「DATABASE_URL」にどのような値が設定されているか確認したい場合、以下のコマンドで表示することができます。

$ heroku config -a アプリ名 | grep URL
DATABASE_URL:                postgres://baixfsksrbngzk:xxxxx
HEROKU_POSTGRESQL_OLIVE_URL: postgres://baixfsksrbngzk:xxxxx

私の環境では「HEROKU_POSTGRESQL_OLIVE_URL」と「DATABASE_URL」が同じ値が設定されていたので、そのまま「DATABASE_URL」を利用しました。

スケジュールの確認は以下。

$ heroku pg:backups:schedules -a アプリ名
=== Backup Schedules
DATABASE_URL: daily at 2:00 Asia/Tokyo

設定した定期実行の削除は以下のコマンド。

$ heroku pg:backups unschedule DATABASE_URL -a アプリ名
Unscheduling DATABASE_URL daily backups... done

これで自由に自動バックアップを設定することができます。

バックアップデータのダウンロード

バックアップデータのダウンロード方法について解説していきます。

ターミナルからダウンロード

手元のPCにバックアップデータをダウンロードしたい場合、以下のコマンドを実行します。

$ heroku pg:backups:download bxxx -a アプリ名

「bxxx」の箇所は実際のバックアップデータのIDを入力してください。

「latest.dump」という名前のバックアップデータがダウンロードできました。

Web管理画面上からダウンロード

Web管理画面上からもDBのデータをダウンロードすることができます。

「Heroku Postgres」→「Durability」→「Download」をクリック。

これで手元のPCにバックアップデータをダウンロードすることができます。

リストア方法

リストア方法について見ていきます。

本番環境へリストア

リストアをおこなうことで、バックアップをおこなった時点の状態に戻すことができます。

$ heroku pg:backups restore bxxx -a アプリ名

上記のコマンドを入力すると、以下の文が表示されます。アプリ名を入力してEnterを押せば実行されます。

 ▸    WARNING: Destructive Action
 ▸    This command will affect the app アプリ名
 ▸    To proceed, type アプリ名 or re-run this command with --confirm
 ▸    アプリ名

> (アプリ名を入力してEnter)

--confirm」オプションをつけて実行しても大丈夫なようです。

これでかんたんに本番環境にリストアすることができました。

ローカル環境へリストア

取得したバックアップデータを、自分のローカル環境に反映させる方法について解説します。

以下のコマンドを実行。「localhost」「myuser」「mydb」はご自身のPostgreSQLの環境に合わせて変更してください。「latest.dump」はダウンロードしたバックアップデータのファイル名です。

$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump

これでローカル環境にバックアップデータを反映させることができました。

※もし、「pg_restore: [archiver] unsupported version (1.13) in file header」とエラーが出た場合は、PostgreSQLを最新版に更新すればバックアップが正常におこなわれます

バックアップ履歴の保持数について

バックアップを残せる数は、プランによって決まっています。執筆現在のバックアップ保持数は以下のとおりです。

Hobby-Dev 2
Hobby-Basic 5
Standard-* 25
Premium-*, Enterprise 50

参考Heroku PGBackups | Heroku Dev Center

まとめ

Herokuで利用しているPostgreSQLでのバックアップ、リストア方法について解説しました。

ローカル環境に本番データを入れたい場合にもよく活用するかと思うので、覚えておくとよいですね。

Herokuユーザーの参考になれば幸いです。

LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
データベースのバックアップとリストア方法はきちんと把握しておくべきですね。事故ったときに焦らないように。。

 - Heroku, PostgreSQL

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。