GA

2025/12/21

MySQL RouterのRead-Write Splitting…の前に、前提条件になっているConnection Sharingについて見てみたらMySQL Proxyのことを思い出した

この記事は MySQL - Qiita Advent Calendar 2025 の21日目の記事です。

昨日は @meijik さんの MedianやPercentile_%が欲しい連合会(Firebird/MySQL) でした。


ふと MySQL RouterのRead-Write Splittingの設定 を見ていたら、前提条件として connection_sharing: must be set to 1. と書いてあって、俺が使っていた8.0の頃のRouterと比べて増えたなあと思って調べてみた。

MySQL :: MySQL Router 8.4 :: 3.4 Connection Sharing and Reuse

MySQL Router enables server connections to be pooled and shared

ってことなので、MySQLとMySQL Routerの間のコネクションを、MySQL Routerとアプリケーションの間で使い回させられるような感じになるはず。

折角なので(?) 最新のMySQL Router(Innovation Release)にしてみる(8.4でもできたんだけどなんか勘違いして最新版を入れてしまったのでそれでやる)

$ sudo dnf install mysql-router --disablerepo="*" --enablerepo="mysql-tools-innovation*"
..
=======================================================================================================================================
 Package                             Architecture        Version                   Repository                                     Size
=======================================================================================================================================
Upgrading:
 mysql-router-community              x86_64              9.5.0-1.el8               mysql-tools-innovation-community               61 M
..

mysqlrouter.conf を昔取った杵柄でテキトーにいじってみる。

$ sudo vim /etc/mysqlrouter/mysqlrouter.conf
..
[connection_pool]
idle_timeout= 3600
max_idle_server_connections= 10

[routing:test_connection_sharing]
bind_address= 127.0.0.1
bind_port= 49825
destinations= 127.0.0.1:64080
routing_strategy= first-available
connection_sharing= 1
client_ssl_mode = disabled

$ sudo systemctl start mysqlrouter

$ sudo less /var/log/mysqlrouter/mysqlrouter.log
2025-12-21 13:25:24 main SYSTEM [7f938e74b580] Starting 'MySQL Router', version: 9.5.0 (MySQL Community - GPL)
2025-12-21 13:25:24 io INFO [7f938e74b580] starting 8 io-threads, using backend 'linux_epoll'
2025-12-21 13:25:24 keepalive INFO [7f93817fa700] keepalive started with interval 60
2025-12-21 13:25:24 keepalive INFO [7f93817fa700] keepalive
2025-12-21 13:25:24 routing INFO [7f9380ff9700] [routing:test_connection_sharing] started: routing strategy = first-available
2025-12-21 13:25:24 routing INFO [7f9380ff9700] Start accepting connections for routing routing:test_connection_sharing listening on '127.0.0.1:49825'

max_idle_server_connectionsidle_timeout[connection_pool] セクションなので [routing:*] セクションに書いても読んでくれない。

ともあれこれで

$ mysql -h127.0.0.1 -P49825 -uyoku0825 -sse "SELECT CONNECTION_ID()"
35467

$ mysql -h127.0.0.1 -P49825 -uyoku0825 -sse "SELECT CONNECTION_ID()"
35467

$ mysql -h127.0.0.1 -P49825 -uyoku0825 -sse "SELECT CONNECTION_ID()"
35467> 

$ mysql -h127.0.0.1 -P49825 -uyoku0825 -sse "SELECT CONNECTION_ID()"
35467

うん、クライアントを切断しても CONNECTION_ID() の結果が変わらないのでプーリング(シェアリング)できてるっぽい。

で、ここからが本題。

3.4 Connection Sharing and Reuse を読むと、

Unsupported SQL Features
The following statements and functions are not supported when connection sharing is active, except inside a transaction.
..

  • LAST_INSERT_ID()

と、コネクションシェアリングでは使えないらしい関数が示されている。

$ mysql -h127.0.0.1 -P49825 -uyoku0825

mysql> SELECT LAST_INSERT_ID();
ERROR 3566 (HY000): Access to native function is rejected when connection sharing is enabled

確かにエラーになる。

$ ./runtime_output_directory/perror 3566
MySQL error code MY-003566 (ER_NO_ACCESS_TO_NATIVE_FCT): Access to native function '%.64s' is rejected.

MySQLサーバー側のperrorでもちゃんと返ってきたけれど、なんかよく見るとエラーメッセージがしっくり来ていない ( %.64sis rejectedshwn connection sharing is enabled が綺麗に対応していない )

あと、 performance_schema.events_errors_summary_global_by_error に記録されてないのでこれはMySQLサーバから来てるんじゃなくてMySQL Routerがエラーパケット作ってるっぽい。

mysql80 35513> SELECT * FROM events_errors_summary_global_by_error WHERE error_number = 3566;
+--------------+----------------------------+-----------+------------------+-------------------+------------+-----------+
| ERROR_NUMBER | ERROR_NAME                 | SQL_STATE | SUM_ERROR_RAISED | SUM_ERROR_HANDLED | FIRST_SEEN | LAST_SEEN |
+--------------+----------------------------+-----------+------------------+-------------------+------------+-----------+
|         3566 | ER_NO_ACCESS_TO_NATIVE_FCT | HY000     |                0 |                 0 | NULL       | NULL      |
+--------------+----------------------------+-----------+------------------+-------------------+------------+-----------+
1 row in set (0.00 sec)

さて。

こんなこと ( = MySQL Routerが中を通るSQLに応じて勝手にエラーパケットを返す ) ができるということは、つまりMySQL Routerは 流れてくるSQLをパースしているわけで 、そうすると Limitations に書かれている Connection sharing is not supported in PASSTHROUGH mode or if server-ssl-mode=AS_CLIENT and client-ssl-mode=PREFERRED. も、mysqlrouterが終端しない形でSSL/TLSを使ってしまうと流れてくるSQLが読めなくなるからなわけであって、てことはコネクションシェアリングを前提にしているRead-Write SplittingというのはMySQL RouterがSQLをパースしてソースに投げるかレプリカに投げるのかを打ち分けているということで…。

MySQL Proxyの rw-splitting.lua とか思い出して見てみたら、弾いてる関数とかが似ていて、繰り返す歴史を感じたという感じでした。

明日は @tmtms さんです!

2025/12/15

最近のmysqlコマンドラインクライアントの変更を見てみる

この記事は MySQL - Qiita Advent Calendar 2025 の15日目の記事です。

昨日は @meijik さんの 君はMySQL RP を知っているか?! でした。


ここ最近(?) 小さな mysqlコマンドラインクライアント への変更が入っているのでそれを紹介します。

MySQLサーバー ( mysqld ) の機能ではないので、接続先のバージョンがいくつであっても変わりません。クライアントのバージョン依存です。

コメントが勝手に消えなくなった

実は mysql コマンドラインクライアントには「SQLの中のコメントを消してからMySQLサーバに送信する」機能がありました。バージョン指定のためのコメントやオプティマイザヒントは消さないようになっています。純粋なコメントです。

以下は各バージョンの mysql から MySQL 8.4.7のサーバに対して SELECT 'Hello' /* ,World/;' を送信しようとしているところです( <<< で標準入力に入るので、 echo .. | mysql .. と同じ実行の仕方です)


$ /usr/mysql/5.7.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SELECT 'Hello' /* ,World */;"

Hello

Hello

$ /usr/mysql/8.0.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SELECT 'Hello' /* ,World */;"

Hello

Hello

$ /usr/mysql/8.4.7/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SELECT 'Hello' /* ,World */;"

Hello

Hello

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SELECT 'Hello' /* ,World */;"

Hello

Hello

ジェネラルログを確認するとこんな感じになります。


2025-12-15T09:04:30.826100-00:00           17 Connect   root@localhost on  using Socket

2025-12-15T09:04:30.829805-00:00           17 Query     select @@version_comment limit 1

2025-12-15T09:04:30.834689-00:00           17 Query     SELECT 'Hello'

2025-12-15T09:04:30.834788-00:00           17 Quit

2025-12-15T09:04:33.468778-00:00           18 Connect   root@localhost on  using Socket

2025-12-15T09:04:33.472739-00:00           18 Query     select @@version_comment limit 1

2025-12-15T09:04:33.478144-00:00           18 Query     SELECT 'Hello'

2025-12-15T09:04:33.478406-00:00           18 Quit

2025-12-15T09:04:36.309772-00:00           19 Connect   root@localhost on  using Socket

2025-12-15T09:04:36.312713-00:00           19 Query     select @@version_comment limit 1

2025-12-15T09:04:36.319830-00:00           19 Query     SELECT 'Hello' /* ,World */

2025-12-15T09:04:36.321674-00:00           19 Quit

2025-12-15T09:04:38.924431-00:00           20 Connect   root@localhost on  using Socket

2025-12-15T09:04:38.928317-00:00           20 Query     select @@version_comment limit 1

2025-12-15T09:04:38.935416-00:00           20 Query     SELECT 'Hello' /* ,World */

2025-12-15T09:04:38.935519-00:00           20 Quit

上から5.7, 8.0, 8.4, 9.5なので8.4の時点で勝手にコメントをストリップしなくなりました。

昔からずっと —comments というオプションで制御できたんですが、8.0とそれ以前はこれのデフォルトがOFF, 8.4とそれ以降はONに変わったという感じです。

/* .. */ で実験していますが、 --# も消えます。お試しあれ(?)
以前の動作に戻すなら --skip-comments です。

デフォルトでは \G で縦表示できなくなった

SHOW ENGINE INNODB STATUS\GSHOW REPLICA STATUS\G はよく縦表示に用いるんじゃないかと思いますが、この \Gmysql コマンドラインクライアントの独自記法で、その他のクライアントやアプリケーションから使うときに \G とかつけるとシンタックスエラーになります。

-e や標準入力からSQLを受け取った時の mysql コマンドラインクライアントは今までこの \G をデフォルト(あるいは設定不能)で常に解釈していたのが、9.x のどこかで解釈しない方がデフォルトになりました。

$ /usr/mysql/5.7.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SHOW ENGINE INNODB STATUS\G" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/8.0.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SHOW ENGINE INNODB STATUS\G" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/8.4.7/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SHOW ENGINE INNODB STATUS\G" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "SHOW ENGINE INNODB STATUS\G" | head -2
ERROR at line 1: Unknown command '\G'.

↑9.5のクライアントだけエラーになっています。

なおこれは非対話モードにだけ効く変更なので、対話モードの動作には変わりありません。9.5のクライアントで同じオプションでも、対話モードなら↓のように表示ができます。

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 8.4.7 Source distribution

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW ENGINE INNODB STATUS\G
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2025-12-15 09:21:22 139964134168320 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 12 seconds

..

ちなみに俺は昔から -E を使うのに慣れているのであまりこの変更の影響を受けません。

-E は引数を取らない、 psqlで言うところの -x みたいに振る舞うオプションです。 -e とセットで使う時に -eE と書くとエラーになります( -e の引数が 'E' という扱いになってしまう) -Ee で並べる(もしくは -E -e と離したり別のオプションを挟んでみたりする)必要があります。

$ /usr/mysql/5.7.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock -E <<< "SHOW ENGINE INNODB STATUS" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/8.0.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock -E <<< "SHOW ENGINE INNODB STATUS" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/8.4.7/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock -E <<< "SHOW ENGINE INNODB STATUS" | head -2
*************************** 1. row ***************************
  Type: InnoDB

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock -E <<< "SHOW ENGINE INNODB STATUS" | head -2
*************************** 1. row ***************************
  Type: InnoDB

-E はずっと昔からあるのでこれを使っていると9.xでの変更に気が付かない可能性があります。なお、以前と同じ動作にするには —commands です。

この動作変更は非互換としてバグ報告されており、デフォルトをもとに戻してほしい場合はこのバグレポートで応援することができます。

MySQL Bugs: #118819: Vertical (\G) doesn't work in MySQL 9.4.0


$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock --commands <<< "SHOW ENGINE INNODB STATUS\G" | head -2
*************************** 1. row ***************************
  Type: InnoDB

8.4の地味なバグの修正

少なくともMySQL 8.4.7の mysql コマンドラインクライアントにある地味なバグが直っています。非対話モードで use にセミコロンを1個余計につけるとエラーになります。

$ /usr/mysql/5.7.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "use d1;;"

$ /usr/mysql/8.0.44/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "use d1;;"

$ /usr/mysql/8.4.7/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "use d1;;"
ERROR at line 1: USE must be followed by a database name

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock <<< "use d1;;"

対話モードでも、他のバージョンとはエラーが違います。
8.4以外のバージョンでは↓のように

$ /usr/mysql/9.5.0/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock

mysql> use d1;;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
ERROR:
No query specified

use d1; が解釈された後に本文なしの ; が来たと解釈して、Database changed の後に No query specified のエラーになります(エラーエラー言ってますが、これはサーバーサイドエラーではなく mysqlコマンドラインクライアント内で独自にエラー です)

8.4のコマンドラインクライアントでは

$ /usr/mysql/8.4.7/bin/mysql --no-defaults -uroot -S /usr/mysql/8.4.7/data/mysql.sock

mysql> use d1;;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
ERROR:
USE must be followed by a database name

エラーが USE must be followed by a database name に変わってました。 use d1; を解釈した後に use ; と解釈しなおしたような気配がします。

これはこの記事を書くために git log を眺めていて気が付いただけです。バグなのでそのうち直ると思いますし直らなくても特に困る人はいなさそう。。

History for client/mysql.cc - mysql/mysql-server · GitHub

明日は @wsigma21 さんです!

2025/12/07

今年もConoHaのVPSでMySQLをビルドする 2025年

この記事は ConoHa - Qiita Advent Calendar 2025 の7番目の窓です。

昨日は 8mitsu さんの ConoHaをMCPで操作してみた でした。

この記事は MySQL - Qiita Advent Calendar 2025 の7番目の窓でもあります。

こちらは昨日は @taka_yuki_04 さんの MySQL キーリングプラグインからコンポーネントへの移行 でした。


今年はビルドのために 6コア6GBのOracle Linux 10を起動しました。去年までは1コア2GBで頑張っていましたがそれで最近のMySQLをビルドしていると一晩かかるのでもうつらい。


OSはOracle Linuxの10にしてみた。


$ cat /etc/os-release

NAME="Oracle Linux Server"

VERSION="10.1"

ID="ol"

ID_LIKE="fedora"

VARIANT="Server"

VARIANT_ID="server"

VERSION_ID="10.1"

PLATFORM_ID="platform:el10"

PRETTY_NAME="Oracle Linux Server 10.1"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:oracle:linux:10:1:server"

HOME_URL="https://linux.oracle.com/"

BUG_REPORT_URL="https://github.com/oracle/oracle-linux"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 10"

ORACLE_BUGZILLA_PRODUCT_VERSION=10.1

ORACLE_SUPPORT_PRODUCT="Oracle Linux"

ORACLE_SUPPORT_PRODUCT_VERSION=10.1

まずは来年、2026年4月にEOLになるMySQL 8.0シリーズの最新版、8.0.44。


$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.44.tar.gz

$ tar xf mysql-boost-8.0.44.tar.gz
$ cmake .
-bash: cmake: command not found

$ sudo dnf install -y cmake

$ cmake .
-- Running cmake version 3.30.5
-- Could NOT find Git (missing: GIT_EXECUTABLE)
Hint: The project() command has not yet been called.  It sets up system-specific search paths.
-- This is .el10. as found from 'rpm -qf /'
-- CMAKE_MODULE_PATH is /home/yoku0825/mysql-8.0.44/cmake
-- MySQL 8.0.44
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:585 (PROJECT):
  No CMAKE_C_COMPILER could be found.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.

CMake Error at CMakeLists.txt:585 (PROJECT):
  No CMAKE_CXX_COMPILER could be found.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.

-- Configuring incomplete, errors occurred!

コンパイラがないので入れる。去年(Rocky Linux 9.4)の時は「このgcc-toolsetを入れろ」って書いてあったけど10系だからかそんなに親切ではない感じ。

$ sudo dnf install -y gcc gcc-c++

$ cmake .
..
-- Binary directory /home/yoku0825/mysql-8.0.44
CMake Error at CMakeLists.txt:639 (MESSAGE):
  Please do not build in-source.  Out-of source builds are highly
  recommended: you can have multiple builds for the same source, and there is
  an easy way to do cleanup, simply remove the build directory (note that
  'make clean' or 'make distclean' does *not* work)

  You *can* force in-source build by invoking cmake with
  -DFORCE_INSOURCE_BUILD=1

-- Configuring incomplete, errors occurred!

忘れてた。インソースビルドでいいので足す。あとBoost同梱版なのでそれも足す。さらについでにインストール先の指定もくっつける。

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.0.44 -DFORCE_INSOURCE_BUILD=1 -DWITH_BOOST=./boost .
..
-- ZSTD_LEGACY_SUPPORT not defined!
--
Not a supported openssl version in WITH_SSL=system.
Make sure you have specified a supported SSL version.
Valid options are :
openssl[0-9]+ (use alternative system library)
yes (synonym for system)
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:84 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:406 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:1848 (MYSQL_CHECK_SSL)

-- Configuring incomplete, errors occurred!

openssl-develが必要、はい。

$ sudo dnf install -y openssl-devel

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.0.44 -DFORCE_INSOURCE_BUILD=1 -DWITH_BOOST=./boost .

..
-- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:93 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:127 (FIND_CURSES)
  cmake/readline.cmake:221 (MYSQL_USE_BUNDLED_EDITLINE)
  CMakeLists.txt:1952 (MYSQL_CHECK_EDITLINE)

-- Configuring incomplete, errors occurred!

ncurses-develも必要。で入れたらCMakeCache.txtを消せと(なんでこのパッケージだけ消さないとダメなのか俺はよくわかっていない…)

$ sudo dnf install -y ncurses-devel
$ rm CMakeCache.txt
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.0.44 -DFORCE_INSOURCE_BUILD=1 -DWITH_BOOST=./boost .
..
-- Checking for module 'libtirpc'
--   Package 'libtirpc', required by 'virtual:world', not found
CMake Warning at cmake/rpc.cmake:41 (MESSAGE):
  Cannot find RPC development libraries.  You need to install the required
  packages:

    Debian/Ubuntu:              apt install libtirpc-dev
    RedHat/Fedora/Oracle Linux: yum install libtirpc-devel
    SuSE:                       zypper install glibc-devel

Call Stack (most recent call first):
  cmake/rpc.cmake:112 (WARN_MISSING_SYSTEM_TIRPC)
  CMakeLists.txt:2088 (MYSQL_CHECK_RPC)

CMake Error at cmake/rpc.cmake:113 (MESSAGE):
  Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc
Call Stack (most recent call first):
  CMakeLists.txt:2088 (MYSQL_CHECK_RPC)

-- Configuring incomplete, errors occurred!

毎年リポジトリがよくわからなくなるtirpc-devel 。Oracle Linux 10では ol10_codeready_builder らしい。

$ sudo dnf install libtirpc-devel

Last metadata expiration check: 0:23:40 ago on Sat 06 Dec 2025 06:44:15 PM JST.
No match for argument: libtirpc-devel
Error: Unable to find a match: libtirpc-devel

$ sudo dnf install -y --enablerepo="*" libtirpc-devel
..
=======================================================================================================================================
 Package                         Architecture            Version                         Repository                               Size
=======================================================================================================================================
Installing:
 libtirpc-devel                  x86_64                  1.3.5-1.el10                    ol10_codeready_builder                  187 k
..

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.0.44 -DFORCE_INSOURCE_BUILD=1 -DWITH_BOOST=./boost .
..

-- Performing Test X_PUTLONG_NOT_USE_CONST - Failed
CMake Warning at cmake/rpc.cmake:30 (MESSAGE):
  Cannot find rpcgen executable.  You need to install the required packages:

    Debian/Ubuntu:              apt install rpcsvc-proto
    RedHat/Fedora/Oracle Linux: yum install rpcgen
    SuSE:                       zypper install glibc-devel

Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/cmake/rpcgen.cmake:113 (WARN_MISSING_RPCGEN_EXECUTABLE)
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:51 (INCLUDE)

CMake Error at plugin/group_replication/libmysqlgcs/cmake/rpcgen.cmake:114 (MESSAGE):
  Could not find rpcgen
Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:51 (INCLUDE)

-- Configuring incomplete, errors occurred!

また毎年リポジトリのはぐれるrpcgen

$ sudo dnf install -y --enablerepo="*" rpcgen

..
=======================================================================================================================================
 Package                     Architecture                Version                             Repository                           Size
=======================================================================================================================================
Installing:
 rpcgen                      x86_64                      1.4-17.el10                         ol10_appstream                       55 k
..

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.0.44 -DFORCE_INSOURCE_BUILD=1 -DWITH_BOOST=./boost .
..

-- CMAKE_SHARED_LINKER_FLAGS
-- Configuring done (3.2s)
-- Generating done (5.2s)
-- Build files have been written to: /home/yoku0825/mysql-8.0.44

$ time make -j$(nproc)
..
real    41m31.176s
user    225m37.415s
sys     15m19.890s

$ sudo make install

$ du -sh /usr/mysql/8.0.44/
1.5G    /usr/mysql/8.0.44/

OK。次に今のメインストリームの8.4.7。Boostは同梱されるようになったから -DWITH_BOOST はもういらない。

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.7.tar.gz
$ tar xf mysql-8.4.7.tar.gz
$ cd mysql-8.4.7/
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/8.4.7 -DFORCE_INSOURCE_BUILD=1 .

$ time make -j$(nproc)
..
/home/yoku0825/mysql-8.4.7/extra/boost/boost_1_84_0/boost/multiprecision/cpp_bin_float.hpp:40:10: fatal error: quadmath.h: No such file or directory
   40 | #include <quadmath.h>
      |          ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [sql/CMakeFiles/sql_gis.dir/build.make:90: sql/CMakeFiles/sql_gis.dir/gis/buffer.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:49710: sql/CMakeFiles/sql_gis.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

real    39m24.234s
user    217m18.669s
sys     13m42.765s

エラった…。 libquadmath-devel が必要そう。

$ sudo dnf install libquadmath-devel
$ time make -j$(nproc)
..
real    19m49.002s
user    106m29.194s
sys     6m19.764s

合計49分くらい。サイズはそんな変わらない。

$ sudo make install
$ du -sh /usr/mysql/8.4.7/
1.5G    /usr/mysql/8.4.7/

最後にInnovation Releaseの9.5.0

$ wget https://dev.mysql.com/get/Downloads/MySQL-9.5/mysql-9.5.0.tar.gz

$ tar xf mysql-9.5.0.tar.gz
$ cd mysql-9.5.0/
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/9.5.0 -DFORCE_INSOURCE_BUILD=1 .
..
-- Could NOT find BISON (missing: BISON_EXECUTABLE)
CMake Warning at cmake/bison.cmake:119 (MESSAGE):
  No bison found!!
Call Stack (most recent call first):
  router/src/routing_guidelines/src/CMakeLists.txt:25 (INCLUDE)

CMake Warning at cmake/bison.cmake:120 (MESSAGE):
  If you have bison in a non-standard location, you can do 'cmake
  -DBISON_EXECUTABLE=</path/to/bison-executable>
Call Stack (most recent call first):
  router/src/routing_guidelines/src/CMakeLists.txt:25 (INCLUDE)

CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:233 (message):
  Could NOT find BISON (missing: BISON_EXECUTABLE)
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:603 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake/Modules/FindBISON.cmake:306 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  router/src/routing_guidelines/src/CMakeLists.txt:27 (FIND_PACKAGE)

-- Configuring incomplete, errors occurred!

Bisonが必須になったみたい(以前は任意でワーニングは出たけどエラーではなかった)

$ sudo dnf install -y bison
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/9.5.0 -DFORCE_INSOURCE_BUILD=1 .

$ time make -j$(nproc)
..
real    59m43.890s
user    328m0.973s
sys     19m57.807s

6コア使って1時間じゃ、1コアだとホントにメモリも足りないしダメなんではなかろうか。。

$ du -sh /usr/mysql/9.5.0/
1.6G    /usr/mysql/9.5.0/
明日は ConoHa - Qiita Advent Calendar 2025 が @che_azure さん、 MySQL - Qiita Advent Calendar 2025 が @HrsUed さんです! ​
a