【MySQL】 MySQL 8.0 のインストール / アップデート ~ CentOS 編 ~

■ はじめに

 * 2018/04/19に「MySQL 8.0.11 (GA版)」を正式リリースされたので、試してみる
 * なお、v5.7 のインストールについては、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/36283180.html

補足:GAについて

* GA : General Availability
 => 「正規版」ってこと
 => 「一般提供」「一般向け提供」

 * 直訳で...

  + Availability = 「入手できること」「可用性」
  + General Availability = 「一般に利用できる状態」
(ついでに) RC : Release Candidate
 => 「出荷一歩前のリリース」ってこと
 => ベータ版よりもさらに製品版に近い

 * 直訳で...

  + Candidate = 「候補」
  + Release Candidate = リリース候補

■ 主な変更

* トラブルにもなるので主な変更点を上げる
 * 大幅な性能向上(MySQL 5.7よりも最大2倍高速)
 * JSONデータに対応したNoSQL機能の搭載
 * 地理情報の対応
 * Unicode対応強化
 * ロールによるユーザー権限

認証方式

 * mysql_native_password から caching_sha2_password に変更

 * 実際にインストールしていざ、HeidiSQLでアクセスしたら、エラーになった。
  => 原因は、HeidiSQLがcaching_sha2_password に対応できてなかったから
MySQL Clientとの互換性のために...
■トラブル回避1
~~~~~~~
ALTER USER 'admin'@'%' identified WITH mysql_native_password BY 'password';
~~~~~~~

■トラブル回避2

sudo vi /etc/my.cnf
~~~~~~~
default_authentication_plugin=mysql_native_password
~~~~~~~

デフォルト・キャラクタセット

 * latin1(ascii相当)から utf8mb4 に変更

SET PASSWORD使用禁止

 * SET PASSWORDが使えない
~~~~~~~~~
[x] SET PASSWORD FOR root@localhost=PASSWORD('password');
[o] ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
~~~~~~~~~

■ インストール/初期設定

インストール

sudo yum -y localinstall http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

# MySQLのインストール
sudo yum install -y  mysql mysql-devel mysql-server

# バージョン確認 
mysql --version
# 今回は「mysql  Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)」が表示

# 一旦、MySQLの起動し、エラーが発生しないことを確認し、停止する
sudo systemctl start mysqld
sudo systemctl status mysqld
sudo systemctl stop mysqld

初期設定(MySQLの修正)

# 修正前のファイルをバックアップとして、とっておく
sudo cp -p /etc/my.cnf /etc/my.cnf.orig

# viなどでファイルを修正する
sudo vi /etc/my.cnf
~~~
[mysqld]
・・・
# Add
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

default_authentication_plugin=mysql_native_password

# パスワード制限をゆるゆるにする
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0
~~~

# 意図した修正かどうかを最後に差分をとって確認する
sudo diff /etc/my.cnf /etc/my.cnf.orig

■ rootの設定

[前提条件] MySQLを起動させておく(sudo systemctl start mysqld)
# [1] /var/log/mysqld.log で、検索キーワード「temporary password」などで
#     仮パスワード(以下の「****」部分)をメモるかコピーしておく
sudo less /var/log/mysqld.log
/temporary password

2018-08-07T14:27:06.815348Z 1 [Note] A temporary password is generated for root@localhost: ****
# q で終了

# [2] 初期設定を行う
mysql -u root -p
# パスワードは[1]を入れる。

# 新しいパスワードを変更する
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL ON  *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

FLUSH PRIVILEGES;

SELECT Host, User, plugin FROM mysql.user;

■ アップデート

MySQL5.7 => MySQL8 の更新

# 古いMySQLを削除
sudo rpm -e mysql-community-release

# MySQL8 をインストール
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm

# MySQLの停止
sudo systemctl stop mysqld

# MySQLのアップグレード
sudo yum update mysql-server

# MySQLの開始
sudo systemctl start mysqld

# MySQLテーブルのアップグレード
sudo mysql_upgrade -u root

# MySQLのリスタート
sudo systemctl restart mysqld

# 確認
mysql --version

【トラブル】「Could not create the upgrade info」が表示

mysql_upgrade -u root」を実行したら、以下の「エラー内容」が表示
エラー内容
Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
解決案
# ルートで実行
sudo mysql_upgrade -u root

【補足】 基本コマンド

https://blogs.yahoo.co.jp/dk521123/36283180.html
と同じ

MySQL自動起動

sudo systemctl enable mysqld
# enabledで表示されたら自動起動が有効になっている
sudo systemctl is-enabled mysqld

MySQLの起動

# MySQLの起動
sudo systemctl start mysqld
# MySQLの再起動
sudo systemctl restart mysqld
# MySQLの停止
sudo systemctl stop mysqld

【任意設定】外部からアクセスするためにファイアウォールをあける

# ファイアウォールが有効か?(「active (running)」なら以下を実行)
systemctl status firewalld

sudo firewall-cmd --add-service=mysql --zone=public --permanent

sudo firewall-cmd --reload