MySQLのインストール(MySQL8.0)
事前準備
インストール先として想定しているOS(CentOS 7)のリポジトリはMySQLの古いバージョンしかサポートしていないので、開発元からリポジトリを取得してインストールします。
下記リンク先で最新リポジトリを確認します。
https://dev.mysql.com/downloads/repo/yum/
ページ下方にある下図の部分から、「Red Hat Enterprise Linux 7 / Oracle Linux 7」の行の[Download]ボタンをクリックします。
「No Thanks, just start my download」のリンクを右クリックし、
表示されたコンテキストメニューからリンク先のURLをコピーするメニューを選択します(下図はFirefoxブラウザでの例)。
コピーした内容を「メモ帳」などに一旦書き出しておきましょう。
2019年7月時点での最新のリポジトリのURLは
「https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm」です。
MySQLサーバのインストール
事前準備で取得したリポジトリRPMをインストールします。
# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
これでyumコマンドで最新のMySQLサーバをインストールできる環境が整いました。
MySQL Community Server をインストールします。
# yum install mysql-community-server
MySQLの初期設定
MySQLサーバを起動する前に、設定ファイルを編集して動作環境を構成します。
今回、MySQLデータベースファイル類を標準(/var/lib/mysql)以外の場所「/var/mysql」に配置するように設定します。
- 通常「/var/lib/mysql」ディレクトリ配下にデータベースファイルが配置されるようになっていますが、/var/lib ディレクトリ以下には多数のディレクトリがあり、運用時にデータベースファイルのバックアップ等の保守を行う際に煩雑になる恐れがあります。
よって判別しやすい位置である「/var」ディレクトリ直下に「mysql」ディレクトリを作成し、データベースファイルを配置することで保守をやりやすくするのが主旨です。
データベースファイル保存場所の作成
# mkdir /var/mysql
# chown mysql:mysql /var/mysql
/etc/my.cnfの編集
設定ファイル「/etc/my.cnf」を編集します。
# vi /etc/my.cnf
-------------------------------------------------
#datadir=/var/lib/mysql <--------------------- ①
#socket=/var/lib/mysql/mysql.sock <--------------------- ②
datadir=/var/mysql <--------------------- ③
socket=/var/mysql/mysql.sock <--------------------- ④
skip-character-set-client-handshake <--------------------- ⑤
default-authentication-plugin = mysql_native_password <--- ⑥
[client]
socket=/var/mysql/mysql.sock <--------------------- ⑦
-------------------------------------------------
- ①、②の先頭に「#」を入れてコメントアウトします。
- ③、④、⑤、⑥、⑦を追記します。
- ⑥はパスワード認証方式の変更の指定。これを入れておかないとPHPからPDOでMySQLに接続できません。
- ③、④、⑦はデータベースファイルを/var/mysqlに配置することに伴う設定。データベースファイルをここへ配置しないのであれば設定不要。
SELinuxの設定
このままだとMySQLサーバ「mysqld」を起動しようとすると以下のメッセージを表示し起動しません。
# systemctl start mysqld.service
Job for mysqld.service failed. See 'systemctl status mysqld.service' and 'journalctl -xn' for details.
http://www.lunaplus.net/method/mysql/mysql02/
https://blogs.oracle.com/jsmyth/entry/selinux_and_mysql
SELinuxの制限が影響しているようです。
# ls -Z /var
:
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0 mysql
:
データベースファイルの保存場所を/var/lib/mysql から /var/mysql へ移動したことが影響しているようです。
SELinuxを無効にしてしまえばMySQLサーバは起動しますが、セキュリティ上好ましくありません。
よって下記の手順でSELinuxを正しく設定します。
# semanage fcontext -a -t mysqld_db_t "/var/mysql(/.*)?"
# restorecon -RFv /var/mysql
# ls -Z /var <----------------------------- 確認
:
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
- 「var_t:s0」が「mysql_db_t:s0」になっていればOK。
MySQLサーバの起動
以下のコマンドでMySQLサーバ「mysqld」を起動します。
# systemctl start mysqld
# systemctl -t service |grep mysqld <-------------------------- 状態を確認
mysqld.service loaded active running MySQL Server <-- activeになっていればOK
自動起動の設定
再起動時に自動でmysqldが起動するように設定します。
# systemctl enable mysqld
MySQLサーバへログイン
初期パスワードの取得
ログファイル「/var/log/mysqld.log」に初期パスワードが記録されているので取得します。
# grep 'temporary password' /var/log/mysqld.log
2019-01-09T09:25:38.650273Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: パスワード
MySQLにログイン〜rootパスワードの変更
以下のコマンドでMySQLに「root」ユーザでログインします。
- 以下の例のように初回ログイン時すぐにパスワードを変更しないと一切のコマンドを受け付けません。まずはrootのパスワードを変更します。
# mysql -u root -p
Enter password: <------------------------------------ 初期パスワードを入力
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.13
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases; <------ ①Databaseを参照しようとするも
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. <--- ②まずはパスワードを変更しろ!と言ってくる
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; <---- ③とりあえず変更
Query OK, 0 rows affected (0.03 sec)
③で新しいパスワードを設定する際、パスワードの制限(バリデートといいます)が厳しいため簡単なパスワードでは設定完了しません。ここではとりあえずある程度複雑なパスワード(例の「MyNewPass4!」で可)を設定しておき、この後必要であればバリデートのレベルを下げます。
バリデートのレベルを下げる(必要時)
現在の状態を確認
現在(インストール直後)のパスワードバリデートのレベルを確認します。
mysql> 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 |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
mysql> quit <----------------------------------------- mysqlを抜ける
- ①のようにパスワードの文字列長は8文字以上に設定されています。
- ②のようにパスワードのポリシーは「MEDIUM」(中程度の強度)に設定されています。
バリデートのレベルを下げる
以下のようにMySQL設定ファイル「/etc/my.cnf」に設定します。
ここではパスワードの最低長を6文字、パスワードの強度を「LOW」(緩い)に設定しています。
# vi /etc/my.cnf
-------------------------------------------------
:
skip-character-set-client-handshake
default-authentication-plugin = mysql_native_password
validate_password.policy=LOW <----------------- 追記:パスワードの強さを変更
validate_password.length=6 <----------------- 追記:パスワードの最低長を変更
:
-------------------------------------------------
MySQLサーバを再起動します。
# systemctl restart mysqld
MySQLユーザ「root」のパスワードを再設定
# mysql -u root -p
Enter password: <------- 先ほど設定したパスワード(MyNewPass4!)を入力
:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいrootのパスワード';
Query OK, 0 rows affected (0.03 sec)
mysql> quit
以降、データベースの作成、等ができる環境になりました。