| ../ |
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;
以上