Heroku Postgres ロールバック
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年05月07日(火)
Table of Contents
Heroku Postgres ロールバックでは、データベースの状態を以前の時点に “ロールバック” します。
ロールバックは、プライマリデータベースには影響を与えません。これは、フォークと同じパターンに従います。ロールバックでは、どのような方法でもプライマリに直接接続されていない新しいデータベースをプロビジョニングします。フォークと同様に、ロールバックも、使用可能になるまでにしばらく時間がかかります。ロールバックが使用可能になると、プライマリにプロモートできます。ロールバックがプライマリになると、以前のアドオンを削除できます。
ロールバック期間は、データベースプランによって異なります。
データベースの資格情報がプライマリでリセットされている場合は、ロールバックが、資格情報のリセットより前の時点までさかのぼって引き続きサポートされます。ロールバックプロセス中にフォークが作成されると、新しい一連の資格情報が作成されます。
ロールバックデータベースの作成
ロールバックする前に、目的のロールバックポイントがデータベースで使用可能なことを確認します。データベースプランごとに、ロールバックの可用性が異なります。現在のデータベースのロールバックの可用性を確認するには、heroku pg:info
コマンドを使用します。
$ heroku pg:info --app example-app
=== HEROKU_POSTGRESQL_YELLOW_URL (DATABASE_URL)
Plan: Standard 0
Status: Available
Data Size: 584.6 MB
Tables: 29
PG Version: 9.2.4
Connections: 8
Fork/Follow: Available
Rollback: from 2013-10-18 20:00 UTC
Created: 2013-04-18 20:14 UTC
Maintenance: not required
ロールバックがフォーキング後の新しいフォークで、またフォロー解除後のフォロワーで使用可能になる前に遅延が発生します。
ロールバックデータベースの作成では、フォロワーの作成と同じメカニズムが使用されます。プロビジョニングは、--rollback
フラグを使用した新しいデータベースアドオンの作成時に実行されます。--rollback
フラグは、同じアプリ上のデータベースの環境設定名、フォーム appname::HEROKU_POSTGRESQL_COLOR
の引数、または任意の Heroku Postgres データベースのフル URL を受け取ることができます。
さらに、ロールバック先の時刻を指定する必要があります。目的の時間を示す方法には、次の 2 つがあります。
明示的なタイムスタンプ - 明示的なタイムスタンプを指定できます。
2013-10-22 12:34+00:00
という形式を使用します。タイムゾーンのオフセットを含める必要があります。また、シンボリックタイムゾーン2013-10-22 12:34 US/Pacific
を使用することもできます。間隔 - 間隔を指定できます。
3 days 7 hours 22 minutes
という形式を使用します。リカバリ時間は--to
フラグを使用して、またリカバリ間隔は--by
を使用して渡す必要があります。両方ではなく、少なくとも 1 つが存在する必要があります。ロールバックは、秒単位まで正確ではありません。リカバリ時間または間隔で指定された秒数は無視されます。
次の例は、完全なロールバックを示しています。
$ heroku addons:create heroku-postgresql:standard-0 --rollback HEROKU_POSTGRESQL_YELLOW --to '2013-10-21 15:52+00' --app example-app
このコマンドは、ターゲットのリカバリ時間 (と経過時間) をコマンドラインにエコーします。
ロールバックの準備には、データセットのサイズに応じて、数分から数時間かかることがあります。heroku pg:wait
コマンドは、すべての新しいデータベースのプロビジョニングステータスを表示するため、ロールバックがいつ最新になるかを判定するために使用できます。
$ heroku pg:wait --app example-app
Waiting for database HEROKU_POSTGRESQL_SILVER_URL... available
プロビジョニング解除
ロールバックが完了したら、heroku addons:destroy
を使用してそれをプロビジョニング解除します。
$ heroku addons:destroy HEROKU_POSTGRESQL_YELLOW --app example-app
! WARNING: Destructive Action
! This command will affect the app: example-app
! To proceed, type "example-app" or re-run this command with --confirm example-app
ロールバックステータス
heroku pg:info
を実行すると、データベースのロールバックのステータスを確認できます。Rollback
フィールドには 3 つのステータスがあります。
Rollback: from YYYY-MM-DD HH:SS UTC
: データベースはロールバックをサポートしており、使用可能なバックアップがあります。最も古いロールバックポイントのタイムスタンプが表示されます。Rollback: Capturing Snapshot
: データベースはロールバックをサポートしており、最初のバックアップが進行中です。Unsupported
: データベースはロールバックをサポートしていません。
一般的なユースケース: 重大なデータ損失の後のリカバリ
ロールバックは、重要なテーブルを誤って削除するなど、重大なデータ損失の問題のための優れた安全策です。ロールバックを使用して失ったデータを復旧するには、次のようにします。
ロールバックを作成します。
$ heroku addons:create heroku-postgresql:standard-0 --rollback HEROKU_POSTGRESQL_YELLOW --to '2013-10-21 15:52+00' --app example-app Creating heroku-postgresql:standard-0 on ⬢ example-app... $50/month Database will become available after it completes rolling back to 2013-10-21 15:52+0000. Use `heroku pg:wait` to track status. postgresql-adjacent-88888 is being created in the background. The app will restart when complete... Use heroku addons:info postgresql-adjacent-88888 to check creation progress Use heroku addons:docs heroku-postgresql to view documentation
ロールバックデータベースがプロビジョニングされていることを確認します。
$ heroku pg:wait --app example-app Waiting for database HEROKU_POSTGRESQL_SILVER... available
ロールバックをプライマリデータベースとしてプロモートします。
$ heroku pg:promote HEROKU_POSTGRESQL_SILVER --app example-app
新しいリーダーのすべてのフォロワーを再作成します (該当する場合)。
$ heroku addons:create heroku-postgresql:standard-0 --follow HEROKU_POSTGRESQL_SILVER --app example-app Creating heroku-postgresql:standard-0 on ⬢ example-app... $50/month The database should be available in 3-5 minutes. Use `heroku pg:wait` to track status. postgresql-rigid-99330 is being created in the background. The app will restart when complete... Use heroku addons:info postgresql-rigid-99330 to check creation progress Use heroku addons:docs heroku-postgresql to view documentation