古いrailsアプリをrancher(kubernetes)でデプロイしようと、頑張ってコンテナ化の改造を何日やって参りました。
なぜかmysql周りで手こずったので、対処方法をここでメモします。
同じようなエラーで脳細胞を酷使する人がないよう、お祈り申し上げます。
APP周りdependencies
1 | ruby v2.2.x |
……すごっ!いっぱいー
早速問題だ
コンテナ化ですから、コンテナ環境でアプリを立ち上げようぜー
……
……
……
まぁ、いっぱいやりました~(雑すぎ)
重要なのは、DB周りだー
Unsupport utf
1 | rake db:createしようとしたら、エラー! |
utf charsetサポートされていないって、そんなバカな!
ちょっとconfig/database.ymlをいじってみよう。
1 | default: &default |
utf -> utf8mb4に変更したらどうだ!喰らえー
まぁ、無事DBが作られた。セーフー
続いて〜db:migrate
column size too large
またエラーだ!!!
今回のエラーメッセージがめちゃくちゃ長い!
……むむ……
どういう事だ……さっぱりわからん。
要は、utf8mb4だと、カラムのバイト数オーバーでしょう。
原因
ActiveRecordのstring型カラムがvarchar(255)で定義されるので、utf8mb4ではインデックスのキープレフィックスが767byteを超えてしまう。
MySQL5.7未満では、テーブル作成時にROW_FORMAT=DYNAMICを渡してやらなければならない。
Rails4だとモンキーパッチを使って、テーブル作成時のオプションにROW_FORMAT=DYNAMICを追加してやる
じゃ、手を打うー
database(mysql)の設定を見直し、767超えても大丈夫なように、ファイルフォーマットをAntelopeからBarracudaに変更。
AWS RDSを使っているので、パラメータグループで、「innodb_file_format」を「Barracuda」を指定する。
また、config/initializers/ar_innodb_row_format.rbを追加し、デフォルトのテーブル作成時の
ROW_FORMATをCOMPACT -> DYNAMICに指定変更
1 | module InnodbRowFormat |
これでイケるはず!
retry!
直前失敗したので、rake db:migrate:resetにする。
やった!!!!!作られた!!!!
それで?
引き続き、コンテナ改造続行します。
何か別のネタがあたっら、またここでシェアしますんで、ご期待のないようにお待ち下さいw