目的
Heroku は標準のデータベースとして Postgres をサポートします。
Heroku で Postgres を利用するための準備から、運用時に必要となるバックアップの扱い方の方法までをまとめます。
Heroku で Postgres を利用する場合、Heroku Postgres という Heroku が提供しているデータベースクラウドを使うアドオンを使用します。
他のアドオンの選択肢もあり、他のデータベースも使うこともできます。例えば ClearDB アドオンを使うことで MySQL を利用する選択肢などがあります。
前提
以下の記事を理解していることが前提となります。
データベースの準備
データベースの確認と作成
以下のコマンドを実行してください。
heroku addons --app アプリケーションID
一覧に heroku-postgresql があれば Postgres が使えるようになっています。
もし無い場合は、以下のコマンドを使うことで Postgres が使えるようになります。
heroku addons:add heroku-postgresql --app アプリケーションID
データベースアクセスのための情報取得
データベースを作成後、以下のコマンドを実行してください。
heroku config --app アプリケーションID
heroku config はアプリケーションの設定を一覧表示するコマンドです。設定から HEROKU_POSTGRES_XXX_URL を探してください。HEROKU_POSTGRES_XXX_URL は Postgres にアクセスするために必要な情報です。以下のフォーマットになっています。
HEROKU_POSTGRESQL_XXX_URL: postgres://ユーザ名:パスワード@サーバ名:ポート/データベース
この情報を元に Postgres にアクセスします。
備考)Heroku の Postgres は、Heroku とはまた別個の独立したサービスである。
heroku-postgresql アドオンは、Heroku Postgres という Heroku とは独立したデータベースサービス(一般的には Database as a Service と呼ばれている)が提供している Postgres を使うためのものです。
この Heroku Postgres は、Heroku とは別個の独立したサービスであり、Heroku とは無関係に単独で利用することが可能です。
また、Heroku 経由で作成したデータベースに Heroku アプリケーション外からアクセスすることも可能です。
データベースのバックアップ
データベースのバックアップは、基本的に Heroku 内で管理されます。Heroku コマンドを実行するだけでバックアップの作成/リストアが簡単にできます。
さらにローカル環境に Postgres を用意することで、バックアップしたデータをエクスポートしてローカル環境に再現したり、ローカル環境のデータベースを Heroku のデータベースにインポートすることもできます。
以下の図に可能なデータの流れをまとめます。

それぞれの操作について説明していきます。
バックアップの作成
データベースのバックアップには pgbackups というアドオンを使います。以下のコマンドを実行してアプリケーションにアドオンを追加します。
heroku addons:add pgbackups --app アプリケーションID
アドオンを追加した後は、以下のコマンドを実行することでその時点のデータベースのバックアップが作れます。
heroku pgbackups:capture --app アプリケーションID
実行結果は以下のような出力になります。
HEROKU_POSTGRESQL_XXX_URL (DATABASE_URL) ----backup---> b001
作ったバックアップは Heroku が管理してくれます。b001 はバックアップを識別するIDです。
このバックアップIDを使ってデータベースバックアップを管理します。
バックアップ一覧の確認
以下のコマンドを実行してください。
heroku pgbackups
作ったバックアップの一覧が表示されます。以下、実行例です。
ID Backup Time Size Database ---- ------------------- ------ ------------------------------------------ b001 20XX/XX/XX XX:XX.XX XX.XKB HEROKU_POSTGRESQL_XXX_URL (DATABASE_URL)
Heroku が管理してくれているデータベースのバックアップがわかります。
バックアップからのリストア
以下のコマンドを実行してください。
heroku pgbackups:restore DATABASE バックアップID --app アプリケーションID
データベースのリストアを実行すると、現在のデータベースの情報が失われてしまうので、簡単にデータベースのリストアが行われないよう以下のような警告が出ます。
! WARNING: Destructive Action ! This command will affect the app: アプリケーションID ! To proceed, type "アプリケーションID" or re-run this command with --confirm アプリケーションID >
警告に従い確認のためアプリケーションIDをキーボード入力するとデータベースのリストアが実行されます。
もしくは以下のコマンドを実行すると、確認作業が不要になります。
heroku pgbackups:restore DATABASE バックアップID --confirm アプリケーションID
いずれにせよ、データベースをリストアする場合は、注意してくださいということです。
Heroku のデータベースをエクスポートして、ローカル環境のデータベースにインポート
以下のコマンドを実行してください。
heroku pgbackups:url バックアップID --app アプリケーションID
エクスポート用の URL が表示されるので、URL 経由でバックアップファイルをダウンロードします。この URL は 10 分で失効するので、すぐにダウンロードしてください。
データベースのバックアップファイルのダウンロードには curl コマンドがお勧めです(curl は指定された URL のファイルをダウンロードするコマンドです。Heroku Toolbelt の中に入っているので Windows でも使えます)。
以下のコマンドを実行すると heroku.dump というファイルにバックアップがエクスポートされます。
curl -o heroku.dump 'バックアップ URL'
エクスポートしたバックアップファイルをローカル環境の Postgres に入れるには以下のコマンドを実行します。
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ユーザ名 -d データベース名 バックアップファイル名
※ Windows 環境では事前に PATH の設定が必要です*1。
ユーザにパスワードが設定されている場合は、コマンド実行後にパスワードの入力が求められるので、パスワードを入力してください。パスワードの入力を回避するには環境変数 PGPASSWORD にパスワードを設定してからコマンドを実行します。
以下、Windows で PGPASSWORD にパスワードを設定して実行する例です。
SET PGPASSWORD=パスワード pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ユーザ名 -d データベース名 バックアップファイル名
ローカル環境のデータベースをエクスポートして、Heroku のデータベースにインポート
ローカル環境のデータベースを Heroku のデータベースにインポートするには、 Heroku から HTTP でアクセス可能な外部ストレージ*2が必要になります。
pg_dump コマンドでローカル環境のデータベースから作ったバックアップファイルを、外部ストレージ経由で Heroku にインポートします。
まず最初に pg_dump コマンドでローカル環境のデータベースからバックアップファイルを作成します。
pg_dump -Fc --no-acl --no-owner -h localhost -U ユーザ名 データベース名 > localhost.dump
※ Windows 環境では事前に PATH の設定が必要です*3。
ユーザにパスワードが設定されている場合は、コマンド実行後にパスワードの入力が求められるので、パスワードを入力してください。パスワードの入力を回避するには環境変数 PGPASSWORD にパスワードを設定してからコマンドを実行します。
以下、Windows で PGPASSWORD にパスワードを設定して実行する例です。
SET PGPASSWORD=パスワード pg_dump -Fc --no-acl --no-owner -h localhost -U ユーザ名 データベース名 > localhost.dump
その後、外部ストレージにバックアップファイルをアップロードし、以下のコマンドを実行してください。
heroku pgbackups:restore DATABASE 'バックアップファイルへのアクセス URL'
Heroku は外部ストレージから HTTP 経由でバックアップファイルを読み込み、データベースをリストアします。
データベースのリストアを実行すると、現在のデータベースの情報が失われてしまうので、簡単にデータベースのリストアが行われないよう以下のような警告が出ます。
! WARNING: Destructive Action ! This command will affect the app: アプリケーションID ! To proceed, type "アプリケーションID" or re-run this command with --confirm アプリケーションID >
警告に従い確認のためアプリケーションIDをキーボード入力するとデータベースのリストアが実行されます。
もしくは以下のコマンドを実行すると、確認作業が不要になります。
heroku pgbackups:restore DATABASE バックアップID --confirm アプリケーションID
いずれにせよ、データベースをリストアする場合は、注意してくださいということです。
参考
開発に必要な情報
Heroku Dev Center の情報
コメント
本ページの内容に関して何かコメントがある方は、以下に記入してください。
コメントはありません。 コメント/heroku/how/management/database