ブログ

読んで思い出す。忘れるために書く

PostgreSQL のプランを Free から Hobby に移行する(Heroku)

たくさんデータ投入したら無料プランから外れちゃった

前提

  • Rails アプリケーションを作っていて、データベースはとくに複数利用せず1つだけ扱う
  • 利用者が自分だけの、趣味プロジェクトなので、サービス止まっても困る人がいない(ので、止めちゃうやりかたを採る)

状況

Heroku から「すぐ対応して」とメールを受け取る

f:id:innocent-zero:20180315185823p:plain

The database contains 26,642 rows, exceeding the Hobby-dev plan limit of 10,000. INSERT privileges to the database will be automatically revoked in 7 days. This will cause service failures in most applications dependent on this database.

「10,000 行制限を超えたので あと7日で INSERT 権限を剥奪するよ」

:(;゙゚'ω゚'):

解決

=> プランのアップグレード(& データ移行)を実施

手順

大まかな手順としては:

  • 新たに PostgreSQL データベースを、Hobby Basic プランで立ち上げ
  • pg:copy コマンドを使って: デフォルトのデータベース(旧: Hobby Dev プラン) から、データを 新: Hobby Basic へコピー
  • 環境変数: データベース接続先URL を新データベースのものに更新
  • Dyno の再起動
  • 旧: Hobby Dev プランのデータベースを削除

PostgreSQL add-on の追加と同時に heroku pg コマンドが用意されているので、そのサブコマンド群を使って、Dashborad 画面での操作もしつつ作業を進めていく

新データベースの追加

Dashboard から、当該アプリケーションの Resources にアクセスして、PostgreSQL データベースを追加する

f:id:innocent-zero:20180315191352p:plain

新/旧 データベース情報の確認

データベースを移行コマンドを実行する前に、対象となる2つのデータベースの情報を確認する

控えておく情報は、各プランの Add-on に書かれている PostgreSQL のID 値

heroku pg:info

f:id:innocent-zero:20180315193129p:plain

データベースのデータ移行

pg:copy でデータを移行する

(コマンドの引数やオプションについては heroku pg:copy --help で確認する)

heroku pg:copy postgresql-from-1234 postgresql-to-9876 --app my-app-1234 --confirm my-app-1234

このコマンドで 移行先のデータが消える ので、実際は --confirm オプション無しで、1打1打慎重に確認しながら作業するのがいいのかもしれない

環境変数の更新

このままだと旧データベースにアクセスしようとするので、新データベースのURL を参照するように、環境変数を更新する

heroku config # 環境変数の一覧を表示
# 一覧から新データベースの接続URL を確認、控えておく

# 旧データベースのURL を新データベースのURL に更新
heroku config:set DATABASE_URL=postgres://username:password@hostname/code

Dyno の再起動

環境変数の更新と同様、新データベースへアクセスさせるためにプロセスを再起動する

対象となるWeb アプリケーションの名前を指定して Dyno を再起動する

heroku ps:restart web.1 # Dashboard からの操作でも可

旧データベースの削除

Dashboard から Hobby Dev プランのデータベースを削除する

Links