详细介绍 MySQL Sandbox 使用

2017-07-22 database mysql

MySQL Sandbox 是个用于在本地快速部署 MySQL 服务的工具,包括了不同版本,不同模式的部署,例如单节点、主备部署、一主多备等等;如果配合 Gearman,甚至可以完成分布式的部署。

该程序通常用于测试,是用 Perl 语言编写的,在此,仅简单介绍下如何使用。

mysql sandbox logo

简介

MySQL-Sandbox 会在同一机器上部署不同的实例,实际上也就是安装时对应的 data-directory、Port、Unix Socket 不同,默认上述的三个参数与版本有关,以 MySQL-5.0.17 为例,对应如下。

Data-Directory: $SANDBOX_HOME/msb_5.0.17/data
          Port: 5017
   Unix Socket: /tmp/mysql_5017.sock

另外,常见的命令简介如下。

make_sandbox
  最简单创建sandbox,也就是一个实例;
low_level_make_sandbox
  创建单个sandbox,可以使用多个选项,不过不会直接使用;
make_replication_sandbox
  创建master-slave架构
make_multiple_sandbox
  创建相同版本的sandbox
make_multiple_custom_sandbox
  创建不同版本的sandbox
make_sandbox_from_source
  从源码编译的build目录创建一个sandbox
make_sandbox_from_installed
  从已安装的二进制文件创建一个sandbox
sbtool
  sandbox管理工具

具体用法参考源码目录下的 README.md 文档,非常详细,在此简单介绍如下。

安装

对于 Perl 程序可以通过 cpan 安装,当然需要 root 权限。

# cpan
cpan> install MySQL::Sandbox

源码包可以直接从 github 上下载,然后通过如下方式安装。

注意,在如下执行 make test 时,会依赖 Perl 的测试框架,可通过 yum install perl-Test-Simple 命令进行安装。

----- 解压、编译、安装
$ tar -xzf MySQL-Sandbox-x.x.x.tar.gz
$ cd MySQL-Sandbox-x.x.x
$ perl Makefile.PL PREFIX=/opt/mysql-sandbox
$ make
$ make test
$ make install

----- 设置$PERL5LIB以及$PATH变量
$ export PATH=$PATH:/opt/mysql-sandbox/bin
$ export PERL5LIB=/opt/mysql-sandbox/share/perl5

另外,建议使用普通用户进行测试,如果要使用 root 用户,则需要设置 export SANDBOX_AS_ROOT=1 环境变量。

安装方式

可直接下载二进制包,然后通过如下方式安装,如上所述,会安装到 $SANDBOX_HOME/msb_X_X_XX 目录下,如果未设置,默认 SANDBOX_HOME=$HOME/sandboxes

可以通过三种方式进行安装,简单介绍如下。

二进制包

可以直接从 官网 下载二进制包,例如 mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz ,包含了已经编译好的二进制包。

----- 单个MySQL服务
$ make_sandbox /path/mysql-x.x.x.tar.gz

----- 主备方式
$ make_replication_sandbox /path/mysql-x.x.x.tar.gz

----- 主备循环
$ make_replication_sandbox --circular=5 /path/mysql-x.x.x.tar.gz

----- 多个MySQL服务
$ make_multiple_sandbox /path/mysql-x.x.x.tar.gz

----- 多个不同版本的MySQL服务
$ make_multiple_sandbox /path/mysql-x.x.x.tar.gz /path/mysql-x.x.x-other-tar.gz /path/another-tar.gz

默认会将上述二进制包解压到当前目录,并将目录重命名为版本号,例如 5.6.35 。

源码包

可以直接下载源码,然后编译,但是不想安装,可以通过如下命令搭建。

$ make_sandbox_from_source {SOURCE_DIRECTORY} {sandbox_type} [options]

其中 sandbox_type 参数指定了类型,包括了 single、multiple、replication、circular ,示例如下。

$ ./configure && make
$ make_sandbox_from_source $PWD single

也可以使用如下参数。

$ make_sandbox_from_source $HOME/build/5.6.35 single --export_binaries --check_port 
$ make_sandbox_from_source $HOME/build/5.6.35 replication --how_many_slaves=5

已安装包

可将不同版本的 MySQL 放在 $SANDBOX_BINARY 环境变量指定目录下,然后使用更简单的方式。

$ export SANDBOX_BINARY=$HOME/mybin
$ ls $SANDBOX_BINARY
5.6.35 5.7.17
$ make_sandbox 5.7.17

使用

在安装到 $SANDBOX_HOME 目录下之后,会生成一列的操作脚本。

服务器操作

单个实例对应命令如下:

start
  启动服务,在数据目录下创建.pid文件,在/tmp目录下创建socket文件;如果.pid文件存在则立即退出。
stop
  停止服务,如果.pid文件不存在则立即退出。
clear
  通过stop停止服务,并删除test数据库中的文件。
send_kill
  发送SIGTERM信号,如果MySQL服务没有响应则发送SIGKILL信号。
use
  通过客户端链接到服务器,默认使用my_sandbox.cnf中的配置,用户名密码分别为msandbox/msandbox、root/msandbox 。
use "command"
  执行命令。

而对于多个实例,只需要在上述的操作中添加 _all 即可,例如 start_all stop_all clear_all use_all send_kill_all 。

在通过客户端链接到服务器时,对于一主多备可以使用 m s1 s2 s3 命令链接,而多个节点则可以使用 n1 n2 n3 命令。

Sandbox Tools

提供了一个 sbtool 工具用于一些常见的操作。

----- 将数据复制到不同环境下
$ make_sandbox 5.1.33
$ make_sandbox 5.1.34
$ sbtool -o copy \
    -s $HOME/sandboxes/msb_5_1_33 \
    -d $HOME/sandboxes/msb_5_1_34

----- 移动到其它目录下
$ make_sandbox 5.1.33
$ sbtool -o move \
    -s $HOME/sandboxes/msb_5_1_33 \
    -d /some/path/a_fancy_name

----- 新的测试脚本
$ cat << EOF >> check_single_server.sb
shell:
command  = make_sandbox 5.1.30 --no_confirm
expected = sandbox server started
msg = sandbox creation

sql:
path = $SANDBOX_HOME/msb_5_1_30
query = select version()
expected = 5.1.30
msg = checking version

shell:
command = $SANDBOX_HOME/msb_5_1_30/stop
expected = OK
msg = stopped
EOF
$ export TAP_MODE=1
$ perldoc Test::Harness::TAP
$ test_sandbox --tests=user \
    --user_test=t/check_single_server.sb

----- 也可以在一个测试中嵌套测试
$ prove -v t/06_test_user_defined.t

----- 创建复制树
$ make_multiple_sandbox --how_many_nodes=12 5.0.77
$ sbtool -o tree \
    --tree_dir=$HOME/sandbox/multi_msb_5_0_77 \
 --master_node=1 \
 --mid_nodes='2 3 4' \
 --leaf_nodes='5 6|7 8 9|10 11 12'
$ cd $HOME/sandbox/multi_msb_5_0_77
$ ./n1 -e "show slave hosts"
$ ./n2 -e "show slave hosts"

----- 检查端口
$ sbtool -o ports
$ sbtool -o ports --only_used

----- 检查range
$ sbtool -o range --min_range=5130

----- 保存禁止删除,如下删除时会报错
$ sbtool -o preserve \
    -s $HOME/sandboxes/msb_5_1_33/
$ $HOME/sandboxes/msb_5_1_33/clear

----- 允许删除
$ sbtool -o unpreserve \
    -s $HOME/sandboxes/msb_5_1_33/
$ $HOME/sandboxes/msb_5_1_33/clear

----- 删除所有,实际可以直接删除目录,需要使用绝对路径
$ sbtool -o delete \
    -s $HOME/sandboxes/msb_5_1_33/

其它

对于 mysqldump、mysqlbinlog、mysqladmin 可以通过如下方式启动,直接使用 my_sandbox.cnf 中的配置,不需要输入密码。

./my sqlbinlog ./data/mysql-bin.000001 | less
./my sqldump dbname > dumpname
./my sqladmin extended-status

常用示例

----- 搭建不同版本MySQL服务
$ make_multiple_custom_sandbox 5.6.16 5.7.17

----- 也可以添加选项,可以通过--help查看可用参数
$ make_sandbox /path/mysql-x.x.x.tar.gz \
    --my_file={small|medium|large|huge}
$ make_sandbox /path/mysql-x.x.x.tar.gz \
    --interactive

----- 检查备库
./check_slaves

----- 所有节点执行命令
./use all "SELECT @@server_id"

----- 重启时指定参数
./restart --key_buffer=20M

参考

详细可以参考官方网站 mysqlsandbox.net,源码包可以直接从 github 上下载。