先日、herokuさんからこんなメールを頂きました。
要約すると、「DBが無料枠超えそうだからどうにかしてね」と。
以前このブログで公開させて頂き、それなりの反響を頂いたProgrammer Profile。その後更新があまりできていないにもかかわらず、アクセス頂きホント嬉しい限りです(リニューアル作業中ですが、デザイン面で色々難航しており…)
せっかくアクセス頂いているのに、DB容量制限でエラーとなるのもしょんぼりなので、現在の無料プランから月額9$の有料プランに変更しました(広告入れてる訳ではないので、ちょっと辛いですが・・・)
で、実際にネットの情報を元に作業してみると、上手くいかない点があったり、良く分からない点があったので、今後同様のアップグレードをする人の助けになったらいいなと思い、作業ログをまとめてみました。
DBの追加
まず、アップグレードを行うにあたって、herokuでは既存のDBを拡張するというやり方ができません。新たに新しいDBを作成し、そこにデータを移し、DBを切り替えるという作業順序になります。
ここで、いきなりトラップが待ち構えています。
herokuのpostgres管理画面があるんですが、その管理画面から「Create Database」を選んじゃダメです。
既存のアプリケーションと紐付かないDBが作成されてしまいます。
なお、間違って作成してしまった場合は、削除すれば9$まるまる課金されるという事はありません。時間割で課金される様です。
@nakazye 月額ではなく時間割なのですぐ消したのなら被害は少ないはず
— Ayumu AIZAWA (@ayumin) 2015, 5月 23
上はherokuの中の人@ayuminさんからの情報。
では、どこから作れば良いかというと、アプリ管理画面からとなります。 アプリ管理画面から、「Find more addons」を選び
プランを選ぶと、必要なコマンドが出てきます(説明続きます!このまま入力しない様に注意)
先ほどこのまま入力しない様にといいましたが、最後に「--app <追記先のアプリケーション名>」を付け加える必要があります。
僕の場合だとこんな感じ
heroku addons:create heroku-postgresql:hobby-basic --app programmerprofile
すると、アプリケーション管理画面からDBが追加された事を確認できます。
コマンドラインからも確認可能です。
heroku config --app <アプリケーション名>
データをコピーする
まず、DBをコピーするにあたり、コピー中にアプリケーションの操作が行われDBの内容が変わってもしょんぼりなので、アプリケーションをメンテナンスモードにします。
heroku maintenance:on --app <アプリケーション名>
続いて、DBをコピー。heroku config --app <アプリケーション名>
で確認した、新しいDBの名称を利用して
heroku pg:copy DATABASE_URL <新しいDB名称> --app <アプリケーション名>
を入力します。
コマンド入力時に「本当にOKなら、アプリケーション名を入力して(最後にEnter押して)ね」と確認が出てくるので従います。今後、同様の確認が出てきますが、同様にアプリケーション名入れてEnterでOKです。
僕の場合だとこんな感じ。
なお、注意点というかポイントとしては、コピーにそれなりに時間がかかります。
pending...という表示のまましばらく応答がなくなりものすごく不安になりますが、大丈夫です。
DBの向き先を新しい方に変える
まだ、DBを作成してコピーしただけで、アプリケーションは古い方を見続けています。コレを、新しいDBに向き先を変更してあげます。
heroku pg:promote <新しいDB名称> --app <アプリケーション名>
僕の場合だとこんな感じです。
アプリケーションのメンテナンスモードを解除する
最後のコマンドです。
heroku maintenance:off --app <アプリケーション名>
メンテナンスモードにした時のコマンドのonをoffに変えるだけです。
僕の場合はこんな感じ
以上です!
最後に動作確認し、試しにデータを入れてみて、新しくしたDBのデータ数が増える事を確認しましょう。
なお、この記事ですが、似たような感じでここまで書いたタイミングで、ブラウザが落ち、記事の復旧ができなかったという悲しい目にあってます。
だからという訳でもないですが、同じ様にDBをアップグレードしようとしてるけどやり方がわからないという人の助けになれば嬉しいなぁと思った次第です。