たくさんデータ投入したら無料プランから外れちゃった
前提
- Rails アプリケーションを作っていて、データベースはとくに複数利用せず1つだけ扱う
- 利用者が自分だけの、趣味プロジェクトなので、サービス止まっても困る人がいない(ので、止めちゃうやりかたを採る)
状況
Heroku から「すぐ対応して」とメールを受け取る
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 データベースを追加する
新/旧 データベース情報の確認
データベースを移行コマンドを実行する前に、対象となる2つのデータベースの情報を確認する
控えておく情報は、各プランの Add-on
に書かれている PostgreSQL のID 値
heroku pg:info
データベースのデータ移行
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 プランのデータベースを削除する