19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-02

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

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

19
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?