CentOS Stream 8 にMySQL8.4.5をソースインストールする
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
【注意】
本記事は、CentOS Stream 8 というサポート期限が切れた古いOSに、最新の MySQL をインストールしていきます
そのため、サポート期限内のOSにインストールする手順と異なる場面があります。
正規手順を探している場合は下記(Rocky Linux9.5版)をご覧ください
MySQL8.4.5をソースインストールする / Rocky Linux9.5 on さくらのVPS
それでは、CentOS Stream 8 にMySQL 8.4.5をソースインストールしていきます。
今回のこだわりポイントは「複数バージョンの同居」です。
まずは第1弾として、MySQL5.5.62をインストールしました。
次に第2弾として、MySQL5.6.51をインストールしました。
次に第3弾として、MySQL5.7.34をインストールしました。
次に第4弾として、MySQL8.0.25をインストールしました。
続きまして次はMySQL8.4.5の番です。
現時点で、MySQLの最新は 8.4.5 になっています。
8.1.0, 8.2.0, 8.3.0, 8.4.5 とリリースされています。
次は、MySQL 9 系も予定されています。
また開発案件でなく引継ぎ案件として過去のシステムの面倒を見て欲しいと依頼される場合があります。
そのときは古いバージョンのMySQLでないと困ることがあります。
ということで、複数バージョンをインストールでき、かつ、同時に稼働できる状態を作っていきたいと思います。
なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。
環境
実施日 | 2025-05-02 |
サーバ | さくらのVPS 2G
![]() |
OS | CentOS Stream 8 |
cat /etc/redhat-release
bash
CentOS Stream release 8
MySQLをインストールする準備
事前準備がまだの場合は先に▼をご覧ください。
こちらが済んだ前提で進めていきます。
CentOS Stream 8 にMySQLをソースインストールする準備
MySQL8.4.5 には gcc 12 が必要です。
gcc-12.4.0をCentOS Stream 8にソースインストールbinutils-2.44 も必要です。
こちらファイルの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 で発覚しました。
一般ユーザーを使わずにサボって root ユーザーで作業を行っている場合はハマります。
結論としては、 make test までは一般ユーザーで行い、 make install からは 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
bash
# (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-$MYSQL_VERSION
bash
ディレクトリの作成
ここは root ユーザーで行います。
ディレクトリを作成し、オーナーを一般ユーザー(shinohara)に変更します。
# 確認 ls -la /usr/local/src # インストールディレクトリ作成 mkdir -p /usr/local/src/mysql-$MYSQL_VERSION # パーミッションを変更 chown shinohara:shinohara /usr/local/src/mysql-$MYSQL_VERSION
bash
mkdir -p /usr/local/lib/mysql-$MYSQL_VERSION/data chown -R mysql:mysql /usr/local/lib/mysql-$MYSQL_VERSION
bash
ユーザー切替
ここからは一般ユーザー(shinohara)で行います。
make test までは一般ユーザーでの作業になります。
su shinohara
bash
一般ユーザーとして改めて変数設定を行います。
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
bash
# (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-$MYSQL_VERSION
bash
インストール
# 移動 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
bash
▼前回 configure をしていたら
cd /usr/local/src/mysql-$MYSQL_VERSION/work make clean rm -rf CMakeCache.txt CMakeFiles
bash
cmakeは1分ほどで終わります。
export PATH=/usr/local/lib/gcc-12.4.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/lib/gcc-12.4.0/lib64:$LD_LIBRARY_PATH g++ -v
bash
export PATH=/usr/local/lib/binutils-2.44/bin:$PATH export LD_LIBRARY_PATH=/usr/local/lib/binutils-2.44/lib:$LD_LIBRARY_PATH ld --version
bash
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 \ -DCMAKE_C_COMPILER=/usr/local/lib/gcc-12.4.0/bin/gcc \ -DCMAKE_CXX_COMPILER=/usr/local/lib/gcc-12.4.0/bin/g++ \ -DCMAKE_C_FLAGS="-I/usr/include" \ -DCMAKE_CXX_FLAGS="-I/usr/include" \ -DWITH_ROUTER=OFF \ -DWITH_BUILD_ID=OFF
bash
廃止されたオプション
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
これはメモリ不足で g++ が強制終了されたようです。
メモリを増やすことで解決できますが、そう簡単に増やすわけにもいかないと思います。
ここではスワップファイルを用意することで解決します。
free -h
bash
# スワップファイルを作成 fallocate -l 2G /swapfile # 権限を設定 chmod 600 /swapfile # スワップファイルをスワップ領域として設定 mkswap /swapfile # スワップファイルを有効にする swapon /swapfile # 有効になったことを確認 swapon --show スワップファイルを永続化する echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
bash
make -j$(nproc) で行ったときのメモリ消費の例


並列化しない場合は、約 3 時間半ほど掛かりますので、寝る前や出かける前に行うのが良いでしょう。
# 並列化なしで make make # CPU数で並列化して make make -j$(nproc) # CPU数で並列化して make ログ付き make -j$(nproc) 2>&1 | tee make_parallel.log # ▲のエラーを見る grep -Ei "error|undefined|fail" make_parallel.log | tail -n 100 # CPU数を4つで並列化して make make -j4 # 状況表示付きで make make VERBOSE=1
bash
※並列化が増えるとメモリ消費が増えます。
ユーザー権限を確認もしくは変更
本記事の手順で進んでいたら一般ユーザーのままですので次の 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
bash
インストール
make test
bash
make test のエラー対応
make test のエラーを記します。
基本的にエラーになっている原因が分かって、その機能を利用するつもりがなければ対応しなくても大丈夫です。
まずは原因の詳細をしるために下記を実行します。
ctest --rerun-failed --output-on-failure
bash
166 - routertest_harness_keyring_manager (Failed)
Value of: file_exists("/badkeyring")
キーリングの初期化に失敗しています。
ルート直下に badkeyring が存在していたら削除またはリネームします。
mv /badkeyring /badkeyring.backup
bash
179 - routertest_harness_net_ts_internet
261 - routertest_component_http_server
ipv6 を止めていたら発生します。
もしかしたら postfix の関連で ipv6 を無効にして対処されているかもしれません。
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
bash
make install は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
bash
# (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-$MYSQL_VERSION
bash
cd /usr/local/src/mysql-$MYSQL_VERSION/work
bash
インストール
make install
bash
クライアントのインストール
クライアントをインストールします
cd client make make test make install
bash
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
bash
libstdc++ のパスをセット
export LD_LIBRARY_PATH=/usr/local/lib/gcc-12.4.0/lib64:$LD_LIBRARY_PATH
bash
データディレクトリの初期化
MySQL5.7.6 から変更。mysql_install_dbは廃止になった。
最後に root パスワードが表示されているので控えておく
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysqld --initialize \ --user=mysql \ --basedir=/usr/local/lib/mysql-$MYSQL_VERSION \ --datadir=$MYSQL_DATA_BASE_DIR/data
bash

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
bash
手作業での調整
MySQL 8.4 になると色々かわっているようです。
vi /usr/local/lib/mysql-$MYSQL_VERSION/my.cnf
bash
# collation-server = utf8mb4_bin の# を外す # sql_mode のパラメータたくさんのほうを有効にする # NO_AUTO_CREATE_USER はMySQL 8.0 から廃止のため含まれていたら除去する # SQL文の最大長を長くする max_allowed_packet = 16MB # default_password_lifetime のコメントを外す # 以前までのパスワード認証にする # default_authentication_plugin = mysql_native_password # 8.0 からは▲はエラーになり▼を指定します # 8.4 から(?)は指定があれば / 8.4.5 ではこれもダメ # default_authentication_plugin = caching_sha2_password
bash
# リンク ln -s /usr/local/lib/mysql-$MYSQL_VERSION/lib /usr/local/lib/mysql-$MYSQL_VERSION/lib64
bash
とりあえず確認
/usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -V
bash
/usr/local/lib/mysql-8.4.5/bin/mysql Ver 8.4.5 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.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
bash
バージョンアップのときはここで終了
ラッパースクリプト
gcc-12.4.0 を強制するためラッパースクリプトを用意します。
vi /tmp/generate_mysql_8.4.5_wrappers.sh
bash
#!/bin/bash
# ===== 設定 =====
MYSQL_VERSION=8.4.5
MYSQL_BASE=/usr/local/lib/mysql-$MYSQL_VERSION/bin
WRAPPER_DIR=/usr/local/bin
GCC_LIB_PATH=/usr/local/lib/gcc-12.4.0/lib64
# ===== 対象コマンド一覧 =====
MYSQL_COMMANDS=(
mysql
mysqld
mysqladmin
mysqldump
mysqlbinlog
mysqlshow
mysqlcheck
)
# ===== ラッパースクリプトの生成 =====
for cmd in "${MYSQL_COMMANDS[@]}"; do
wrapper_path="$WRAPPER_DIR/mysql_${MYSQL_VERSION}_${cmd}"
cat > "$wrapper_path" <<EOF
#!/bin/bash
export LD_LIBRARY_PATH=$GCC_LIB_PATH
exec $MYSQL_BASE/$cmd "\$@"
EOF
chmod +x "$wrapper_path"
echo "✅ 作成完了: $wrapper_path"
done
chmod +x /tmp/generate_mysql_8.4.5_wrappers.sh
bash
/tmp/generate_mysql_8.4.5_wrappers.sh
bash
rm /tmp/generate_mysql_8.4.5_wrappers.sh
bash
SysVinit スクリプトの作成
/etc/init.d/mysql-8.4.5 start
このような形で起動できるようにするスクリプトを作成します。
SysVinit スクリプトの作成
vi /etc/init.d/mysql-8.4.5
bash
先頭に下記を追加する
#!/bin/bash export LD_LIBRARY_PATH=/usr/local/lib/gcc-12.4.0/lib64:$LD_LIBRARY_PATH
bash
起動・停止コマンド
古いタイプの場合
/etc/init.d/mysql-8.4.5 start /etc/init.d/mysql-8.4.5 stop /etc/init.d/mysql-8.4.5 status
bash
サービスに登録
cp /usr/local/lib/mysql-$MYSQL_VERSION/support-files/mysql.server /etc/rc.d/init.d/mysql-$MYSQL_VERSION
bash
service mysql-8.4.5 status
bash
service mysql-8.4.5 start
bash
service mysql-8.4.5 stop
bash
service mysql-8.4.5 restart
bash
systemdサービスを設定
mysql.serverスクリプトを使用してsystemdサービスを設定します。
vi /etc/systemd/system/mysql-$MYSQL_VERSION.service
bash
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/lib/mysql-MYSQL_VERSION/support-files/mysql.server start
ExecStop=/usr/local/lib/mysql-MYSQL_VERSION/support-files/mysql.server stop
ExecReload=/usr/local/lib/mysql-MYSQL_VERSION/support-files/mysql.server restart
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
bash
cat /etc/systemd/system/mysql-$MYSQL_VERSION.service
bash
systemctl daemon-reload
bash
ln -s /etc/systemd/system/mysql-8.4.5.service /etc/systemd/system/multi-user.target.wants/mysql-8.4.5.service
bash
systemctl start mysql-8.4.5.service
bash
startで返ってこないときは、下記でログを確認します。
status にも原因のヒントが出ている場合があります。
tail -n 20 /usr/local/lib/mysql-8.4.5/logs/mysqld.err
bash
systemctl status mysql-8.4.5.service
bash
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"
bash
2024-05-15 status したときコマンドが返って来ない問題は残っているのですがこのまま進めます。
自動起動設定
複数バージョンの同居前提なので、自動起動はせず必要になったときに手動起動
systemctl enable mysql-8.4.5.service
bash
Failed to execute /usr/lib/systemd/systemd-sysv-install: そのようなファイルやディレクトリはありません
こちらのようなエラーが出るかもしれませんが一旦無視します。
念のため、確認として再起動してみます。
reboot
bash
再起動直後(何もしていない段階)に起動していればOKとしましょう。
systemctl status mysql-8.4.5.service
bash
起動
systemctl start mysql-8.4.5.service
bash
停止
systemctl stop mysql-8.4.5.service
bash
MySQLの初期設定
rootで接続
mysql_8.4.5_mysql -u root -p /usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
bash
rootパスワードを変更する
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'パスワード';
sql
終了
quit;
sql
# 'mysql'@'localhost' のパスワードが分からないので進めない # 同じ内容を別の方法でできるので不要かな? /usr/local/lib/mysql-8.4.5/bin/mysql_secure_installation
bash
確認
use mysql; delete from user where user = ''; flush privileges; show variables like 'character_set%'; quit;
sql
rootユーザーをリモート接続できるようにする
とはいえどこからでもじゃなく、指定したIPアドレスからだけ許可します。
mysql_8.4.5_mysql -u root -p /usr/local/lib/mysql-$MYSQL_VERSION/bin/mysql -u root -p
bash
use mysql; # 確認 SELECT user, host, plugin FROM mysql.user; # 登録 MySQL 8 から grant はダメ CREATE USER 'root'@'192.168.xxx.xxx' IDENTIFIED BY 'rootパスワード'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.xxx.xxx' WITH GRANT OPTION; FLUSH PRIVILEGES; # 確認 SELECT user, host, plugin FROM mysql.user; quit;
sql
# パスワードエラーでログインできないときは方式を変えてみる ALTER USER 'root'@'192.168.xxx.xxx' IDENTIFIED WITH caching_sha2_password BY '同じパスワード'; FLUSH PRIVILEGES;
sql
次の2カ所は変えてください
- root@"192.168.xxx.xxx"
- rootパスワード
CentOS7 / CentOS Stream 8 のファイアーウォールにmysqlのリモート接続を登録します。
firewall-cmd --list-all
bash
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="IPアドレス" port protocol="tcp" port="ポート番号" accept" systemctl restart firewalld.service
bash
次の2カ所は変えてください
- IPアドレス ・・・ 接続するPC (192.168.x.x)
- ポート番号 ・・・ MySQLのポート番号(58022)
よく使うコマンド
MYSQL_VERSION=8.4.5 MYSQL_DATA_BASE_DIR=/usr/local/lib/mysql-8.4.5 # (開発用) MYSQL_DATA_BASE_DIR=/mnt/wd2tb/lib/mysql/mysql-8.4.5 # 起動 /etc/init.d/mysql-8.4.5 start # 停止 /etc/init.d/mysql-8.4.5 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
bash
# 終了 quit; # パスワード変更 ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootパスワード'; ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'パスワード'; # 文字コードの確認 show variables like 'character_set%';
sql