3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-14

| ../ |

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データベースである。

$ 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もクリアしておくとよい。後でエラーを確認しやすい。

$ 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に追記すること。余計な設定が残っていると、エラーが起きたときに切り分けが難しくなる。

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

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

$ 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アカウントでパスワード認証なしで入れる。

$ 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アカウントでログインできることを確認する。

$ 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)でバックアップしておいたファイルをリストアして、データを戻す。

$ 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;

以上

| ../ |

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?