Heroku PGBackups
最終更新日 2024年05月29日(水)
Table of Contents
データのバックアップは、どのアプリケーションにとってもきわめて重要です。Standard 層以上のすべての Heroku Postgres データベースには、背後で自動的に実行され、障害復旧のための物理バックアップを取得する継続的保護のメカニズムが組み込まれています。
テスト、環境の設定、データの移行に関しては、論理バックアップの方が物理バックアップよりも可搬性があります。Heroku Postgres の PGBackups 機能では、手動およびスケジュールで論理バックアップを実行できます。これらのバックアップは圧縮バイナリ形式であり、ディスク上のデータベースの実際のサイズよりもずっと小さなサイズです。
この記事では、手動およびスケジュールで論理バックアップを実行する方法、既存のバックアップの表示方法、バックアップの復元方法、2 つのデータベース間で直接データを転送する方法について説明します。
PGBackups は、負荷が中程度で 20 GB までのデータベースにのみ使用してください。負荷の高いデータベース、20 GB より大きいデータベース、スキーマやサイズの大きいオブジェクトが多数あるデータベースでは、バックアッププロセスがタイムアウトになる可能性があります。PGBackups に適さないデータベースの論理バックアップを実行する手順については、「Heroku Postgres の論理バックアップ」を参照してください。
すべての本番用 Heroku Postgres プランでは、データのバックアップとリカバリに継続的保護を使用してください。データの可搬性が要求されるユースケースでは、PGBackups によって取得されるような論理バックアップの方が適しています。
手動バックアップ
手動バックアップを作成する
デフォルトでは、pg:backups
は、DATABASE_URL
環境設定で指定されたプライマリデータベースに対して動作します。
$ heroku pg:backups:capture --app example-app
Hit Ctrl-C at any time to stop watching progress; the backup will
continue running. Stop a running backup with heroku pg:backups:cancel.
HEROKU_POSTGRESQL_BLACK (DATABASE_URL) ----backup---> b251
Running... done
DATABASE_URL
環境設定は、アプリのプライマリ Heroku Postgres データベースの URL を指定します。DATABASE_URL
環境設定は heroku config
コマンドで確認できます。
あるいは、pg:backups:capture
コマンドを実行し、取得する必要があるデータベースアドオンの名前を指定することもできます。
USAGE
$ heroku pg:backups:capture [ADDON]
OPTIONS
-a, --app=app (required) app to run command against
EXAMPLE
$ heroku pg:backups:capture postgresql-sinuous-83720 --app example-app
バックアップを取ると、バックアップの進行中はデータベースにかかる負荷が増えます。アプリケーションに及ぶ影響は、データベースのサイズとアプリの性質によって異なります。リーダーでバックアップを実行すると影響が大きい場合は、フォロワーのバックアップを取ることを検討してください。詳細は、「論理バックアップのパフォーマンスへの影響」を参照してください。
別のデータベースで手動バックアップを作成する
アプリケーションに複数のデータベースがある場合は、データベース名を指定して、どちらのバックアップを作成するかを選択します。
$ heroku pg:backups:capture HEROKU_POSTGRESQL_PINK
Hit Ctrl-C at any time to stop watching progress; the backup will
continue running. Stop a running backup with heroku pg:backups:cancel.
HEROKU_POSTGRESQL_PINK ----backup---> b252
Running... done
--verbose
フラグを使用すると、バックアップの進行中にログが表示されます。
手動バックアップの作成をキャンセルする
バックアップを停止するには、cancel
コマンドを使用します。
$ heroku pg:backups:cancel
Canceled backup b252
手動バックアップの保持制限
データベースプランによっては、保持できる手動バックアップの数に制限があります。
Heroku Postgres mini
と basic
プランがサポート終了 (EOL) に達しました。mini
もbasic
アドオンもプロビジョニングできなくなりました。mini
と basic
データベースも新規の Essential 層プランに移行しています。詳細は、「Mini and Basic Deprecation Details」 (Mini および Basic 非推奨の詳細) を参照してください。
プラン | 保持されるバックアップ件数 |
---|---|
Mini (EOL) | 2 |
Basic (EOL) | 5 |
Essential-* | 5 |
Standard-* | 25 |
Premium-* | 50 |
Enterprise | 50 |
上記の制限に達し、さらにバックアップを作成する場合は、capture コマンドによってもっとも古い手動バックアップが自動的に削除され、その後、新しい手動バックアップが作成されます。
スケジュール設定されたバックアップ
手動で起動するバックアップに加え、定期的な自動バックアップのスケジュールを設定することができます。これらのバックアップは、毎日、指定したデータベースに対して実行されます。
バックアップスケジュールを設定する
$ heroku pg:backups:schedule DATABASE_URL --at '02:00 America/Los_Angeles' --app example-app
--at
オプションでは、24 時間形式を使用して、バックアップを取る時刻を指定します。このオプションには、完全な TZ 形式 (America/Los_Angeles) または省略形 (PST) のいずれかでタイムゾーンを指定できますが、完全な TZ 形式 を使用することをお勧めします。
バックアップをスケジュールするときは、--at
オプションを使用する必要があります。Windows の場合は、--at
の時刻とタイムゾーンを二重引用符 ("
) で囲みます ("02:00 America/Los_Angeles"
など)。
スケジュール設定されたバックアップが失敗しても通知はありません。スケジュール設定されたバックアップを手動で確認する必要があります。
次の場合、バックアップスケジュールが失われる可能性があります。
- データベースを Essential 層プランから別の層のプランにアップグレードした。
- バックアップが新しいデータベースに復元された。
- フォロワーの切り替えを使用して Heroku Postgres プランを更新した。元のデータベースのスケジュールは元のデータベースに関連付けられたままです。プロモートされたデータベースのスケジュールが存在しない場合は、スケジュールを作成する必要があります。
スケジュール設定されたバックアップを停止する
定期バックアップを停止するには、unschedule
を使用します。
$ heroku pg:backups:unschedule DATABASE_URL --app example-app
バックアップスケジュールを表示する
アプリの現在のスケジュールを表示するには、schedules
を使用します。
$ heroku pg:backups:schedules --app example-app
Current backup schedules:
RED: daily at 2:00 (America/Los_Angeles)
スケジュール設定されたバックアップの保持制限
スケジュール設定されたバックアップには、手動バックアップとは異なる保持ポリシーがあります。このポリシーは、データベースプランにも基づきます。
Heroku Postgres mini
と basic
プランがサポート終了 (EOL) に達しました。mini
も basic
アドオンもプロビジョニングできなくなりました。mini
と basic
データベースも新規の Essential 層プランに移行しています。詳細は、「Mini and Basic Deprecation Details」 (Mini および Basic 非推奨の詳細) を参照してください。
プラン | 保持される日次バックアップ件数 | 保持される週次バックアップ件数 | 保持される月次バックアップ件数 |
---|---|---|---|
Mini (EOL) | 7 日間 | 1 週間 | 0 か月 |
Basic (EOL) | 7 日間 | 1 週間 | 0 か月 |
Essential-* | 7 日間 | 1 週間 | 0 か月 |
Standard-* | 7 日間 | 4 週間 | 0 か月 |
Premium-* | 7 日間 | 8 週間 | 12 か月 |
Enterprise | 7 日間 | 8 週間 | 12 か月 |
- 日次バックアップは、毎日、スケジュール設定された時刻に取得されます。直近 7 日分の日次バックアップが保持されます。つまり、7 件 (直近 7 日間について 1 日 1 件) のバックアップが存在することになります。
- 週次バックアップとは、7 日ごとに 1 件のバックアップが保存されることを意味します。たとえば、Standard-4 データベースでは、4 件の週次バックアップ (直近 4 週間で毎週 1 件) が保持されます。
- 月次バックアップとは、1 か月間に 1 件のバックアップが保存されることを意味します。たとえば、Premium-0 データベースでは、12 件の月次バックアップ (直近 12 か月間で毎月 1 件) が保持されます。
プロビジョニング解除されたアドオンのバックアップは、短い猶予期間後に削除されます。プロビジョニング解除されたデータベースのバックアップを保持するには、この期間のうちにバックアップをダウンロードし、外部のデータストレージサービスに保存してください。
バックアップのダウンロード
URL 経由でダウンロード
pg:backups:url
コマンドを使用して、公開バックアップ URL を作成できます。この URL は、Heroku Postgres の外部にデータをエクスポートするために役立ちます。バックアップ ID なしでコマンドを指定すると、最新の使用可能なバックアップ URL が返されます。
$ heroku pg:backups:url b001 --app example-app
The following URL will expire at 2015-04-07 18:35:50 +0000:
"https://s3.amazonaws.com/xkpgbackups/app1234567@heroku.com/b004.dump?AWSAccessKeyId=ABCD1234&Expires=1289261668&Signature=3mMBeKISewgEUDT%2FL5mRz4EYS4M%3D"
URL は公開ですが、簡単には推測できません。60 分後に期限が切れます。
pg:backups:url
コマンドでは、URL が期限切れになる時間が URL と共に出力されます。URL を他のコマンドに渡す場合は、pg:backups:url
で期限情報が出力に追加されないようにして、後続のコマンドに URL だけが渡されるようにします。たとえば、追加情報なしで URL の一覧をターミナルに表示する場合は、次のようにします。
$ heroku pg:backups:url --app example-app | cat
https://s3.amazonaws.com/xkpgbackups/app1234567@heroku.com/b004.dump?AWSAccessKeyId=ABCD1234&Expires=1289261668&Signature=3mMBeKISewgEUDT%2FL5mRz4EYS4M%3D
コマンドライン経由でダウンロード
コマンドライン経由でバックアップをダウンロードするには、download
コマンドを使用します。
$ heroku pg:backups:download
PGBackups での Heroku Postgres データベースの読み込みと書き出しについての詳細は、Heroku のドキュメントを参照してください。
バックアップの状態と情報を確認する
バックアップとその状態の一覧を表示するには、次のコマンドを実行します。
$ heroku pg:backups --app example-app
=== Backups
ID Backup Time Status Size Database
---- ------------------------- ---------------------------------- ------ --------
b013 2015-03-18 19:03:16 +0000 Running IVORY
b011 2015-02-18 17:55:38 +0000 Finished 2015-02-18 17:55:39 +0000 1.9GB IVORY
b010 2015-02-17 19:14:43 +0000 Finished 2015-02-17 19:14:48 +0000 1.9GB IVORY
b004 2015-02-11 19:00:55 +0000 Finished 2015-02-17 19:14:48 +0000 1.9GB IVORY
==== Restores
ID Restore Time Status Size Database
---- ------------------------- ---------------------------------- ------ --------
r002 2015-03-16 17:33:19 +0000 Finished 2015-03-16 17:33:19 +0000 1.9GB IVORY
r001 2015-03-15 12:13:44 +0000 Failed 2015-03-15 12:13:47 +0000 1.7GB IVORY
特定のバックアップに関する詳細を表示するには、info
コマンドを使用します。
$ heroku pg:backups:info b017 --app example-app
=== Backup info: b017
Database: HEROKU_POSTGRESQL_IVORY
Started: 2013-06-24 17:11.28 UTC
Status: Running
Type: Manual
Size: 1.2GB
Schema: 0bff3ac
オプションの --verbose
フラグを使用して、バックアップのログを表示することもできます。バックアップがまだ実行中の場合は、バックアップが終了するまで、または CTRL+C
を入力してコマンドをキャンセルするまで、進行中のログが出力されます。
PGBackups では、圧縮バイナリ形式でバックアップが保存されます。インデックス自体ではなく、インデックスを再作成するためのコマンドがバックアップに格納されます。その結果、バックアップのサイズは、pg:info
で返されるディスク上の現在のデータベースのサイズより小さくなります。
バックアップを削除する
古くなったバックアップを削除したり、新しいバックアップ用の空き領域を確保したりするために、手動でバックアップを削除できます。バックアップ ID を使用して、削除するバックアップを指定します。
$ heroku pg:backups:delete b101 --app foo
Deleting b101... done
バックアップを復元する
バックアップを復元するには、restore
コマンドを使用します。
$ heroku pg:backups:restore b101 DATABASE_URL --app example-app
このコマンドにより、バックアップ ID b101
が、アプリ example-app
で、指定されたデータベース URL に復元されます。注意: バックアップ ID とターゲットデータベースを省略して、最新のバックアップを DATABASE_URL
に復元することができます。そうでない場合、バックアップ ID とターゲットデータベースの両方を指定する必要があります。
別のアプリのバックアップから復元することもできます (example-app
から example-staging app
へ)。
$ heroku pg:backups:restore example-app::b101 DATABASE_URL --app example-staging-app
公開 URL から復元することもできます。
$ heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/mydb.dump' DATABASE_URL -a example-app
転送中のデータを確実に暗号化するために、必ず HTTPS URL を使用してください。HTTP 経由の復元はサポートされていません。
時間の経過と共に、テーブルの肥大化や未使用のインデックスデータによって、ディスク上でデータベースが大きくなります。その結果、バックアップを新しいデータベースに復元すると、ほとんどの場合、pg:info
で報告される全体ディスクサイズが減少します。
前回の pg:backups
コマンドとは異なり、既存のデータベースに部分的なバックアップを復元することはできません。pg:backups:restore
を実行すると、バックアップの復元前に、復元先のデータベースからすべてのデータが削除されます。
データベース間の直接コピー
pg:backups
では、バックアップと復元に加え、データベース間で直接データを転送することもできます。
転送を実行するには、次のコマンドを実行します。
$ heroku pg:copy COBALT GREEN --app example-app
このコマンドにより、COBALT
データベースから example-app
アプリの GREEN
データベースにすべてのデータがコピーされます。
別のアプリのデータベースから直接転送することもできます。たとえば、テストのために本番データをステージングアプリにコピーします。
$ heroku pg:copy example-app::HEROKU_POSTGRESQL_ORANGE_URL GREEN --app example-staging-app
このコマンドにより、example-app
の HEROKU_POSTGRESQL_ORANGE
データベースから example-staging-app
の GREEN
データベースにデータがコピーされます。
これらのコマンドではデータベースを識別するために短縮名が使用されています。たとえば、COBALT
は heroku addons --app example-app
で出力される HEROKU_POSTGRESQL_COBALT
という名前のデータベースを指しています。作成する最初のデータベースは、デフォルトで DATABASE
という名前になります。追加のデータベースには、HEROKU_POSTGRESQL_COBALT
などの色の名前が付きます。DATABASE
や COBALT
などを使用して、Heroku Postgres CLI コマンドでデータベースを選択することができます。
視認性
Heroku Postgres では、バックアップを取るために、ご使用の資格情報を使ってデータベースに接続する必要があります。この接続は、ご利用のプランの接続制限の件数に含まれます。ターミナルから次のコマンドを実行すると、Heroku Postgres によって行われた接続を識別できます。
$ heroku pg:psql -c "select * from pg_stat_activity where application_name = 'Heroku Postgres Backups'"
データの所在
pg:backups
を使用して取得されたすべてのスナップショットは、データベースのある場所にかかわらず米国内で保管されます。別のリージョン内の論理バックアップを取得するには、「Heroku Postgres の論理バックアップ」を参照してください。
障害復旧のための Postgres Continuous Protection は、データベースが置かれている同じリージョンにベースバックアップおよびログ先行書き込み (WAL) を保管します。
Heroku が利用しているサブプロセッサーの一覧と Heroku データが保存され、処理されている国の一覧については、「Salesforce Infrastructure & Sub-processors」 (Salesforce のインフラストラクチャとサブプロセッサー) ドキュメントを参照してください。