【Heroku】Heroku Postgresのプランアップグレード手順
1.目的
本記事では、Heroku Postgresのプランアップグレード手順を記載します。
※正確には、単純にプランをアップグレードするのではなく、新しいプランのDBを作ってデータを移行します。
2.背景
ある日、bot@notifications.heroku.comよりデータベースのレコード超過を知らせるメールが届きました(タイトルは『[warning] Database disruption imminent, row limit exceeded for hobby-dev database on Heroku app sushi』でした)。※「sushi」はアプリ名です。
メール本文には「このプランの最大レコード数を超過しているぞ!上位のプランにしないと7日後にINSERT出来なくなるぞ!」と記載されております。
サービスを終わらせるというのも選択肢としてはあると思いますが、今回はサービスを継続させるために、Heroku Postgresのプランを1つ上のプランにアップグレードします。今回はFreeプラン(Hobby Dev)から、$9/monthの有料プラン(Hobby Basic)に上げます。
3.手順
以降「sushi」をアプリ名とします(本家リスペクト)。
ⅰ. 新しいDBを作ります
Herokuの管理画面、「Resources」タグの「Add-ons」セクション、入力フォームに「Heroku Postgres」と入力します。
モーダルが表示されるので「Plan name」から「Hobby Basic」(現在のプランより上位のプラン)を選択し、「Provision」を押下します。
Add onが追加されていることを確認します。
Planが「hobby-basic」のheroku-postgresqlが追加されていればOKです。
$ heroku addons -a sushi
Add-on Plan Price State
─────────────────────────────────────────────── ─────────── ──────── ───────
heroku-postgresql (<名前>) hobby-basic $9/month created
└─ as HEROKU_POSTGRESQL_MAUVE
heroku-postgresql (<名前>) hobby-dev free created
└─ as DATABASE
「HEROKU_POSTGRESQL_MAUVE」が新しく作成したDB(アドオン)の名前となります。毎回異なる値となりますので、「HEROKU_POSTGRESQL_MAUVE」と以降の記載で出てきた場合、お手数ですが、各々の値に読み替えてください。
※follow機能でMaster-slaveの構成に出来るようですが、今回はfollow機能を設定しません。
ⅱ.メンテナンスモードにします
移行前のDB(以下、旧DB)から移行後のDB(以下、新DB)にデータを移行している途中に、旧DBのデータが操作されるとデータの不整合が発生する可能性があります。
不整合を発生させないために、アプリをメンテナンスモードに変更して、DB操作を発生させないようにします。
$heroku maintenance:on -a sushi
Enabling maintenance mode for ⬢ sushi... done
コネクションが全て切断されていることを確認します。Connectionsが0となっていればOKです。
$heroku pg:info -a sushi
=== DATABASE_URL
~~~~~~~~~
Plan: Hobby-dev
Status: Available
Connections: 0/20
~~~~~~~~~
なお、本記事の要旨からは外れますが、メンテナンス期間中のアプリのケアや、ユーザへの通知が必要になるかと思います。
ⅲ.(オプション)データのバックアップを取得します
万が一に備えてデータのバックアップを取得することをお勧めします。
Herokuのアドオン管理画面、「Durabiility」タグの「Manual Backups & Data Exports」セクション、「Create Manual Backup」ボタンを押します。
しばらく待つとバックアップが完了するので、ダウンロードしておきます。
バックアップの取得が完了です。
ⅳ.データを移行します。
旧DBから新DBへデータを移行します。
$heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_MAUVE_URL -a sushi
▸ WARNING: Destructive action
▸ This command will remove all data from DATABASE
▸ Data from DATABASE will then be transferred to DATABASE
▸ To proceed, type sushi
▸ WARNING: Destructive action or re-run this command with --confirm sushi
$sushi
Starting copy of DATABASE to DATABASE... done
Copying... done
「Copying... done」が表示されたら完了です。
ⅴ.アプリの向き先を新DBに変更します
新DBにデータが移行されたので、アプリの向き先も新DBへ変更します。
$ heroku pg:promote HEROKU_POSTGRESQL_MAUVE_URL -a sushi
ソースコード中などで、環境変数「DATABASE_URL」の値を、環境変数を使用せず生で使用している場合、あわせて修正する必要があります(あまり無いとは思いますが...)。
向き先が変更されていることを確認します。
新DB(「Plan」がHobby-basic)に「DATABASE_URL」が設定されていることを確認します。
$ heroku pg:info -a suthi
=== DATABASE_URL, HEROKU_POSTGRESQL_MAUVE_URL
~~~~~~~~~
Plan: Hobby-basic
~~~~~~~~~
=== HEROKU_POSTGRESQL_WHITE_URL
Plan: Hobby-dev
~~~~~~~~~
ⅵ.メンテナンスモードを解除します。
$heroku maintenance:off -a sushi
Disabling maintenance mode for ⬢ sushi... done
これでHeroku Postgresのプランアップグレード自体は完了です。
Ⅶ.旧DBを削除します
しばらく新DBで運用して、無事問題が発生しなかった場合は、旧DBを削除します。
Herokuのアドオン管理画面、「Settings」タグの「ADMINISTRATION」セクション、「Destory Database...」ボタンを押します。
入力フォームにアプリ名を入力して「Destory Database」を押下します。
4.リンク
この記事が気に入ったらサポートをしてみませんか?