10
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

herokuでMySQL5.7以降を使うためにClearDBからJawsDBに変更する

DBを変更した動機

Rails製のアプリをherokuにデプロイしmigrationした際、以下のようなエラーに遭遇しました

Mysql2::Error: Specified key was too long; max key length is 767 bytes 

これはDBのcharsetがutf8mb4であったことが原因です
utf8mb4は1文字が4バイトなので

varchar(255)を扱う場合、255 * 4バイト = 1020バイトとなり767バイトを超えてしまいます

そのためインデックスキーを貼れずにエラーになってしまいます。

調べているといろいろな手段がありました

色々な解決方法

1. utf8mb4からutf8に変更する

utf8は1文字が3バイトなので
255 * 3バイトでMAXが765バイトになるので納まるのですが、MySQL5.5のutf8では絵文字を扱うことができません
絵文字を扱いたかったのでこれではダメです

2. varcharの最大長を765バイト以下になるようにする

x * 4 > 765 でMAXで191文字まで大丈夫だということがわかります

t.string   :awesome_string_column, limit: 191 

しかし、DB都合でアプリケーションに制約を持たせるは嫌なのでダメです

3. DBのフォーマットを変更する

MySQLの設定ファイルであるmy.cnfでファイルフォーマットの設定を変更すれば3072バイトまで拡張されるようです

innodb_file_format=Barracuda  

しかしherokuのclearDBではmy.cnfがいじれない(多分)ので不可能でした

4. MySQLのversionを上げる

デフォルトでverison: '5.5.62'であるClearDBのMySQLバージョンをあげてあげたら解決しそう

heroku addons:create cleardb:ignite --name=my-db-name --version=5.7

しかしherokuのフリープランigniteでは上げることができない模様...
困りました

採用した解決方法

JawsDBというClearDBとほぼ変わりがない(らしい)MySQLデータベースを採用することにしました(無料)

JawsDB users can choose their database version at provision time by specifying a --version flag. Versions 5.7 and 8.0 are currently supported. If no version flag is supplied, the default database version will be used. The current default database version is 5.7

デフォルトが5.7で8.0まで行けるんですね

アドオンを追加します
デフォルトのバージョンが5.7ですが念のため明記しておきます

heroku addons:create jawsdb:kitefin --name=my-db-name --version=5.7

JawsDBの情報を見ます

$ heroku config | grep JAWSDB_URL
> JAWSDB_URL: mysql://<username>:<password>@<host>/<databse>

接続情報が見られるのでドライバを変更してあげます

heroku config:set DATABASE_URL='mysql2://<username>:<password>@<host>/<database>?reconnect=true'

その後マイグレーションするとエラーを出さずに実行できました!

image.png

ジョーズの背びれが可愛いですね🦈

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?