使用 obd.sh 运行 mysqltest:OceanBase 数据库访问测试从编译到执行的完整指南

发布时间:2026/9/15 11:51:18
使用 obd.sh 运行 mysqltest:OceanBase 数据库访问测试从编译到执行的完整指南 使用 obd.sh 运行 mysqltestOceanBase 数据库访问测试从编译到执行的完整指南【免费下载链接】oceanbaseOceanBase is the unified distributed database for the AI era — open-source, multi-model, one engine for your most demanding workloads.项目地址: https://gitcode.com/GitHub_Trending/oc/oceanbase本篇技术指南以 OceanBase 开源仓库中的docs/docs/en/mysqltest.md为骨架围绕obd.sh脚本封装 OBDOceanBase Deployer命令、部署 OceanBase 数据库并运行mysqltest测试这一完整链路展开。读者将掌握 mysqltest 测试的 core 概念case、suite、三种连接模式、从源码编译、准备部署配置、启动集群到执行全量/指定 case/指定 suite 测试的完整实操流程并能依据附录参数表按需定制每一次测试运行。背景为什么用 obd.sh 运行 mysqltest在 OceanBase 的开发与测试过程中运行数据库访问测试往往需要完成一系列繁琐的准备工作部署集群、初始化账号与租户、指定 mysqltest 二进制路径、收集日志等。为了简化开发者的操作步骤、降低理解成本OceanBase 将部分 OBD 命令封装进了obd.sh脚本脚本存放在 OceanBase 源码的 tools/deploy 目录下。从 obd.sh 的源码结构可以确认该脚本本质上是一个薄封装层它负责准备环境变量、构造参数、调用底层obd命令。例如其mysqltest函数最终执行的是obd test mysqltest $deploy_name $CLIENT_BIN_ARGS $extra_args $INIT_FLIES其中CLIENT_BIN_ARGS在variables_prepare中自动注入指向依赖目录下的客户端二进制OBCLIENT_BIN$DEP_PATH/u01/obclient/bin/obclient MYSQLTEST_BIN$DEP_PATH/u01/obclient/bin/mysqltest CLIENT_BIN_ARGS--obclient-bin$OBCLIENT_BIN --mysqltest-bin$MYSQLTEST_BIN也就是说开发者只需执行./obd.sh mysqltest -n name ...脚本会自动完成客户端路径注入、必要时的镜像创建mirror_create与集群部署deploy_cluster无需手工维护这些底层细节。本指南的运行方式即通过obd.sh调用 OBD 的obd test mysqltest命令。核心概念mysqltest、case 与 suitemysqltest 是什么mysqltest 是 OceanBase 数据库访问测试中的一种测试手段。简单来说它以编写好的用例文件test file作为输入将数据库的执行输出与期望输出result file进行比对从而验证 SQL 行为是否符合预期。其工作模式可概括为输入case 中的.test文件一组 SQL 语句与 mysqltest 指令执行连接数据库逐条执行比对将实际输出与同名的.result文件内容比对不一致即判定测试失败。case 与 suitecase是 mysqltest 的最小执行单元。一个 case 至少包含一个测试文件t/xxx.test和一个结果文件r/xxx.result。suite是 case 的分类集合即把一组相关 case 归入同一目录形成的测试套件。在 OceanBase 源码中mysqltest 的用例全部位于 tools/deploy/mysql_test 目录其目录结构如下tools/deploy/mysql_test/ ├── include/ # 公共的 mysqltest include 脚本 ├── r/ # 结果文件目录非 suite 场景 ├── t/ # 测试文件目录非 suite 场景 └── test_suite/ # 按 suite 组织的大量测试套件以仓库当前内容为准tools/deploy/mysql_test/test_suite 下包含了大量按功能域划分的 suite例如alter、column_store、datatype、deadlock_detector、delete、direct_load_data、duplicate_table、executor、expr、foreign_key、geometry、global_index、groupby、histogram、information_schema、insert、join、lob、major_freeze、number、pdml、pl、px、replace、security、subquery、sys_vars、tenant、trx、type_date、unit、update、view、window_function等。t/、r/下的扁平用例与test_suite/下的套件用例并存分别对应两种不同的用例组织方式。每个 suite 内部同样以t/与r/存放测试文件与结果文件。以altersuite 为例其目录为 tools/deploy/mysql_test/test_suite/alter/t 与 tools/deploy/mysql_test/test_suite/alter/r/mysql其中测试文件为alter_log_archive_option.test对应结果文件为alter_log_archive_option.result。三种连接模式运行 mysqltest 时根据所选测试节点的不同分为不同模式模式含义示例c mode连接 Primary Zone 所在服务器执行 mysqltest。例如使用distributed.yaml部署集群后连接 server1 执行测试./obd.sh mysqltest -n name --suite acs --test-serverserver1Slave mode连接 Primary Zone 之外的服务器执行 mysqltest。例如使用distributed.yaml部署集群后连接 server2 执行测试./obd.sh mysqltest -n name --suite acs --test-serverserver2Proxy mode通过 ODPOceanBase 数据库代理即 obproxy连接集群执行 mysqltest。例如使用distributed-with-proxy.yaml部署集群后执行测试./obd.sh mysqltest -n name --all其中 c mode 与 Slave mode 的连接目标由--test-server参数决定取值为 yaml 配置中servers下的name未配置 name 时取ipProxy mode 则依赖集群配置中是否包含 obproxy 组件。从源码编译到运行测试的完整步骤Step 1编译 OceanBase 数据库首先需要从源码编译出 OceanBase 数据库。完整的编译与运行说明参见 build-and-run其中给出了 debug 与 release 两种构建模式# Debug 模式 bash build.sh debug --init --make # Release 模式 bash build.sh release --init --make编译产物为observer二进制。需要说明的是obd.sh会通过deploy_cluster中的obd cluster deploy/obd cluster start来部署集群并通过mirror_create将本地编译出的observer打包成 OBD 可识别的本地 mirror从而让测试直接基于当前源码构建的二进制运行——这也是该方案能实现从源码到测试闭环的关键。Step 2准备部署配置obd.sh提供了prepare子命令用于生成部署所需的 yaml 配置。从 obd.sh 的generate_config函数可以看到它基于 tools/deploy/obd/config.yaml.template 与 tools/deploy/obd/obproxy.yaml.template 两个模板结合当前用户、主机与动态生成的端口号生成四份配置single.yaml单节点集群single-with-proxy.yaml单节点 obproxydistributed.yaml双节点server1/server2分属 zone1/zone2集群distributed-with-proxy.yaml双节点 obproxy。[adminobtest ~]$ cd oceanbase/tools/deploy [adminobtest deploy]$ ./obd.sh prepare生成的 yaml 中server 会包含name、ip、mysql_port、rpc_port、home_path、zone等字段。同时tools/deploy/obd/observer.include.yaml 中提供了适用于开发测试场景的默认 observer 参数如production_mode: false、datafile_size: 2G、memory_limit: 16G、system_memory: 1G、cpu_count: 8、net_thread_count: 4等config.yaml.template中亦可直接在global段覆盖这些配置。Step 3部署集群使用deploy子命令并指定配置文件即可完成集群部署[adminobtest deploy]$ ./obd.sh deploy -c ./single.yaml从源码看deploy会依次执行mirror_create创建本地组件 mirror 并记录package_hash→deploy_clusterobd cluster destroy清理旧部署 →obd cluster deploy→obd cluster start→ 执行初始化 SQLget_init_sql--init-only。初始化阶段会执行tools/deploy下的初始化脚本例如 init_user.sql创建admin/admin账号、授权并创建obproxy数据库、init_for_ce.sql、init_create_tenant_routines.sql等为后续 mysqltest 创建所需的账号与租户。这也是--need-init参数所描述的新建集群在执行 mysqltest 前可能需要执行初始化文件的仓库落地实现。Step 4运行 mysqltest 测试部署完成后即可运行测试。既可以全量测试也可以指定某个case或suite测试。执行obd.sh脚本时所用参数的具体含义见文末 附录参数详解。全量测试即运行mysql_test/test_suite目录下的所有 suite[adminobtest ~]$ cd oceanbase/tools/deploy [adminobtest deploy]$ ./obd.sh mysqltest -n test --all指定 case 测试例如指定mysql_test/test_suite/alter/t/alter_log_archive_option.test该 case 实际存在于仓库的 tools/deploy/mysql_test/test_suite/alter/t 目录中[adminobtest ~]$ cd oceanbase/tools/deploy [adminobtest 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[adminobtest ~]$ cd oceanbase/tools/deploy [adminobtest deploy]$ ./obd.sh mysqltest -n test --suite acs说明--suite acs为 OBD 内置 suite 的示例用法仓库test_suite目录下实际维护的 suite 名称以 tools/deploy/mysql_test/test_suite 列出的目录为准如alter、trx、px等。当本地找不到 suite 目录时OBD 会尝试在内置目录中查找。用例文件与结果文件示例以altersuite 的alter_log_archive_optioncase 为例其测试文件 alter_log_archive_option.test 展示了典型的 mysqltest 写法——使用--disable_query_log/--enable_query_log控制查询日志通过connect (...)指令建立连接--disable_query_log set session.explicit_defaults_for_timestampoff; --enable_query_log # owner: zhaoyongheng.zyh # owner group: trans # description: test alter system set backup_log_archive_option connect (obsys1,$OBMYSQL_MS0,admin,$OBMYSQL_PWD,test,$OBMYSQL_PORT); connection obsys1;其中$OBMYSQL_*这类变量由 OBD/mysqltest 框架注入账号、密码、端口等运行时信息对应结果文件为同名的alter_log_archive_option.result位于 tools/deploy/mysql_test/test_suite/alter/r/mysql。运行该 case 时框架会把实际执行输出与.result文件逐行比对从而完成校验。附录参数详解执行 mysqltest 测试时可根据实际情况配置以下参数完整继承自原文档并补充说明参数名必填类型默认值说明-nYstringnull集群名称deploy name。--componentNstringnull被测组件名候选值为 obproxy、obproxy-ce、oceanbase、oceanbase-ce。为空时按 obproxy → obproxy-ce → oceanbase → oceanbase-ce 顺序探测检测到存在即停止遍历并以此组件进行后续测试。--test-serverNstring指定组件 servers 下的第一个节点被测机器可设为 yaml 文件中 servers 对应的 name 值servers 后未配置 name 时使用 ip 值必须是所指定组件下的某个节点名。--userNstringadmin执行测试的用户名一般无需修改。--passwordNstringadmin密码。--databaseNstringtest数据库名。--mysqltest-binNstring/u01/obclient/bin/mysqltestmysqltest 二进制文件路径。--obclient-binNstringobclientobclient 二进制文件路径。--test-dirNstring./mysql_test/tmysqltest 所需 test-file 存放目录本地找不到时会尝试在 OBD 内置目录中查找。--test-file-suffixNstring.testmysqltest 所需 test-file 的后缀。--result-dirNstring./mysql_test/rmysqltest 所需 result-file 存放目录本地找不到时会尝试在 OBD 内置目录中查找。--result-file-suffixNstring.resultmysqltest 所需 result-file 的后缀。--recordNboolfalse仅将 mysqltest 的执行结果记录为 record-file。--record-dirNstring./record记录 mysqltest 执行结果的目录。--record-file-suffixNstring.record记录执行结果的文件后缀。--tmp-dirNstring./tmp传给 mysqltest 的 tmpdir 选项。--var-dirNstring./var日志目录将创建于该目录下并以 logdir 选项传给 mysqltest。--test-setNstringno测试 case 数组多个 case 用英文逗号,分隔。--excludeNstringno需要排除的测试 case 数组多个 case 用英文逗号,分隔。--test-patternNstringno匹配测试文件名的正则表达式所有命中表达式的 case 会覆盖 test-set 选项。--suiteNstringnosuite 数组一个 suite 包含多个测试可用英文逗号,分隔多个。--suite-dirNstring./mysql_test/test_suitesuite 目录的存放位置本地找不到时会尝试在 OBD 内置目录中查找。--allNboolfalse执行--suite-dir下的所有 case。--need-initNboolfalse是否执行初始化 sql 文件。新集群在执行 mysqltest 前可能需要执行一些初始化文件如创建 case 所需的账号和租户默认不启用。--init-sql-dirNstring./init sql 文件所在目录找不到 sql 文件时会尝试在 OBD 内置目录中查找。--init-sql-filesNstring默认空需要 init 时执行的 init sql 文件数组英文逗号,分隔不填时若需要 initOBD 将按集群配置执行内置 init。--auto-retryNboolfalse失败时自动重新部署集群并重试。--psmallNboolfalse以 psmall 模式执行 case。--slicesNintnull待执行 case 被分成的组数。--slice-idxNintnull指定当前组 id。--slb-hostNstringnull指定软负载均衡中心。--exec-idNstringnull指定执行 id。--case-filterNstring./mysql_test/filter.pyfilter.py 文件维护需要过滤掉的 case。--reboot-timeoutNint0重启超时时间。--reboot-retriesNint5重启失败的重试次数。--collect-allNboolfalse是否收集组件日志。--log-dirNstring默认为 tmp_dir 下的 logmysqltest 的日志存储路径。--log-patternNstring*.log收集匹配该正则表达式的日志文件命中文件将被收集。--case-timeoutNint3600单个测试的 mysqltest 超时时间秒。--disable-rebootNboolfalse测试执行期间不再重启。--collect-componentsNstringnull指定需要收集日志的组件多个组件用英文逗号,分隔。--init-onlyNboolfalse为 true 时仅执行 init SQL。高频参数组合与注意事项测试前的集群初始化新建集群首次执行 mysqltest 时若 case 依赖admin账号或特定租户应确认初始化 SQL 已执行。obd.sh deploy会自动以--init-only执行 init手动运行测试时可通过--need-init与--init-sql-files组合控制。连接模式的选择单节点配置single.yaml下默认即连接该节点分布式配置distributed.yaml下通过--test-server在 server1/server2 间切换以覆盖 c mode 与 Slave mode带代理的配置*-with-proxy.yaml用于 Proxy mode 验证。大批量用例的并行切分当执行全量用例时可借助--slices与--slice-idx将用例分为多组分配到多台机器/多个进程并行执行再汇总结果从而缩短整体测试时间。失败恢复--auto-retry会在测试失败时自动重建集群并重试--disable-reboot可关闭测试过程中的重启行为--reboot-timeout与--reboot-retries控制重启的超时与重试次数。日志收集测试结束后--collect-all/--collect-components/--log-pattern可将组件日志按需收集到--log-dir便于问题定位。小结通过obd.shOceanBase 开发者可以用一条命令完成从本地编译产物部署集群到运行 mysqltest 访问测试的完整流程prepare生成single.yaml/distributed.yaml等部署配置deploy完成集群起停与初始化mysqltest子命令封装了obd test mysqltest的客户端路径注入与参数透传。结合test_suite下的用例目录、t/与r/的成对文件以及附录中的 40 余个可调参数开发者可以精确控制被测节点、用例范围、初始化、日志收集与失败恢复策略将 mysqltest 访问测试稳定地纳入日常开发验证流程。【免费下载链接】oceanbaseOceanBase is the unified distributed database for the AI era — open-source, multi-model, one engine for your most demanding workloads.项目地址: https://gitcode.com/GitHub_Trending/oc/oceanbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考