CentOS8.3のMySQL8.0でlower_case_table_names=1に変更する手順

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
CentOS8.3にMySQL8.0をインストールしている。Windows版と同様にテーブル名やカラム名の大文字小文字の区別をやめたい。そのためには、my.cnfに `lower_case_table_names=1` を設定してmysqldを再起動すればよい。以前はそれでよかった。しかし、いつからか不明だが、MySQL8.0での手順は容易ではなくなっていた。
lower_case_table_namesの指定は、MySQL8.0の初期インストール直後にしか行えなくなった。初期インストール状態に戻すには、一旦データストアをごっそり削除して、改めてデータストアを再作成する必要がある。その手順をメモしておく。

- (1) 既存DBのダンプを取る
- (2) データストアをごっそり削除する
- (3) lower_case_table_names=1を設定してデータストアを再作成する
- (4) rootのパスワードを設定する
- (5) create databaseとcreate userして、GRANT設定する
- (6) ダンプからリストアする


## (1) 既存DBのダンプを取る

既存のユーザー定義のDBのバックアップを取っておく。mysqlデータベース以外のDBはすべて取っておく。以下の例では、kankeriデータベースとxxxデータベースである。

```bash
$ mkdir -p /var/tmp/mysql
$ mysqldump -uroot -p kankeri > /var/tmp/dump-kankeri.sql
$ mysqldump -uroot -p xxx     > /var/tmp/dump-xxx.sql
```

## (2) データストアをごっそり削除する

MySQLのデータストア(/var/lib/mysql)をごっそり削除する。mvして退避しておくと無難である。mysqld.logもクリアしておくとよい。後でエラーを確認しやすい。

```bash
$ mv /var/lib/mysql /var/tmp/mysql
$ rm -f /var/log/mysql/mysqld.log
$ touch /var/log/mysql/mysqld.log
$ chown mysql.mysql /var/log/mysql/mysqld.log
```

## (3) lower_case_table_names=1を設定してデータストアを再作成する

まず、mysql-server.cnfに`lower_case_table_names=1`を記述する。初期状態のcnfに追記すること。余計な設定が残っていると、エラーが起きたときに切り分けが難しくなる。

```bash
$ vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
lower_case_table_names=1
```

そして、データストアを再作成し、サービスを開始する。この時点でエラーなく起動できることを確認する。

```bash
$ mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --console
$ ls -l /var/lib/mysql
$ more /var/log/mysql/mysqld.log
$ systemctl start mysqld
```

## (4) rootのパスワードを設定する

rootのパスワードを設定するためにmysql-server.cnfに`skip-grant-tables`を追記して、サービスを再起動する。必要なら、エンコーディングの設定も行う。MySQLコンソールにrootアカウントでパスワード認証なしで入れる。

```bash
$ vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
character-set-server=utf8
lower_case_table_names=1
skip-grant-tables

$ vi /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8

$ systemctl restart mysqld
$ mysql -uroot
```
userテーブルを確認しておこう。またパスワードの強度設定を確認しておこう。

```
> use mysql
> select user,host,plugin,authentication_string from user;
+------------------+-----------+-----------------------+-----+
| user             | host      | plugin                | authentication_string |
+------------------+-----------+-----------------------+-----+
| mysql.infoschema | localhost | caching_sha2_password | *** |
| mysql.session    | localhost | caching_sha2_password | *** |
| mysql.sys        | localhost | caching_sha2_password | *** |
| root             | localhost | mysql_native_password | *** |
+------------------+-----------+-----------------------+-----+

> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
```
パスワードの強度は、私は以下のように弱めておく。初期状態では大文字・小文字・数字・記号のミックスになっている。その後で、rootアカウントのパスワード設定を行う。パスワードの強度に合っていない平易なパスワードだと「ERROR 1819 (HY000): Your password does not satisfy the current policy requirements」になる。

```
> set global validate_password.length=6; 
> set global validate_password.policy=LOW;
> set global validate_password.special_char_count=0;
> flush privileges;

> alter user 'root'@'localhost' identified by '***';   # 任意のパスワードで
> flush privileges;
> exit;
```

skip-grant-tablesを外して、再起動し、rootアカウントでログインできることを確認する。

```bash
$ vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
character-set-server=utf8
lower_case_table_names=1
#skip-grant-tables            # コメントアウト

$ systemctl restart mysqld
$ mysql -uroot -p mysql
Enter password: ***
```

## (5) create databaseとcreate userして、GRANT設定する

必要なユーザー定義のデータベースとアカウントを作成し、GRANT設定する。以下の例では、kankeriデータベースとxxxデータベース。kankeriデータベース用には、kadminとkuserというアカウントをGRANT設定している。パスワード強度は、前述のrootと同様になる。

```
> use mysql;
> create database kankeri;
> create database xxx;

> CREATE USER kadmin@localhost IDENTIFIED BY '***'; 
> CREATE USER kuser@localhost  IDENTIFIED BY '***';   

> GRANT ALL PRIVILEGES ON kankeri.* TO kadmin@localhost;            
> GRANT DELETE,INSERT,SELECT,UPDATE ON kankeri.* TO kuser@localhost;  
> flush privileges;
> select user,host,plugin,authentication_string from user;
+------------------+-----------+-----------------------+-----+
| user             | host      | plugin                | authentication_string |
+------------------+-----------+-----------------------+-----+
| kadmin           | localhost | mysql_native_password | *** |
| kuser            | localhost | mysql_native_password | *** |
| mysql.infoschema | localhost | caching_sha2_password | *** |
| mysql.session    | localhost | caching_sha2_password | *** |
| mysql.sys        | localhost | caching_sha2_password | *** |
| root             | localhost | mysql_native_password | *** |
+------------------+-----------+-----------------------+-----+
```

## (6) ダンプからリストアする。

最初の手順(1)でバックアップしておいたファイルをリストアして、データを戻す。

```bash
$ mysql -uroot -p kankeri < /var/tmp/dump-kankeri.sql
$ mysql -uroot -p xxx     < /var/tmp/dump-xxx.sql

$ mysql -ukuser -p kankeri
Enter password: ***
> show tables;
```
以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---