RDS for MySQLのlower_case_table_namesはDBインスタンス作成時に指定が必要

lower_case_table_namesの値は設計段階で決めておきましょう!
2022.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

RDS for MySQLのlower_case_table_namesというパラメータはDBインスタンス作成後に変更不可であり、結果としてDBインスタンスの再作成が必要となったので、備忘としてブログにまとめていきます。

[2022/4/14追記]本件はRDS特有の制約ではなく、MySQLエンジンの仕様となります。MySQLのリファレンスマニュアルに「lower_case_table_names は、サーバーの初期化時にのみ構成できます。 サーバーの初期化後の lower_case_table_names 設定の変更は禁止されています」と記載されております。

引用:MySQL 8.0 リファレンスマニュアル 識別子の大文字と小文字の区別

lower_case_table_namesって何?

MySQLのデータベース名やテーブル名を大文字小文字で区別するかどうかのパラメータとなります。
OSのファイル名の扱いに準拠するようなので、デフォルト値はOSによって異なります。

OS デフォルト値
Unix 0
Windows 1
macOS 2


ここからが本題なのですが、RDS for MySQLの場合はlower_case_table_namesのデフォルト値は0となります。
そのためデフォルトは大文字と小文字が区別されるというわけです。

アプリ要件等で名前は小文字で保存し、大文字小文字を区別したくない場合は、AWS公式ドキュメントにある通り、DBインスタンス作成時にlower_case_table_namesの値を設定する必要があります。

DB インスタンスを作成する前に、カスタム DB パラメータグループに lower_case_table_names パラメータを設定します。その後、DB インスタンスを作成する際にカスタム DB パラメータグループを指定します。

また、全バージョンでサポートされているわけではないため、2022/4/12時点では、以下のような前提事項があります。

lower_case_table_namesの値 サポートバージョン
0 全バージョン
1 5.6、5.7
8.0.19 および 8.0 以降


尚、DBパラメータグループが8.0より前のバージョンのMySQL DBインスタンスに関連付けられている場合、lower_case_table_names のパラメータ変更は非推奨となります。
AWS公式ドキュメントにある通り、バックアップやリードレプリカに影響が出る可能性があります。

ポイントインタイムリカバリのバックアップとリードレプリカの DB インスタンスで不整合が生じることがあるためです。


他にもいくつか考慮事項がございますので、詳細については以下リンク先をご参照願います。

本当に変更不可なのか試してみた

DBインスタンス作成後にlower_case_table_namesが変更できないか試してみました。

DBインスタンスに関連付けたDBパラメータグループから変更

DBインスタンスに関連づけられている、既存のカスタムDBパラメータグループから、該当のパラメータ変更を試みました。
しかし、保存中のエラーとなり変更できませんでした。

別のDBパラメータグループに変更

DBパラメータグループ自体を変更すれば、ワンチャンあるかなと思い、lower_case_table_namesの値を設定した別のDBパラメータグループへ変更しようとしましたが、エラーとなってしまいました。

参考URL

まとめ

RDSで変更が必要なパラメータは後で対応すればいいかなという認識だったので、今回の件は良い薬になりました。

この記事が、どなたかのお役に立てば幸いです。それでは!