前回の日記で述べたとおり、herokuは、無料では、格納できるデータのサイズが5Mに制限されています。
一時的にサイズが大きくなっても、しばらくは使えるようですが、長い間放置しておくと、
アカウント登録したメールアドレス宛に「サイズがでかいから有料プランに移行してね」という旨の
メールが来るらしい
です。ここでは、データサイズの監視、管理方法について述べます。

なお、ここでは、herokuにあるWebアプリがruby on railsで動き、ActiveRecordが使える状態であることを前提とします。

現在のデータサイズの詳細を確認するために、herokuのコンソールを起動させます。
>heroku console
以下のコマンド(長っ)を打ち込みます。
>> ActiveRecord::Base.connection.select_all("SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows, to_char(pg_relation_size(relname), '999,999,999,999') as bytes FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');").each{|i| puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"}
テーブルごとに、サイズとレコード数が出てきます。
schema_migrations       8,192bytes  14rows
unique_schema_migrations  16,384bytes  14rows
users_id_seq             8,192bytes  1rows
sessions_pkey          2,793,472bytes 119,110rows
entries_pkey              40,960bytes 874rows
...
sessions                  21,970,944bytes 119,110rows
index_sessions_on_session_id    9,682,944bytes  119,110rows
index_sessions_on_updated_at   2,834,432bytes  119,110rows
'session'と名のつくテーブルが、かなり肥大化しているのが分かります。
railsでは、DBに記録したセッションは、明示的に削除しない限り、どんどん溜まっていきます。
なので、データサイズを肥大化させないためには、不必要なセッションを削除していく必要があります。
以下のコマンドを、heroku consoleから実行します。
>> CGI::Session::ActiveRecordStore::Session. delete_all(["sessions.updated_at < ?", 3.days.ago])
>> ActiveRecord::Base.connection.select_all("REINDEX TABLE sessions")
上記の例では、3日前のセッションを削除しています。
実行後、再びデータサイズを調べると、セッションに関係する行数(rows)が減っていることが確認できます。
なお、この時点では、データサイズ(bytes)は変化しません。
postgresqlの場合、一度増えたデータサイズは、VACUUMコマンドで明示的に減らす必要があります。

>> ENV['DATABASE_URL']
=> "postgres://xxxxxxxx:yyyyyyyyyyyyyyyy@zzzzzzzzz/xxxxxxxx" (←xxxxxxxxがデータベース名)

>> ActiveRecord::Base.connection.select_all("select pg_size_pretty(pg_database_size('xxxxxxxx'))")  (←xxxxxxxxはデータベース名を指定)

>> ActiveRecord::Base.connection.select_all("VACUUM FULL")   (←VACUUM処理) 

>> ActiveRecord::Base.connection.select_all("select pg_size_pretty(pg_database_size('xxxxxxxx'))")  (←データサイズ減少を確認)
これで、サイズが削減されたはずです。
なお、heroku infoで表示されるサイズは、集計するのに一定の時間が必要らしく、データの削減はすぐには反映されません。1~2日置いてから、再度、コマンドで確認してください。

herokuには、一定時間毎にコマンドを実行するcronの仕組みがあるので、セッション削除のコマンドをcronに組み込むことができれば、運用が楽になるかもしれません。