MySQL8.4.5をソースインストールする / Rocky Linux9.5 on さくらのVPS

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

Rocky Linux9.5 にMySQL8.4.5をソースインストールしていってみたいと思います。

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

現時点で、MySQLの最新は 8.4.5 になっています。
8.1.0, 8.2.0, 8.3.0, 8.4.0 とリリースされています。
次は、MySQL 9 系も予定されています。

また開発案件でなく引継ぎ案件として過去のシステムの面倒を見て欲しいと依頼される場合があります。
そのときは古いバージョンのMySQLでないと困ることがあります。

ということで、複数バージョンをインストールでき、かつ、同時に稼働できる状態を作っていきたいと思います。

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

環境

実施日2025-05-03
サーバさくらのVPS 2G
OSRocky Linux9.5
cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)

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

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

MySQLをソースインストールする準備 / Rocky Linux9.4 on さくらのVPS

ファイルのURLを取得

最新バージョン
https://dev.mysql.com/downloads/mysql/

過去バージョン
https://downloads.mysql.com/archives/community/

「Product Version」「8.4.5」を選択。
「Operating System」は「Source Code」を選択。
「OS Version」は「All Operation Systems」を選択。

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

https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.5.tar.gz

※ Boost は MySQL 5.7 ~ 8.0.29 のときだけ必要です。8.0.30 以降では不要になりました。

実行ユーザーについて

MySQL 8.0 のときは気にならなかったのですが、MySQL8.4.0をソースインストールする / Rocky Linux9.4 on さくらのVPS で発覚しました。

一般ユーザーを使わずにサボって root ユーザーで作業を行っている場合はハマります。

※ make install を sudo や root で行えば、その後はどちらでも良いのですがパーミッションの関係で上記のように書いています。

本記事では他のページと同じく一般ユーザーは shinohara で記述します。
ご自身の環境に合わせて読みかえてください。

変数の設定

ここは root ユーザーで行います。

MYSQL_PORT_NO=58405
MYSQL_VERSION=8.4.5
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

ディレクトリの作成

ここは root ユーザーで行います。

ディレクトリを作成し、オーナーを一般ユーザー(shinohara)に変更します。

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

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

# パーミッションを変更
chown shinohara:shinohara /usr/local/src/mysql-$MYSQL_VERSION

ユーザー切替

ここからは一般ユーザー(shinohara)で行います。
make test までは一般ユーザーでの作業になります。

su shinohara

一般ユーザーとして改めて変数設定を行います。

MYSQL_PORT_NO=58405
MYSQL_VERSION=8.4.5
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

インストール

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

# ソースコード取得
wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.5.tar.gz

# 解凍
# 8.3 からは boost なし
tar xzf mysql-$MYSQL_VERSION.tar.gz

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

# 移動
cd work

▼前回 configure をしていたら

cd /usr/local/src/mysql-$MYSQL_VERSION/work
make clean
rm -rf CMakeCache.txt CMakeFiles

cmakeは1分ほどで終わります。

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 \
-DSYSCONFDIR=/usr/local/lib/mysql-$MYSQL_VERSION \
-DMYSQL_DATADIR=/usr/local/lib/mysql-$MYSQL_VERSION/data

廃止されたオプション

WITH_CLIENT は MySQL 5.0 〜 6.x 系で使われていた古いオプション

WITH_BOOST は MySQL 5.7 〜 8.0 系で使われていた古いオプション

DOWNLOAD_BOOST は MySQL 5.7 〜 8.0 系で使われていた古いオプション

DOWNLOAD_BOOST_TIMEOUT は MySQL 5.7 〜 8.0 系で使われていた古いオプション

WITH_PIC は MySQL 5.0 〜 現行バージョンまで使用可能だが、現在は多くの環境で自動的に有効化されるため明示指定が不要な場合が多いオプション

インストール(続き)

makeで「g++: fatal error:」がでるとき

g++: fatal error: 強制終了 signal terminated program cc1plus
compilation terminated.
make[2]: *** [sql/CMakeFiles/sql_gis.dir/build.make:146: sql/CMakeFiles/sql_gis.dir/gis/difference_functor.cc.o] エラー 1
make[1]: *** [CMakeFiles/Makefile2:49787: sql/CMakeFiles/sql_gis.dir/all] エラー 2
make: *** [Makefile:166: all] エラー 2

メモリを増やすことで解決できますが、そう簡単に増やすわけにもいかないと思います。
ここではスワップファイルを用意することで解決します。

free -h
# スワップファイルを作成
fallocate -l 4G /swapfile

# 権限を設定
chmod 600 /swapfile

# スワップファイルをスワップ領域として設定
mkswap /swapfile

# スワップファイルを有効にする
swapon /swapfile

# 有効になったことを確認
swapon --show

スワップファイルを永続化する
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

make -j$(nproc) で行ったときのメモリ消費の例

make

並列化しない場合は、約 3 時間半ほど掛かりますので、寝る前や出かける前に行うのが良いでしょう。

# CPU数で並列化して make ログ付き
make -j$(nproc) 2>&1 | tee make_parallel.log

# ▲のエラーを見る
grep -Ei "error|undefined|fail" make_parallel.log | tail -n 100
# 並列化なしで make
make

# CPU数で並列化して make
make -j$(nproc)

# CPU数を4つで並列化して make
make -j4

# 状況表示付きで make
make VERBOSE=1

※並列化が増えるとメモリ消費が増えます。

ユーザー権限を確認もしくは変更

本記事の手順で進んでいたら一般ユーザーのままですので次の make test に進んでください。

もしここまでを root ユーザーで行っていたなら一般ユーザーに切り替えます。
ここでは他のページと同じく shinohara ユーザーを例に進めますのでご注意下さい。

ls -la /usr/local/src/mysql-8.4.5
chown -R shinohara:shinohara /usr/local/src/mysql-8.4.5
su shinohara

インストール

make test

make test のエラー対応

make test のエラーを記します。
基本的にエラーになっている原因が分かって、その機能を利用するつもりがなければ対応しなくても大丈夫です。

まずは原因の詳細をしるために下記を実行します。

ctest --rerun-failed --output-on-failure

166 - routertest_harness_keyring_manager (Failed)
Value of: file_exists("/badkeyring")

キーリングの初期化に失敗しています。
ルート直下に badkeyring が存在していたら削除またはリネームします。

mv /badkeyring /badkeyring.backup

179 - routertest_harness_net_ts_internet
261 - routertest_component_http_server

ipv6 を止めていたら発生します。
もしかしたら postfix の関連で ipv6 を無効にして対処されているかもしれません。

メールサーバのPostfixをインストール / Rocky Linux9.4 on さくらのVPS

293 - routertest_component_socket_close (Failed)
301 - routertest_integration_routing_sharing (Failed)
302 - routertest_integration_routing_sharing_constrained_pools (Failed)
303 - routertest_integration_routing_sharing_restart (Failed)

ソケットのクローズとルーティングの共有に関連するテストが失敗しています。
今回これらは特に対応しないものとします。

ユーザー権限を root にする

ユーザーを root に戻す場合は exit で戻します。
そのまま一般ユーザーで続ける場合は sudo を付ける場合がありますがここでは省略します。

exit

make install はroot権限で行う必要があります。

MYSQL_PORT_NO=58400
MYSQL_VERSION=8.4.5
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
cd /usr/local/src/mysql-$MYSQL_VERSION/work

インストール

make install

クライアントのインストール

今回は、client を個別にインストールしますが、 cmake ・・・ -DWITH_CLIENT=ON で同時にインストールすることもできます。(次回用のメモ)

cd client
make
make test
make install

MySQLの設定

# オーナーを変更
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

# my.cnf
ls -la /usr/local/lib/mysql-$MYSQL_VERSION

# コピー ※my.cnf が既にあればリネームしてバックアップ
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

手作業での調整

MySQL 8.4 になると色々かわっているようです。

chmod 600 /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf
chown mysql:mysql /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf
vi /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf
# collation-server       = utf8mb4_bin の# を外す

# sql_mode のパラメータたくさんのほうを有効にする
# NO_AUTO_CREATE_USER はMySQL 8.0 から廃止のため含まれていたら除去する

# SQL文の最大長を長くする
# default_password_lifetime のコメントを外す

# 以前までのパスワード認証にする
# default_authentication_plugin = mysql_native_password
# 8.0 からは▲はエラーになり▼を指定します
# 8.4 から(?)は指定があれば
# default_authentication_plugin = caching_sha2_password
# リンク
ln -s /usr/local/lib/mysql-$MYSQL_VERSION/lib /usr/local/lib/mysql-$MYSQL_VERSION/lib64

とりあえず確認

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

MySQLの初期設定

MySQL を手動起動

初期設定のために、「直接」起動します。

/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysqld --defaults-file=/usr/local/lib/mysql-$MYSQL_VERSION/my.cnf --user=mysql &

root ユーザーのパスワードを変更

# rootユーザーで接続
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
-- rootパスワードを変更する
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'パスワード';

-- 終了
quit;

確認のため、接続しなおす

# rootユーザーで接続
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
-- 終了
quit;

データベースの初期設定

# rootユーザーで接続
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
-- 切り替える
use mysql;

-- 空のユーザーを削除する
delete from user where user = '';

-- 権限テーブルをリフレッシュ
flush privileges;

-- 文字セットの確認
show variables like 'character_set%';

-- 終了
quit;

シャットダウンユーザーの作成

# rootユーザーで接続
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
-- ユーザーを作成
CREATE USER 'shutdown'@'localhost' IDENTIFIED BY 'パスワード';

-- シャットダウン権限を付与
GRANT SHUTDOWN ON *.* TO 'shutdown'@'localhost';

-- 権限テーブルをリフレッシュ
FLUSH PRIVILEGES;

-- 終了
quit;

パスワードファイルを作成

vi /usr/local/lib/mysql-$MYSQL_VERSION/mysql-shutdown.cnf

[client]
user = shutdown
password = パスワード
socket = /usr/local/lib/mysql-8.4.5/tmp/mysql.sock

chmod 600 /usr/local/lib/mysql-$MYSQL_VERSION/mysql-shutdown.cnf
chown root:root /usr/local/lib/mysql-$MYSQL_VERSION/mysql-shutdown.cnf

MySQLを手動終了

初期設定のために手動起動していたので、手動終了します。

/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql \
  --defaults-extra-file=/usr/local/lib/mysql-$MYSQL_VERSION/mysql-shutdown.cnf \
  -e "SHUTDOWN;"

バージョンアップのとき

# 念のため元ファイルをバックアップ
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.3.0

# 所有者の変更
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

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

systemdサービスを設定

mysql.serverスクリプトを使用してsystemdサービスを設定します。

/support-files/mysql.server を使う方法では、任意の my.cnf を指定できませんので、 mysqld を指定する形とします。

vi /etc/systemd/system/mysql-$MYSQL_VERSION.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/lib/mysql-MYSQL_VERSION/bin/mysqld --defaults-file=/usr/local/lib/mysql-MYSQL_VERSION/my.cnf --user=mysql
ExecStop=/usr/local/lib/mysql-MYSQL_VERSION/bin/mysql \
  --no-defaults \
  --defaults-extra-file=/usr/local/lib/mysql-MYSQL_VERSION/mysql-shutdown.cnf \
  -e "SHUTDOWN;"
ExecReload=/bin/true
PIDFile=/usr/local/lib/mysql-MYSQL_VERSION/logs/mysqld.pid
TimeoutSec=600
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_ID=1
PrivateTmp=false

[Install]
WantedBy=multi-user.target
sed -i -e "s/MYSQL_VERSION/$MYSQL_VERSION/g" /etc/systemd/system/mysql-$MYSQL_VERSION.service
cat /etc/systemd/system/mysql-$MYSQL_VERSION.service
systemctl daemon-reload
ln -s /etc/systemd/system/mysql-8.4.5.service /etc/systemd/system/multi-user.target.wants/mysql-8.4.5.service
systemctl start mysql-8.4.5.service

startで返ってこないときは、下記でログを確認します。
status にも原因のヒントが出ている場合があります。

tail -n 20 /usr/local/lib/mysql-8.4.5/logs/mysqld.err
systemctl status mysql-8.4.5.service
status が返って来ないとき

ポート 33060 を開ける必要があるかも
X plugin を停止
# 8.0.0 以降 MySQL X Plugin を停止
mysqlx = 0

メモリが足りていない場合も
free -h
my.cnf
innodb_buffer_pool_size = 256M
journalctl -xeu mysql-8.4.5.service --since "5 minutes ago"

2024-05-15 status したときコマンドが返って来ない問題は残っているのですがこのまま進めます。

自動起動設定

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

systemctl enable mysql-8.4.5.service
Failed to execute /usr/lib/systemd/systemd-sysv-install: そのようなファイルやディレクトリはありません

こちらのようなエラーが出るかもしれませんが一旦無視します。
念のため、確認として再起動してみます。

reboot

再起動直後(何もしていない段階)に起動していればOKとしましょう。

systemctl status mysql-8.4.5.service

起動

systemctl start mysql-8.4.5.service

停止

systemctl stop mysql-8.4.5.service

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

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