この記事は 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 さんです!
- MySQL - Qiita Advent Calendar 2025 - Qiita https://qiita.com/advent-calendar/2025/mysql
0 件のコメント :
コメントを投稿