masalibの日記

システム開発、運用と猫の写真ブログです

CenoOS7にmysql8をインストール

自分用のメモです。

 インストール

デフォルトで入っているmariadbを削除する

sudo yum remove mariadb* -y
# インジェクションがあるpostfixも消える

mysql8のリポジトリを設定する

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

mysql8をインストールする

sudo yum install -y mysql-community-server

バージョンの確認

sudo mysqld --version
# /usr/sbin/mysqld  Ver 8.0.13 for Linux on x86_64 (MySQL Community Server - GPL)と表示されるはず

OSの再起動の設定

sudo systemctl enable mysqld.service

MySQL8.0 認証方式を変更

今後、作成するユーザーの認証方式を変更する

caching_sha2_password => mysql_native_password

sudo sed -i '$a default-authentication-plugin=mysql_native_password' /etc/my.cnf

パーミッションの変更

sudo chown -R mysql /var/lib/mysql

サービスの開始

sudo systemctl restart mysqld.service
sudo systemctl status mysqld.service

下記のような出力がされる。(エラーになっていないことを確認する)

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri YYYY-MM-DD ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 2559 (mysqld)
   Status: "SERVER_OPERATING"
   CGroup: /system.slice/mysqld.service
           └─2559 /usr/sbin/mysqld

 localhost.localdomain systemd[1]: Starting MySQL Server...
 localhost.localdomain systemd[1]: Started MySQL Server.

 rootのパスワード変更

MySQLの初期パスワードはログに出力されるのでそれを取得する。

DB_PASSWORD=$(grep "A temporary password is generated" /var/log/mysqld.log | sed -s 's/.*root@localhost: //')
echo "mysql password "
echo ${DB_PASSWORD}

新しいパスワードの設定をする(2回目はエラーになる)
PDOがcching_sh2_passwordに対応していないのでmysql_native_passwordに変更する

NEW_DB_PASSWORD='PassWord!'
sudo mysql -uroot -p${DB_PASSWORD} --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${NEW_DB_PASSWORD}'; "

変更の確認。rootのpluginはmysql_native_passwordになっている

sudo mysql -u root -p${NEW_DB_PASSWORD} -e "select user,host,password_last_changed,plugin from mysql.user;" 

 その他の確認

文字コード確認 => filesystem dir以外がutf8mb4になること

sudo mysql -u root -p${NEW_DB_PASSWORD} -e "SHOW VARIABLES LIKE 'chara%'" 

360日問題確認 => 0になること

sudo mysql -u root -p${NEW_DB_PASSWORD} -e "SELECT @@default_password_lifetime;" 

 phpでの確認

phpのインストールされている場合は接続テストをおこなう

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

try {
    // DBへ接続
    $dbh = new PDO("mysql:host=127.0.0.1; dbname=mysql; charset=utf8", 'root', 'PassWord!');

    // SQL作成
    $sql = "select user,host,password_last_changed from,plugin mysql.user; ";

    // SQL実行
    $res = $dbh->query($sql);

    // 取得したデータを出力
    foreach( $res as $value ) {
        echo "$value[user]:";
        echo "$value[host]:";
        echo "$value[password_last_changed]:";
        echo "$value[plugin]<br>";
    }

} catch(PDOException $e) {
    echo $e->getMessage();
    die();
}

// 接続を閉じる
$dbh = null;