高木のブログ

Herokuで使っているデータベースを有料プランへ切り替える(Hobby Basicプラン)

2020/09/07

Herokuで運用しているアプリのデータベースが無料の範囲を超えてしまったので有料プランに変更した
無料のHobby Devプランから9$/monthのHobby Basicプランに変更する
Hobby Devプランは10,000レコードまでで、Hobby Basicプランは10,000,000レコードまで

単純にプランを変更するだけではなく、新しいデータベースを作成して、データをコピーする必要がある
ただ、たったの6ステップで終わるので比較的簡単

  1. 新しいデータベースを作成
  2. メンテナンスモードをオン
  3. 古いデータベースから新しいデータベースへデータをコピー
  4. データベースの切り替え
  5. 古いデータベースを削除
  6. メンテナンスモードをオフ

手順

0. 現在のデータベース状況を確認

$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            11.8
Created:               2020-01-14 16:30 UTC
Data Size:             11.4 MB
Tables:                11
Rows:                  12370/10000 (Above limits, access disruption imminent)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flexible-12541

1. 新しいデータベースを作成

$ heroku addons:create heroku-postgresql:hobby-basic
Creating heroku-postgresql:hobby-basic on ⬢ masamune-20200114... $9/month
 ▸    Release command executing: config vars set by this add-on will not be available until the command succeeds. Use `heroku releases:output` to view
 ▸    the log.
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-flat-43568 as HEROKU_POSTGRESQL_CHARCOAL_URL
Use heroku addons:docs heroku-postgresql to view documentation

HEROKU_POSTGRESQL_CHARCOAL_URLが追加されている
名前は適当につけられるらしい

$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            11.8
Created:               2020-01-14 16:30 UTC
Data Size:             11.4 MB
Tables:                11
Rows:                  12221/10000 (Above limits, access disruption imminent)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flexible-12541

=== HEROKU_POSTGRESQL_CHARCOAL_URL
Plan:                  Hobby-basic
Status:                Available
Connections:           0/20
PG Version:            12.3
Created:               2020-09-06 14:45 UTC
Data Size:             7.9 MB
Tables:                0
Rows:                  0/10000000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flat-43568

2. メンテナンスモードをオン

移行作業中に新しいデータが挿入されないようにアプリをメンテナンスモードにしておく

heroku maintenance:on

3. 古いデータベースから新しいデータベースへデータをコピー

$ heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_CHARCOAL_URL
 ▸    WARNING: Destructive action
 ▸    This command will remove all data from CHARCOAL
 ▸    Data from DATABASE will then be transferred to CHARCOAL
 ▸    To proceed, type masamune-20200114 or re-run this command with --confirm masamune-20200114

> masamune-20200114
Starting copy of DATABASE to CHARCOAL... done
Copying... done

データ入った レコード数が一致していないのは謎
アプリ側のデータではなく、Heroku側が使っているデータだと思う

$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            11.8
Created:               2020-01-14 16:30 UTC
Data Size:             11.4 MB
Tables:                11
Rows:                  12170/10000 (Above limits, access disruption imminent)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flexible-12541

=== HEROKU_POSTGRESQL_CHARCOAL_URL
Plan:                  Hobby-basic
Status:                Available
Connections:           0/20
PG Version:            12.3
Created:               2020-09-06 14:45 UTC
Data Size:             10.6 MB
Tables:                11
Rows:                  12431/10000000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flat-43568

4. データベースの切り替え

$ heroku pg:promote HEROKU_POSTGRESQL_CHARCOAL_URL
Ensuring an alternate alias for existing DATABASE_URL... HEROKU_POSTGRESQL_BLACK_URL
Promoting postgresql-flat-43568 to DATABASE_URL on ⬢ masamune-20200114... done
Checking release phase... pg:promote succeeded. It is safe to ignore the failed Detach DATABASE (@ref:postgresql-flexible-12541) release.

メインのデータベースがHEROKU_POSTGRESQL_CHARCOAL_URLになっている
古いデータベースにはHEROKU_POSTGRESQL_BLACK_URLという名前がつけられている

$ heroku pg:info
=== DATABASE_URL, HEROKU_POSTGRESQL_CHARCOAL_URL
Plan:                  Hobby-basic
Status:                Available
Connections:           0/20
PG Version:            12.3
Created:               2020-09-06 14:45 UTC
Data Size:             10.7 MB
Tables:                11
Rows:                  12431/10000000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flat-43568

=== HEROKU_POSTGRESQL_BLACK_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            11.8
Created:               2020-01-14 16:30 UTC
Data Size:             11.4 MB
Tables:                11
Rows:                  12121/10000 (Above limits, access disruption imminent)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flexible-12541

5. 古いデータベースを削除

$ heroku addons:destroy HEROKU_POSTGRESQL_BLACK_URL
 ▸    WARNING: Destructive Action
 ▸    This command will affect the app masamune-20200114
 ▸    To proceed, type masamune-20200114 or re-run this command with --confirm masamune-20200114

> masamune-20200114
Destroying postgresql-flexible-12541 on ⬢ masamune-20200114... done

古いデータベースが消えて、1つになっている

$ heroku pg:info
=== DATABASE_URL, HEROKU_POSTGRESQL_CHARCOAL_URL
Plan:                  Hobby-basic
Status:                Available
Connections:           0/20
PG Version:            12.3
Created:               2020-09-06 14:45 UTC
Data Size:             10.7 MB
Tables:                11
Rows:                  12431/10000000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flat-43568

6. メンテナンスモードをオフ

heroku maintenance:off

7. おわり

動作確認をして問題がなかったら完了
もちろん古いデータベースを削除する前に動作確認をする

参考


Pixela