首批通过分布式安全可靠测评,为关键业务系统打造
使用 obd.sh 执行 mysqltest
更新时间:2026-04-14 14:16:46
使用 obd.sh 执行 mysqltest 测试时需使用通过 obd.sh 部署的 OceanBase 数据库,本文结合示例介绍如何从编译源码开始使用 obd.sh 部署 OceanBase 数据库并执行 mysqltest 测试。
背景介绍
为简化开发者的操作步骤,降低开发者的理解成本,我们将 obd 的一些命令封装到 obd.sh 脚本中,并将该脚本存放在 OceanBase 源码 oceanbase/tools/deploy 目录下。本文执行 mysqltest 测试调用的是 obd 中 obd test mysqltest 命令。
概念介绍
mysqltest 是 OceanBase 数据库准入测试中的一个测试,简单来讲就是将编写好的 case 文件作为输入,将数据库的输出与期望的输出进行比较。OceanBase 数据库中 mysqltest 测试的 case 均位于 OceanBase 源码 oceanbase/tools/deploy/mysql_test 目录下。
case 是 mysqltest 的最小执行单元,一个 case 包含至少一个测试文件和一个结果文件。将 case 进行分类就形成了 suite,suite 是一套 case 的集合。
执行 mysqltest 测试时根据选择的节点不同分为不同的模式,常见 mysqltest 模式如下。
说明
执行 mysqltest 涉及到的配置参数请参见下文 附录。
c 模式:连接 Primary Zone 所在的节点执行 mysqltest,如使用配置文件 distributed.yaml 部署集群后,通过 server1 节点连接到 OceanBase 集群执行测试。
./obd.sh mysqltest -n <name> --suite acs --test-server=server1slave 模式:连接非 Primary Zone 所在的节点执行 mysqltest,如使用配置文件 distributed.yaml 部署集群后,通过 server2 节点连接到 OceanBase 集群执行测试。
./obd.sh mysqltest -n <name> --suite acs --test-server=server2proxy 模式:通过 ODP 连接到集群进行 mysqltest 测试,如使用配置文件 distributed-with-proxy.yaml 部署集群后执行测试。
./obd.sh mysqltest -n <name> --all
操作步骤
本文以 x86 架构的 CentOS Linux 7.9 作为环境介绍如何操作,仅供参考,详细编译部署过程可参考 OceanBase GitHub 仓库。
步骤一:源码编译 OceanBase 数据库
下载 OceanBase 源码
[admin@obtest ~]$ git clone https://github.com/oceanbase/oceanbase.git根据操作系统准备依赖包
[admin@obtest ~]$ sudo yum install git wget rpm* cpio make glibc-devel glibc-headers binutils m4编译
[admin@obtest ~]$ cd oceanbase [admin@obtest oceanbase]$ bash build.sh release --init --make
步骤二:部署编译生成的 OceanBase 文件
准备配置文件
[admin@obtest ~]$ sudo yum install -y yum-utils [admin@obtest ~]$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo [admin@obtest ~]$ sudo yum install -y libtool libaio obclient [admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh prepareobd.sh prepare 命令会从编译目录(例如 build_release)复制二进制文件并制作成镜像,然后根据当前环境信息,生成默认配置文件。如果同时存在多个编译目录,该命令默认选择第一个。
部署时您可选择使用生成的默认配置文件,也可在 GitHub 仓库 中下载其他示例配置文件修改使用。您需根据 mysqltest 测试的模式选择对应的配置文件,具体如下。
说明
mysqltest 测试的模式介绍可参见上文 概念介绍。
执行 c 模式的 mysqltest 测试可使用任一配置文件部署。
执行 slave 模式的 mysqltest 测试,您需使用配置文件 distributed.yaml 或 distributed-with-proxy.yaml 部署两节点集群。
执行 proxy 模式的 mysqltest 测试,您需使用配置文件 distributed-with-proxy.yaml 部署 OceanBase + ODP 集群。
(可选)修改配置文件
如果您需修改端口、目录等信息,可通过如下命令打开配置文件并修改。
[admin@obtest deploy]$ vim distributed-with-proxy.yaml您需关注的配置项如下表所示。
配置项 是否必选 说明 servers 必选 每台机器需要用 - name: 机器标识名 (换行)ip: 机器 IP指定,多个机器就指定多次,机器标识名不能重复。
在机器 IP 不重复的情况下,也可以使用- <ip> (换行)- <ip>的格式指定,此时- <ip>的格式相当于- name: 机器 IP(换行)ip: 机器 IP。mysql_port 必选 设置 SQL 服务协议端口号。 rpc_port 必选 设置远程访问的协议端口号,是 observer 进程和其他节点进程之间的 RPC 通信端口。 home_path 必选 组件的安装路径。 production_mode 必选 生产模式参数,开启会检查服务器资源是否满足生产环境使用,测试场景建议关闭,否则可能部署失败。 devname 可选 和 servers里指定的 IP 对应的网卡,通过ip addr命令可以查看 IP 和网卡对应关系。listen_port 必选 ODP 监听端口。 prometheus_listen_port 必选 ODP prometheus 监听端口。 部署 OceanBase 数据库
[admin@obtest deploy]$ ./obd.sh deploy -c distributed-with-proxy.yaml -n test其中,
-c用于指定部署所需的配置文件路径,此处以 distributed-with-proxy.yaml 为例;-n用于指定部署集群名称,此处以 test 为例。
步骤三:执行 mysqltest 测试
您可选择全量测试,也可指定 case 或 suite 进行测试。
全量测试,即执行
mysql_test/test_suite目录下全部 suite,可参考如下命令。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --all指定 case 进行测试,例如指定
mysql_test/test_suite/alter/t/alter_log_archive_option.test,可参考如下命令。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --test-dir ./mysql_test/test_suite/alter/t --result-dir ./mysql_test/test_suite/alter/r --test-set alter_log_archive_option指定 suite 测试,例如对
mysql_test/test_suite目录下指定 suite 执行测试,可参考如下命令。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --suite acs
附录
执行 mysqltest 测试时可根据实际情况配置一些参数,各参数说明见下表:
| 参数名 | 是否必选 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|---|
| -n | 是 | string | 默认为空 | 执行测试的集群名。 |
| --component | 否 | string | 默认为空 | 待测试的组件名。候选项为 obproxy、obproxy-ce、oceanbase 和 oceanbase-ce。为空时,按 obproxy、obproxy-ce、oceanbase、oceanbase-ce 的顺序进行检查。检查到组件存在则不再遍历,使用命中的组件进行后续测试。 |
| --test-server | 否 | string | 默认为指定的组件下服务器中的第一个节点 | 待测试的机器,可设置为 yaml 文件中 servers 对应的 name 值,若 servers 后未配置 name 值,则使用 ip 值,必须是指定的组件下的某个节点名。 |
| --user | 否 | string | admin | 执行测试的用户名,一般情况下不需要修改。 |
| --password | 否 | string | admin | 执行测试的用户密码。 |
| --database | 否 | string | test | 执行测试的数据库。 |
| --mysqltest-bin | 否 | string | /u01/obclient/bin/mysqltest | mysqltest 二进制文件路径。 |
| --obclient-bin | 否 | string | obclient | OBClient 二进制文件路径。 |
| --test-dir | 否 | string | ./mysql_test/t | mysqltest 所需的 test-file 存放的目录。test 文件找不到时会尝试在 obd 内置中查找。 |
| --test-file-suffix | 否 | string | .test | mysqltest 所需的 test-file 的后缀。 |
| --result-dir | 否 | string | ./mysql_test/r | mysqltest 所需的 result-file 存放的目录。result 文件找不到时会尝试在 obd 内置中查找。 |
| --result-file-suffix | 否 | string | .result | mysqltest 所需的 result-file 的后缀。 |
| --record | 否 | bool | false | 仅记录 mysqltest 的执行结果作为 record-file。 |
| --record-dir | 否 | string | ./record | 记录 mysqltest 的执行结果所存放的目录。 |
| --record-file-suffix | 否 | string | .record | 记录 mysqltest 的执行结果的后缀。 |
| --tmp-dir | 否 | string | ./tmp | mysqltest 的临时目录,存放执行测试过程中产生的一些临时文件。 |
| --var-dir | 否 | string | ./var | 将在该目录下创建 log 目录,并将 log 目录作为 --log-dir 参数传入 mysqltest。 |
| --test-set | 否 | string | 无 | test case 数组。多个 case 使用英文逗号(,)间隔。 |
| --exclude | 否 | string | 无 | 需要除外的 test case 数组。多个 case 中使用英文逗号(,)间隔。 |
| --test-pattern | 否 | string | 无 | test 文件名匹配的正则表达式。所有匹配表达式的 case 将覆盖 test-set 选项。 |
| --suite | 否 | string | 无 | suite 数组。一个 suite 下包含多个 test,可以使用英文逗号(,)间隔。 |
| --suite-dir | 否 | string | ./mysql_test/test_suite | 存放 suite 目录的目录。suite 目录找不到时会尝试在 obd 内置中查找。 |
| --all | 否 | bool | false | 执行 --suite-dir 下全部的 case。--suite-dir 参数为存放 suite 目录的目录。 |
| --need-init | 否 | bool | false | 执行 init sql 文件。一个新的集群要执行 mysqltest 前可能需要执行一些初始化文件,比如创建 case 所需要的账号和租户等。默认不开启。 |
| --init-sql-dir | 否 | string | ./ | init sql 文件所在目录。sql 文件找不到时会尝试在 obd 内置中查找。 |
| --init-sql-files | 否 | string | 默认为空 | 需要 init 时执行的 init sql 文件数组。英文逗号(,)间隔。不填时,如果需要 init,obd 会根据集群配置执行内置的 init。 |
| --auto-retry | 否 | bool | false | 失败时自动重部署集群进行重试。 |
| --psmall | 否 | bool | false | 执行 psmall 模式的 case。 |
| --slices | 否 | int | 默认为空 | 需要执行的 case 将被分成的组数。 |
| --slice-idx | 否 | int | 默认为空 | 指定当前分组 id。 |
| --slb-host | 否 | string | 默认为空 | 指定软负载均衡中心。 |
| --exec-id | 否 | string | 默认为空 | 指定执行 id。 |
| --case-filter | 否 | string | ./mysql_test/filter.py | filter.py 文件,维护了需要过滤的 case。 |
| --reboot-timeout | 否 | int | 0 | 重启的超时时间。 |
| --reboot-retries | 否 | int | 5 | 重启失败重试次数。 |
| --collect-all | 否 | bool | false | 是否收集组件日志。 |
| --log-dir | 否 | string | 默认为 $--var-dir/log | mysqltest 的日志存放路径。 |
| --log-pattern | 否 | string | *.log | 收集日志文件名匹配的正则表达式,命中的文件将被收集。 |
| --case-timeout | 否 | int | 3600 | mysqltest 单个测试的超时时间。 |
| --disable-reboot | 否 | bool | false | 在执行测试的过程中不再重启。 |
| --collect-components | 否 | string | 默认为空 | 用来指定要进行日志收集的组件,多个组件以英文逗号(,)间隔。 |
| --init-only | 否 | bool | false | 为 true 时表示仅执行 init SQL。 |