Windows環境で構築したサーブレットシステムをUbuntuに移植しようとしてMySQLでハマりました。なんとか解決したのでまとめておきます。
開発環境
Ubuntu 22.04
Java 11.0.18
Tomcat9
Apache2
問題の発生
Ubuntu上にMySQLをインストールし、Windows環境で開発したサーブレットを移植し実行すると、最初のログイン認証でエラーが出て落ちます。UbuntuにEclipse環境を作ってデバッグすると、
[ESSR0072]SQLで例外 ・・・Table 'xxxxxx.USER' doesn't exist
とエラーが出力されます。はて、userテーブルのはずだけど、なんで大文字?ということで、調べると、「MySQL 8.0 リファレンスマニュアル 9.2.3 識別子の大文字と小文字の区別」に、
Windows では大文字と小文字が区別されませんが、ほとんどの種類の Unix では大文字と小文字が区別されます。
とあります。
どうやら、lower_case_table_namesシステム変数を1にすればいいようですが、
lower_case_table_names は、サーバーの初期化時にのみ構成できます。 サーバーの初期化後の lower_case_table_names 設定の変更は禁止されています。
とあり、これを設定するのがとにかく大変でした。いろいろ調べて、何度、MySQLをアンインストールしては再インストールをすると繰り返したか。MySQL5.7で、lower_case_table_names=1にするのは簡単そうなので、いっそダウングレードしようかと思いましたが、MySQL Database 5.7のサポート期限は2023年10月だそうで、8.0で頑張るしかありません。
やっと、こちらのコメントを参考に成功したのでまとめておきます。
lower_case_table_names=1 on Ubuntu 18.04 doesn't let mysql to start
解決手順
① root ユーザに切り替え
$sudo su
② MySQL をインストール
未インストールの場合は、まず普通にMySQLをインストールします。
#apt-get install mysql-server
③ 構成ファイルをバックアップ
この構成ファイルのバックアップをあとで使います。
#cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup
④ MySQLのストップ
#service mysql stop
⑤ アンインストール
一旦、MySQLのアンインストールとすべてのデータベースと関連データを削除します。
#apt-get --purge autoremove mysql-server
#rm -R /var/lib/mysql
⑥ 保存した構成ファイルを復元
③で保存した構成ファイルを復元します。
#cp /etc/mysql/mysql.conf.d/mysqld.cnf.backup /etc/mysql/mysql.conf.d/mysqld.cnf
⑦ lower_case_table_names=1を記述
構成ファイルをエディタで開いて、[mysqld]の最後にlower_case_table_names=1を追加します。
#vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
lower_case_table_names=1
⑧ 構成ファイルを保持してMySQL を再インストール
途中で、構成ファイルの保持を聞かれるので、「N」を入力します。
#apt-get install mysql-server
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
(中略)
設定ファイル '/etc/mysql/mysql.conf.d/mysqld.cnf'
==> あなたかスクリプトによって設定ファイルが作成されています。
==> パッケージメンテナが提供するパッケージにもこのファイルが存在します。
どうしますか? 以下の選択肢があります:
Y か I : パッケージメンテナのバージョンをインストールする
N か O : 現在インストールされている自分のバージョンを残す
D : 両バージョンの差異を表示する
Z : 状況を調査するためにシェルを開始する
デフォルトでは現在使っている自分のバージョンを残します。
*** mysqld.cnf (Y/I/N/O/D/Z) [デフォルト=N] ? N
(後略)
⑨ MySQLスタート
#service mysql start
⑩ lower_case_table_namesの確認
デフォルトでは0だったlower_case_table_namesが1になっているのが確認できます。
#mysql -u root -p
mysql> show variables where variable_name='lower_case_table_names';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
mysql> exit
以上です。
これで無事にサーブレットのログイン認証ができるようになりました。