Docker から MySQL 用のコンテナで初期化・起動しようとしたら The server option ‘lower_case_table_names’ is configured … エラーで失敗する

現象

Docker から自作の MySQL 用のコンテナで初期化・起動しようとしたら MySQL が起動しておらず、手動で初期化コマンドを実行したら以下のエラーで失敗する現象に遭遇しました。

[ERROR] The server option ‘lower_case_table_names’ is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either

using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.

環境

環境としては以下の自作の LAMP環境 作成用の Docker Compose を使用しました。

MySQL5.7系 で、 entrypoint で

  • 設定ファイルをテンプレートからコピーして配置
  • /usr/sbin/mysqld --user=mysql --initialize & で初期化コマンド実行
  • /usr/sbin/mysqld --user=mysql & で MySQL 起動
  • MySQL のログから初期パスワードを見つけ出し、環境変数で設定された値に管理者パスワードを変更

をしています。

このうち、2つ目の /usr/sbin/mysqld --user=mysql --initialize & で上述のエラーが発生していました。

対処

エラー文は「 MySQL の設定では大文字小文字を区別する設定になっているが、 dataディレクトリ のファイルシステムは大文字小文字を区別しない環境になっていて不一致を起こしているので、どちらかに統一してね」ということのようです。

今回は Docker for Windows 利用で、 dataディレクトリ はホスト側の Windows のフォルダにボリュームをマウントしています。また、データはコンテナを落としても保持していてほしいので Windows とのボリュームマウントを解除する方向性はなし。

そのため、ファイルシステムは Windows 依存になるので、大文字小文字を区別するファイルシステムに寄せるのは厳しい。したがって、 MySQL 側の設定を調整することにします。

[mysqld]

## 略

# not only lowercase characters in tablename
# lower_case_table_names = 0
lower_case_table_names = 1

該当の設定は lower_case_table_names 。この値0だと大文字小文字を区別する、1だと小文字に変換、2だと大文字小文字を区別してディスクに保存するが MySQL からのルックアップ時に小文字に変換、という挙動になるようです。

今回はシンプルに全て小文字変換で1とすることにしました。

これで問題が解決されたことを確認。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。