schedule2019-09-18

CentOS7にMySQL8をインストールして初期パスワードを変更する

CentOS7にMySQL8をインストールして初期設定するところまでをまとめました。

環境

  • CentOS 7.6
  • MySQL 8.0

MySQL 8のインストール

mariaDBを削除

CentOS7系ではmariaDBがデフォルトで入っている場合がある。 MySQLをインストールする際に競合するため、これを先に削除しておく。

$ sudo yum remove mariadb-libs

MySQL8 インストール

MySQLのyumリポジトリを追加する必要があります。

yumリポジトリは公式のこちらに置いてあり、yum localinstall http://dev.mysql.com/get/リポジトリ名でインストールできます。

# yumリポジトリをインストール
$ sudo yum -y localinstall http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

正しくyumリポジトリを追加できると、yum info mysql-community-serverでこれから導入するMySQLのバージョンが確認できます。

# インストールできるMySQLのバージョンを確認
$ sudo yum info mysql-community-server

...

Installed Packages
Name        : mysql-community-server
Arch        : x86_64
Version     : 8.0.17
Release     : 1.el7
Size        : 1.8 G
Repo        : installed
From repo   : mysql80-community
Summary     : A very fast and reliable SQL database server

...

バージョンは問題ないので、mysql-community-serverをインストールします。

# MySQLをインストール
$ sudo yum -y install mysql-community-server

# バージョン確認
$ sudo mysqld --version
/usr/sbin/mysqld  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)

インストールはここまでです。

初期設定

MySQLの設定ファイルは/etc/my.cnfです。 末尾に設定を加えます。

# 設定をバックアップ
$ sudo cp /etc/my.cnf /etc/my.cnf.org
$ sudo vi /etc/my.cnf

# 認証プラグインの設定
default_authentication_plugin=mysql_native_password

viがめんどくさい人は以下のコマンドで末行に追加できる。

# sudo suのあと
echo "default_authentication_plugin=mysql_native_password" >> /etc/my.cnf

この設定はなにか?は次で述べてます。

default_authentication_plugin

MySQL8.0は認証プラグインが新たに追加されcaching_sha2_passwordになりました。これは、SHA-256を使用した、より安全なパスワードの暗号化を提供するとともに、キャッシュを使用して同一ユーザの認証処理を高速化しようという、MySQL推奨の認証プラグインです。

ただし、接続に使用するクライアント又はコネクタ側でも caching_sha2_password をサポートしている必要があるため、従来のmysql_native_passwordを設定しておきます。

パスワードのポリシーの設定について

MySQLでは結構厳格なパスワードを求められます。 初期では英数記号全て含む文字列をパスワードに使わなければならない。 開発環境などで簡易なパスワードを設定するには、validate_passwordを設定してください。

▼ 例として、4文字以上の文字列なら通す設定です。

# パスワードポリシー
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.special_char_count=0
validate_password.policy=LOW

詳細は以下の参考をご覧ください。

MySQL起動

説明が長くなってしまいました。MySQLを起動します。

# 起動
$ sudo systemctl start mysqld

# 状態確認
$ sudo systemctl status mysqld

起動に失敗した場合に確認するところ

  • systemctl status mysqld
  • journalctl -xe
  • /var/log/mysqld.log #初期設定でのログの場所

自動起動の設定

# 自動起動
$ sudo systemctl enable mysqld

初回のパスワードについて

mysqlを初回に起動すると一時パスワードがlogに吐き出されます。 次で使うためメモします。

$ grep password /var/log/mysqld.log
2019-09-19T01:46:33.268022Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: %ata*6Cz.9No

ここでは%ata*6Cz.9Noです。

パスワードの更新と初期設定

mysql_secure_installationで初期設定をしていきます。

$ mysql_secure_installation

mysql_secure_installationに項目の和約が載っています。こちらはMariaDBとなっていますが、内容はMySQLとほぼ同じでした。

質問と簡単な訳

$ mysql_secure_installation

Securing the MySQL server deployment.
# 一時パスワードを入力する
Enter password for user root:

The existing password for the user account root has expired. Please set a new password.
# パスワードを更新
New password:

Re-enter new password:
 ## パスワードを英数字のみで登録しようとしたらダメだった。
 ... Failed! Error: Your password does not satisfy the current policy requirements

New password:

Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :  y

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
# 匿名ユーザを削除しますか?
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
# リモートからの root ログインを禁止しますか?
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
# test データベースとそのデータベースへのアクセスを削除しますか?
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
# 今すぐ権限テーブルを再読み込みしますか?
Success.

All done!

開発環境だったのでRemove anonymous users?はnoを選択しとくべきだったかな。

ログインと状態確認

rootでログインする。

$ mysql -u root -p
Enter password:

状態の確認

mysql> status
--------------
mysql  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:          11
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.17 MySQL Community Server - GPL
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 17 min 54 sec

Threads: 2  Questions: 16  Slow queries: 0  Opens: 128  Flush tables: 3  Open tables: 48  Queries per second avg: 0.014
--------------

文字コードなどの確認

mysql> show variables like '%char%';
+--------------------------------------+--------------------------------+
| Variable_name                        | Value                          |
+--------------------------------------+--------------------------------+
| character_set_client                 | latin1                         |
| character_set_connection             | latin1                         |
| character_set_database               | utf8mb4                        |
| character_set_filesystem             | binary                         |
| character_set_results                | latin1                         |
| character_set_server                 | utf8mb4                        |      
| character_set_system                 | utf8                           |      
| character_sets_dir                   | /usr/share/mysql-8.0/charsets/ |      
| validate_password.special_char_count | 1                              |      
+--------------------------------------+--------------------------------+      
9 rows in set (0.00 sec)

以上でMySQL8のインストール終わりです。

おわりに

何度かMySQLのインストールに失敗していると前のDBや設定が残って起動できないことが多々あった。つらかった。

完全に削除する手順をまとめたので、こちらもどうぞ。

参考