GA

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

2025/12/04

自分のためのMySQLのSandboxが欲しかったのでyt-sandboxを作った

この記事は MySQL - Qiita Advent Calendar 2025 の4日目の記事です。
昨日は @meijik さんの 各ご家庭(Firebird/MySQL/PostgreSQL)のUUID事情(主に4と7)でした。


MySQLで自分用のサンドボックス環境…といえば長年 MySQL::Sandbox というのがあって、mysqldのバイナリさえあればある程度好きにバカバカとバージョン違いのプロセスを起動したり、 make_replication_sandbox だけで好きにレプリケーションクラスタ一式を起動したりということができました。これはもうだいぶ前にメンテナンスが終わっていて、確か8.0くらいは軽くゴニョって使えたけど8.4はもう無理という代物。

その後継として同じ人が dbdeployer というのを出していたけれど、8.4で MySQL::SandBoxが完全に使えなくなったら引っ越そうかなと思ったら引っ越す前にメンテナンスが終わった。

まだ生きてるサンドボックス作成ツールとして MySQL Shell の dba.deploySandboxInstance も使ったりはするけどこれは単発でmysqldを(自分でポートを指定して)起動するだけで、レプリケーションを勝手に組んだりしてくれないのでちょっとこの用途としてはちょっと合わない。
当時はmysqldは勝手に /usr/sbin/mysqld とかから探されてしまったけど、最近のリリースで mysqlPath というmysqldバイナリのパスを指定できるようになったのでまたそのうち使い始めるかもしれない。

というわけで、自分用に作りました yt-sandbox
ytkit のスクリプトなので

$ git clone https://github.com/yoku0825/ytkit.git
$ cd ytkit
$ cpanm --installdeps .
$ bin/yt-sandbox

で使えるようになりますが、飽くまで自分で使う用途がメインなので中身でrootless dockerに依存して、dockerのデフォルトネットワークがbridgeでないと動かないとかそんな諸々があります。

シンプルな使い方。

$ bin/yt-sandbox --mysqld=5.5
[7729] NOTE: Generate Sandbox directry into /home/yoku0825/yt-sandbox/alpha
[7729] NOTE: Node1 Container Ipaddress: 172.17.0.2
Sandbox deployed into /home/yoku0825/yt-sandbox/alpha

--mysqld でバージョンを渡すとそのタグのコンテナイメージで docker run します。普通に docker run で指定するだけなので、 8.4.5時代に 8.4 で起動していると 8.4 のタグが 8.4.5 に向いたままとか起こるような気がします。なお、 latest は対応してません。
古めのバージョンは Docker Hub から、新しめのバージョンはOracleのコンテナハブからダウンロードしてきます。

ターミナルにも出力しますが、サンドボックスディレクトリを作ってその中に色々ぶち込みます。

$ cd /home/yoku0825/yt-sandbox/alpha
$ ll
total 28
-rw-r--r-- 1 yoku0825 yoku0825   98 Dec  4 10:27 destroy_all
-rw-r--r-- 1 yoku0825 yoku0825   19 Dec  4 10:27 hosts
lrwxrwxrwx 1 yoku0825 yoku0825   41 Dec  4 10:27 n1 -> /home/yoku0825/yt-sandbox/alpha/node1/use
drwxr-xr-x 3 yoku0825 yoku0825 4096 Dec  4 10:27 node1
-rwxr-xr-x 1 yoku0825 yoku0825   98 Dec  4 10:27 restart_all
-rwxr-xr-x 1 yoku0825 yoku0825   96 Dec  4 10:27 start_all
-rwxr-xr-x 1 yoku0825 yoku0825   95 Dec  4 10:27 stop_all
-rwxr-xr-x 1 yoku0825 yoku0825   94 Dec  4 10:27 use_all

MySQL::Sandboxはこのディレクトリにちゃんと use とかがあったんですが、yt-sandboxはサーバー数が1かそれ以上かを区別しないので use とかは個別の node1 ディレクトリの中に入ってます。

単発のインスタンスで良ければdockerコマンド単体で上げちゃうのでこれはあんまり使っていないかも。

$ yt-sandbox -t replication --servers 2
[8333] NOTE: Generate Sandbox directry into /home/yoku0825/yt-sandbox/charlie
Unable to find image 'container-registry.oracle.com/mysql/community-server:8.4' locally
8.4: Pulling from mysql/community-server
c1796c1f2872: Pull complete
73dc7709f5dd: Pull complete
3ba20a201270: Pull complete
bcf1148c6894: Pull complete
ea899417b705: Pull complete
017f83ce814a: Pull complete
d120c25676a4: Pull complete
Digest: sha256:5e274b0e244563921fe9b520f4a2dec301ffc4fc81164a362c6cb3dac60255a9
Status: Downloaded newer image for container-registry.oracle.com/mysql/community-server:8.4
[8333] NOTE: Node1 Container Ipaddress: 172.17.0.2
[8333] NOTE: Node2 Container Ipaddress: 172.17.0.3
Sandbox deployed into /home/yoku0825/yt-sandbox/charlie

-t replication でレプリケーションクラスタを作れます。 -t gr (Group Replication) もあります。
--servers でクラスタトータルの台数を指定できます。↑の場合はソースレプリカ足して2なので1台ずつ作成されます。

$ cd /home/yoku0825/yt-sandbox/charlie
$ ll
total 36
-rwxr-xr-x 1 yoku0825 yoku0825  259 Dec  4 10:39 check_replication
-rw-r--r-- 1 yoku0825 yoku0825  100 Dec  4 10:39 destroy_all
-rw-r--r-- 1 yoku0825 yoku0825   42 Dec  4 10:39 hosts
lrwxrwxrwx 1 yoku0825 yoku0825   43 Dec  4 10:39 m -> /home/yoku0825/yt-sandbox/charlie/node1/use
drwxr-xr-x 3 yoku0825 yoku0825 4096 Dec  4 10:39 node1
drwxr-xr-x 3 yoku0825 yoku0825 4096 Dec  4 10:39 node2
-rwxr-xr-x 1 yoku0825 yoku0825  100 Dec  4 10:39 restart_all
lrwxrwxrwx 1 yoku0825 yoku0825   43 Dec  4 10:39 s1 -> /home/yoku0825/yt-sandbox/charlie/node2/use
-rwxr-xr-x 1 yoku0825 yoku0825   98 Dec  4 10:39 start_all
-rwxr-xr-x 1 yoku0825 yoku0825   97 Dec  4 10:39 stop_all
-rwxr-xr-x 1 yoku0825 yoku0825   96 Dec  4 10:39 use_all

MySQL::Sandbox っぽく、 ./m でソースにつながったり、 ./s1 でレプリカに繋がったりします。最初から gtid_mode=ON です。

レプリケーションはIPアドレスに依存していて、dockerコンテナは上げたり下げたりするとIPアドレスが変わる(俺はそういう使い方しかしていない)ので、一度でもstopするとレプリケーションは壊れることがあります。

基本は、

  • 作って
  • 試して
  • すぐ捨てる
    がコンセプトです。

root@% がパスワードなしで公開されているので注意してください。サンドボックスです。

明日は @taka_yuki_04 さんです!