CentOS Stream 8 にMySQL8.0.25をソースインストールする

CentOS 7 にMySQL8.0.25をソースインストールしていってみたいと思います。

今回のこだわりポイントは「複数バージョンの同居」です。

まずは第1弾として、MySQL5.5.62をインストールしました。
次に第2弾として、MySQL5.6.51をインストールしました。
次に第3弾として、MySQL5.7.34をインストールしました。

続きまして次はMySQL8.0.25の番です。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2021-08-12
サーバVMware ESXi 6.7 U3
OSCentOS Stream 8
cat /etc/redhat-release
CentOS Stream release 8

MySQLをインストールする準備

事前準備がまだの場合は先に▼をご覧ください。
こちらが済んだ前提で進めていきます。

https://aulta.co.jp/archives/8811

ファイルのURLを取得

https://downloads.mysql.com/archives/community/

「Product Version」「8.0.25」を選択。
「Operating System」は「Source Code」を選択。

一番下「mysql-boost-8.0.25.tar.gz」の欄にある「Download」のリンク先URLを取得します。
Google Chrome なら「Download」ボタンを右クリックして「リンクのアドレスをコピー」です。
で、URLがこちら▼。URLは後で使います。

https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.25.tar.gz

※ mysql-8.0.25.tar.gz を選びたくなりがちですが、MySQL 5.7.5 から Boost が必要になりました。こちらのように個別にBoostを入れても良いのですが、ここでは同梱されている「mysql-boost-8.0.25.tar.gz」を使っていきます。

変数の設定

MYSQL_PORT_NO=58025
MYSQL_VERSION=8.0.25
MYSQL_CHARACTER_SET=utf8mb4
MYSQL_COLLATION=utf8mb4_general_ci
MYSQL_DATA_BASE_DIR=/usr/local/lib/mysql-$MYSQL_VERSION
# (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-$MYSQL_VERSION

インストール

# 確認
ls -la /usr/local/src

# インストールディレクトリ作成
mkdir -p /usr/local/src/mysql-$MYSQL_VERSION

# 移動
cd /usr/local/src/mysql-$MYSQL_VERSION

# ソースコード取得
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.25.tar.gz

# 解凍
tar xzf mysql-boost-$MYSQL_VERSION.tar.gz

# ビルドディレクトリ
# 8.0 からはソースディレクトリ以外でcmakeを行う
mkdir work

# 移動
cd work

# インストール
# cmakeでエラーになる場合 https://aulta.co.jp/archives/8811#cmake
# export CC=/usr/local/lib/gcc-10.1.0/bin/gcc
# export CXX=/usr/local/lib/gcc-10.1.0/bin/g++
# rm CMakeCache.txt

cmake ../mysql-$MYSQL_VERSION \
-DCMAKE_INSTALL_PREFIX=/usr/local/lib/mysql-$MYSQL_VERSION \
-DDEFAULT_CHARSET=$MYSQL_CHARACTER_SET \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=$MYSQL_COLLATION \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PIC=1 \
-DSYSCONFDIR=/usr/local/lib/mysql-$MYSQL_VERSION \
-DMYSQL_DATADIR=/usr/local/lib/mysql-$MYSQL_VERSION/data \
-DWITH_BOOST=../mysql-$MYSQL_VERSION/boost \
-DCMAKE_C_COMPILER=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/g++

make
make test
make install

# クライアントのインストール
cd client
make
make test
make install

# オーナーを変更
chown -R mysql:mysql /usr/local/lib/mysql-$MYSQL_VERSION

# ディレクトリを作成
mkdir -p $MYSQL_DATA_BASE_DIR/data
mkdir -p $MYSQL_DATA_BASE_DIR/tmp
mkdir -p $MYSQL_DATA_BASE_DIR/logs
chown -R mysql:mysql $MYSQL_DATA_BASE_DIR

# ファイルの作成
touch $MYSQL_DATA_BASE_DIR/logs/mysqld.err
chown -R mysql:mysql $MYSQL_DATA_BASE_DIR/logs/mysqld.err

# データディレクトリの初期化
# MySQL5.7.6 から変更。mysql_install_dbは廃止になった。
# 最後に root パスワードが表示されているので控えておく
# 表示されてないときはログファイルを探してみる(mysqld.errに書かれてた)
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysqld --initialize \
--user=mysql \
--basedir=/usr/local/lib/mysql-$MYSQL_VERSION \
--datadir=$MYSQL_DATA_BASE_DIR/data

# my.cnf
ls -la /usr/local/lib/mysql-$MYSQL_VERSION
# なかった cp /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf.backup
cp /root/template_my.cnf /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# 確認
cat /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# my.cnf : ポートの変更
sed -i -e "s/\[_PORT_NO_\]/$MYSQL_PORT_NO/g" /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# my.cnf : バージョンの変更
sed -i -e "s/\[_MYSQL_VERSION_\]/$MYSQL_VERSION/g" /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# my.cnf : データディレクトリの変更
sed -i -e "s@\[_MYSQL_DATA_BASE_DIR_\]@$MYSQL_DATA_BASE_DIR@g" /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# my.cnf : 文字コードの変更
sed -i -e "s/\[_CHARACTER_SET_\]/$MYSQL_CHARACTER_SET/g" /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# 手作業での調整
# collation-server       = utf8mb4_bin の# を外す
# sql_mode のパラメータたくさんのほうを有効にする
# SQL文の最大長を長くする
# default_password_lifetime のコメントを外す
# 以前までのパスワード認証にする
vi /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf

# リンク
ln -s /usr/local/lib/mysql-$MYSQL_VERSION/lib /usr/local/lib/mysql-$MYSQL_VERSION/lib64

エラー対応

次のエラーが出たとき

Could not find devtoolset compiler in /opt/rh/gcc-toolset-10

cmake に次の2行を加える

-DCMAKE_C_COMPILER=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/g++

とりあえず確認

/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -V
/usr/local/lib/mysql-8.0.25/bin/mysql  Ver 8.0.25 for Linux on x86_64 (Source distribution)

バージョンアップのとき

# 念のため元ファイルをバックアップ
cp -a $MYSQL_DATA_BASE_DIR $MYSQL_DATA_BASE_DIR-backup
# (開発用) cp -a /mnt/wd2tb/lib/mysql /mnt/wd2tb/lib/mysql-backup

# ディレクトリのリネーム (バージョン変更)
mv /usr/local/lib/mysql-8.0.[以前のバージョン] $MYSQL_DATA_BASE_DIR
# (開発用) mv /mnt/wd2tb/lib/mysql/mysql-8.0.22 /mnt/wd2tb/lib/mysql/mysql-8.0.25

# 所有者の変更
chown -R mysql:mysql $MYSQL_DATA_BASE_DIR
# (開発用) chown -R mysql:mysql /mnt/wd2tb/lib/mysql

# /etc/rc.d/init.d に追加
cp /usr/local/lib/mysql-$MYSQL_VERSION/support-files/mysql.server /etc/rc.d/init.d/mysql-$MYSQL_VERSION

# 手動起動
/etc/rc.d/init.d/mysql-$MYSQL_VERSION

バージョンアップのときはここで終了

初期設定

cp /usr/local/lib/mysql-$MYSQL_VERSION/support-files/mysql.server /etc/rc.d/init.d/mysql-$MYSQL_VERSION

自動起動設定

複数バージョンの同居前提なので、自動起動はせず必要になったときに手動起動

chkconfig --add mysql-$MYSQL_VERSION

chkconfig --list mysql-$MYSQL_VERSION

手動起動

# 起動
/etc/init.d/mysql-8.0.22 start

# 停止
/etc/init.d/mysql-8.0.22 stop

MySQLの初期設定

rootで接続

/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p

rootパスワードを変更する

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';

終了

quit;
# 'mysql'@'localhost' のパスワードが分からないので進めない
# 同じ内容を別の方法でできるので不要かな?
/usr/local/lib/mysql-8.0.22/bin/mysql_secure_installation

確認

use mysql;

delete from user where user = '';

flush privileges;

show variables like 'character_set%';

quit;

rootユーザーをリモート接続できるようにする

とはいえどこからでもじゃなく、指定したIPアドレスからだけ許可します。

/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
use mysql;

# 確認
select user,host from mysql.user;

# 登録 MySQL 8 から grant はダメ
create user 'root'@'192.168.xxx.xxx' identified by 'rootパスワード';

grant all on *.* to 'root'@'192.168.xxx.xxx' with grant option;

flush privileges;

# 確認
select user,host from mysql.user;

quit;

次の2カ所は変えてください

  • root@"192.168.xxx.xxx"
  • rootパスワード

CentOS7のファイアーウォールにmysqlのリモート接続を登録します。

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="IPアドレス" port protocol="tcp" port="ポート番号" accept"

systemctl restart firewalld.service

次の2カ所は変えてください

  • IPアドレス ・・・ 接続するPC (192.168.x.x)
  • ポート番号 ・・・ MySQLのポート番号(58022)

よく使うコマンド

MYSQL_VERSION=8.0.22
MYSQL_DATA_BASE_DIR=/usr/local/lib/mysql-8.0.22
# (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-8.0.22

# 起動
/etc/init.d/mysql-8.0.22 start

# 停止
/etc/init.d/mysql-8.0.22 stop

# 設定確認
vi /usr/local/lib/mysql-8.0.22/my.cnf

# エラーログ
tail -n 100 $MYSQL_DATA_BASE_DIR/logs/mysqld.err

# 自動起動設定
chkconfig --list mysql-8.0.22
# 終了
quit;

# パスワード変更
ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootパスワード';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';

# 文字コードの確認
show variables like 'character_set%';