スクリーンショット_2019-11-17_16

【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」と入力します。

スクリーンショット 2019-11-17 16.09.02

モーダルが表示されるので「Plan name」から「Hobby Basic」(現在のプランより上位のプラン)を選択し、「Provision」を押下します。

スクリーンショット 2019-11-17 16.09.17

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」ボタンを押します。

スクリーンショット 2019-11-17 18.04.26

しばらく待つとバックアップが完了するので、ダウンロードしておきます。

スクリーンショット 2019-11-17 18.09.10

バックアップの取得が完了です。

.データを移行します。
旧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...」ボタンを押します。

スクリーンショット 2019-11-17 18.39.08

入力フォームにアプリ名を入力して「Destory Database」を押下します。

スクリーンショット 2019-11-17 18.40.37

4.リンク

■公式サイト(英語)
https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases?c=&utm_campaign=postgreslimits&utm_medium=telex&utm_source=nurture&utm_content=devcenter&utm_term=upgrade-c

この記事が気に入ったらサポートをしてみませんか?