Herokuの無料枠

     Herokuから「[Warning] Approaching row limit for hobby-dev database on Heroku app kwl-books」というタイトルのメールが届きました。「データベースには7,322行が含まれています。Hobby-devプランでは、最大10,000行まで許容されています。サービスの中断を避けるためには、データベースをベーシック($9/月)以上のプランに移行してください」。とのこと。
     このサイト(「楽天Kobo電子書籍新着チェッカー」)では、以前の記事に書いたように、電子書籍の新着データをDBに保存して表示しているのですが、そのデータが溜まって制限に届きそうだという警告なので対処することにしました。

    DELETEだけではダメ?

     「楽天Kobo電子書籍新着チェッカー」は、SQLのDELETE文を走らせて古い日付のレコードはその都度削除してデータを溜め込まないようにしているつもりなので容量の心配をせずに運用出来ると思っていました。だからメールを受け取った時は、データを物理削除(TRUNCATE)しなければダメってことだろうとすぐに思い当たったのですが、DBごと削除して再構築する方が簡単そうなのでそうすることにしました。
     「楽天Kobo電子書籍新着チェッカー」では、設定で必要なのは環境変数だけで、全てのデータをWebAPIで取得して保存しているので、予め必要なマスターデータと呼ぶものがありません。と言うことでDB毎削除しても問題ありません。

    $ heroku addons:add pgbackups --app kwl-books
     ›   Warning: heroku update available from 7.52.0 to 7.54.1.
    Creating pgbackups on ⬢ kwl-books... !
     ▸    Couldn't find either the add-on service or the add-on plan of "pgbackups".
    
    

     念の為バックアップしようとしたのですが、無料枠(Free Dynos)では使えないようです:sweat_smile:

    $ heroku pg:reset DATABASE --confirm kwl-books
     ›   Warning: heroku update available from 7.52.0 to 7.54.1.
    Resetting postgresql-opaque-46906... done
    

     呆気なく削除完了

    $ heroku pg:info --app kwl-books
     ›   Warning: heroku update available from 7.52.0 to 7.54.1.
    === DATABASE_URL
    Plan:                  Hobby-dev
    Status:                Available
    Connections:           0/20
    PG Version:            11.12
    Created:               2016-03-28 10:18 UTC
    Data Size:             7.8 MB
    Tables:                0
    Rows:                  0/10000 (In compliance)
    Fork/Follow:           Unsupported
    Rollback:              Unsupported
    Continuous Protection: Off
    Add-on:                postgresql-opaque-46906
    
    

     Rows0になってます。

    $ heroku run rake db:migrate:reset
     ›   Warning: heroku update available from 7.52.0 to 7.54.1.
    Running rake db:migrate:reset on ⬢ kwl-books... up, run.9942 (Free)
    The PGconn, PGresult, and PGError constants are deprecated, and will be
    removed as of version 1.0.
    :
    :省略
    :
    

    動作確認

     動作確認。

    $ heroku pg:info --app kwl-books
     ›   Warning: heroku update available from 7.52.0 to 7.54.1.
    === DATABASE_URL
    Plan:                  Hobby-dev
    Status:                Available
    Connections:           1/20
    PG Version:            11.12
    Created:               2016-03-28 10:18 UTC
    Data Size:             8.2 MB
    Tables:                3
    Rows:                  53/10000 (In compliance)
    Fork/Follow:           Unsupported
    Rollback:              Unsupported
    Continuous Protection: Off
    Add-on:                postgresql-opaque-46906
    
    

     Rows53になりました。

     勢いで作業をしてしまって結局TRUNCATEしていたらどうだったのか分からないのですが、少なくともSQL文でDELETEするだけでは、ダメ(Herokuの最大容量制限の対象としてカウントされたままになる)なのだと思います。

    PaaS(Platform as a Service)での運用

     それにしてもHerokuからの通知は、普段安心しきっているところに唐突に来るので嫌なものですが、これはオンプレミスやVPSでの運用より安心し切っている反動のような気がします。Rails+Herokuを業務で使った場合の運用コストは詳しくありませんが、開発に専念出来る点は非常に楽だと思います。
     以前HerokuでNode.jsとMongoDBを使って運用していたアプリがあったのですが、突然Herokuから「MongoDBアドオンを削除します(The mLab MongoDB add-on will be removed from all Heroku apps on November 10, 2020. ) 」と通知が来て、取り急ぎやむなくアプリを非公開にした(どうせユーザーも殆どいなかったし)ことがあったのですが、ちゃんと調べれば代替手段はあったようで、今検索してみるとこんな記事がありました。
     対応はそれなりに面倒そうですが、そもそもMongoDBアドオンが使えなくなったのはHerokuの都合ではないので仕方がないって感じですね。

    追記(2021-07-22)

     二週間ぐらい経ったある日また同じような文面の警告メールをHerokuから受け取りました。

    $ heroku pg:info --app kwl-books
    === DATABASE_URL
    Plan:                  Hobby-dev
    Status:                Available
    Connections:           1/20
    PG Version:            11.12
    Created:               2016-03-28 10:18 UTC
    Data Size:             21.6 MB
    Tables:                3
    Rows:                  7440/10000 (In compliance, close to row limit)
    Fork/Follow:           Unsupported
    Rollback:              Unsupported
    Continuous Protection: Off
    Add-on:                postgresql-opaque-46906
    

     Rows: 7440/10000となっていて、消したはずのレコードが復活しているようです???
     何が起きたのかよく分かりませんが、もう一度heroku pg:reset DATABASE --confirm kwl-booksheroku run rake db:migrate:resetを実行した後、「Heroku Postgres での VACUUM の管理」に書かれている通りVACUUMしてみました。

    $heroku pg:bloat DATABASE_URL --app kwl-books
    :
    :省略
    :
    $heroku pg:vacuum_stats DATABASE_URL --app kwl-books
    $heroku pg:psql
    kwl-books::DATABASE=> VACUUM;
    WARNING:  skipping "pg_authid" --- only superuser can vacuum it
    WARNING:  skipping "pg_subscription" --- only superuser can vacuum it
    WARNING:  skipping "pg_database" --- only superuser can vacuum it
    WARNING:  skipping "pg_db_role_setting" --- only superuser can vacuum it
    WARNING:  skipping "pg_tablespace" --- only superuser can vacuum it
    WARNING:  skipping "pg_pltemplate" --- only superuser can vacuum it
    WARNING:  skipping "pg_auth_members" --- only superuser can vacuum it
    WARNING:  skipping "pg_shdepend" --- only superuser can vacuum it
    WARNING:  skipping "pg_shdescription" --- only superuser can vacuum it
    WARNING:  skipping "pg_replication_origin" --- only superuser can vacuum it
    WARNING:  skipping "pg_shseclabel" --- only superuser can vacuum it
    VACUUM
    kwl-books::DATABASE=> VACUUM genres;
    VACUUM
    kwl-books::DATABASE=> VACUUM books;
    VACUUM
    kwl-books::DATABASE=> exit
    
    $ heroku pg:info --app kwl-books
    === DATABASE_URL
    Plan:                  Hobby-dev
    Status:                Available
    Connections:           1/20
    PG Version:            11.12
    Created:               2016-03-28 10:18 UTC
    Data Size:             8.4 MB
    Tables:                3
    Rows:                  64/10000 (In compliance)
    Fork/Follow:           Unsupported
    Rollback:              Unsupported
    Continuous Protection: Off
    Add-on:                postgresql-opaque-46906
    
    

     動作確認後Rows: 64/10000となっていて、サイトも問題なく動作しているようです。
     消したはずのデータがなぜ復活したのか分かりませんし、データの中身までチェックした訳ではないのですが、今度は大丈夫だろうと思います。