LoginSignup
0
0

More than 1 year has passed since last update.

Ubuntu 22.04のMySQL8.0でlower_case_table_names=1に変更する

Posted at

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

以上です。
これで無事にサーブレットのログイン認証ができるようになりました。

0
0
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
0
0