Vastbase 多兼容模式实例部署(WorkBuddy 沙箱)
面向 WorkBuddy 沙箱(以及同构的 Docker/Linux 容器)写的落地流程。沙箱没有 systemd、
依赖包名与 RHEL 不同、休眠后进程会被回收——这些坑在下面各步都做了针对性处理。
Vastbase G100 的兼容模式是实例级属性(initdb --dbcompatibility),合法值只有
A(Oracle)/ B(MySQL)/ PG / MSSQL。本版本 CREATE DATABASE ... DBCOMPATIBILITY
不被支持,无法在单实例内混建不同兼容模式的库——想同时用多种模式,只能一个模式一个实例。
实例之间是「共享二进制 + 独立数据目录 + 独立端口」的关系,二进制只装一份,追加实例约 1 分钟。
二进制放置策略(先算清磁盘再决定)
实测单份 GAUSSHOME(二进制集)1006 MB(lib 461M + bin 201M + python 155M + jre 143M),
单个实例数据目录 730~770 MB。
| 方式 | 4 个实例总占用 | 适用 |
|---|---|---|
| installer 装 4 次 | ≈ 7.1 GB(4×1G + 4×0.75G) | 要多版本并存(如 3.0.8 vs 3.0.9 对比)、要故障隔离 |
installer 装 1 次 + vb_initdb 追加 3 次 |
≈ 3.9 GB(1G + 4×0.75G) | 只是对比兼容模式语法,默认选这个 |
两条硬事实:
add_instance.sh不会复制二进制——它只source $HOME/.Vastbase复用同一份 GAUSSHOME,
装完只多出数据目录(0.75 GB)。- installer 重复跑也不会"自动多一份"——默认安装目录固定为
/home/<user>/local/vastbase(软链到vastbase_<build>),同一用户重复装是覆盖同一目标。
想真得到第二份二进制,必须显式--install-dir换目录,或换系统用户(各自$HOME独立)。
需要第二份二进制做版本对比时,用 --gausshome 让新实例引用另一份,而不是复制:
tar xzf Vastbase-G100-<另一个版本>.tar.gz -C /opt
# /opt/vastbase-installer 装到 /opt/vb_alt309(或直接把展开后的 GAUSSHOME 拷过去)
bash scripts/add_instance.sh --name vb_old --compat A --port 15482 \
--password 'Vastbase@2026' --gausshome /opt/vb_alt309
实例是不是真的跑在那份二进制上,用 /proc 一眼确认:
pid=$(head -1 /home/vastbase/data/vb_old/postmaster.pid); ls -l /proc/$pid/exe
# -> /opt/vb_alt309/bin/vastbase
何时用本 skill
- 在 WorkBuddy 沙箱里验证 Vastbase 的 Oracle/MySQL/MSSQL 兼容语法,需要并行对比
- 沙箱里快速搭一套测试库做功能/POC 验证(不建议用于生产)
- 沙箱休眠或会话重开后实例不见了,要把它们重新拉起来(直接从「步骤 6」开始)
- 已有 Vastbase 安装,只是想补一个其他兼容模式的实例(直接从「步骤 4」开始)
WorkBuddy 沙箱专有约束
这四条是通用 Linux 部署文档里没有、但在沙箱里一定会撞上的:
| 沙箱特性 | 撞上的现象 | 本 skill 的应对 |
|---|---|---|
| 容器内没有 systemd 运行 | installer 校验 RemoveIPC 失败 |
prepare_host.sh 直接改配置文件绕过 |
| Ubuntu 包名与 RHEL 不同 | 报缺 libreadline8 / libaio1 |
脚本构造兼容 deb 包 + libaio.so.1 软链 |
| 空闲约 10 分钟休眠、进程被回收 | 端口全消失,postmaster.pid 残留 |
start_all.sh 判活清 pid 后重启 |
| 只有一个 overlay 可写层 | Session 回收即连数据一起销毁 | 只当临时环境;要留的产物导出到沙箱外 |
步骤 1:获取安装包
官网下载中心有「留资表单 + 短信验证码」门禁,没有匿名直链。脚本已复刻其调用链。
先收集申请人信息
发短信前需要:手机号、姓名、邮箱、公司、职位。不要逐条追问,直接把
assets/apply_form.html 的全部内容作为 widget_code 传给 show_widget 渲染交互表单
(内置 17 项职位下拉、字段校验、防重复提交)。用户提交后表单会把
【Vastbase 申请信息】
手机号:… 姓名:… 邮箱:… 公司:… 职位:…
发回对话,照此执行 --send-sms;用户回复验证码后带 --code 完成申请并下载。
安装包不要问用户:先 uname -m 看本机架构,再对照 --list 输出自己挑条目
(x86_64→73,aarch64 鲲鹏 920→74,飞腾/申威/龙芯同理;docker 镜像是单独条目)。
表单里不出现安装包选项。
# 查看当前在架条目(73=x86,74=鲲鹏920,75=飞腾2000)
python3 scripts/get_download_url.py --list
# 全新申请:先发短信,拿到验证码后再执行一次
python3 scripts/get_download_url.py --mobile 138xxxxxxxx --name 张三 \
--email a@corp.com --company 某公司 --position 架构师 --send-sms
python3 scripts/get_download_url.py --mobile 138xxxxxxxx --name 张三 \
--email a@corp.com --company 某公司 --position 架构师 --code 123456 --download /tmp
# 更常用:复用 applyId 换新签名链接(无需再收短信)
python3 scripts/get_download_url.py --apply-id 4923 --download /tmp
要点:
- 签名链接 1 小时过期;applyId 可反复换新链接
- 签名绑定 GET,别用 HEAD 判断有效性(必然 403),用 curl -r 0-0 发 GET
- 下载完别急着删,后续可能重装
步骤 2:环境准备
bash scripts/prepare_host.sh
脚本做的事(幂等,可重复跑):
1. 建系统用户 vastbase
2. 装 expect bzip2 libreadline-dev python3-dev libaio1t64
3. 构建 libreadline8、libaio1 兼容包——安装器按 RHEL 包名查 dpkg-query,而 Ubuntu 24.04 已改名
4. 建 libaio.so.1 -> libaio.so.1t64 软链(二进制依赖旧 SONAME)
5. 写 RemoveIPC=no(容器无 systemd 运行,改文件即可过校验)
步骤 3:安装首个实例
解压安装包。注意:cp -r * 会漏掉 .checksum 隐藏文件,会导致报「安装包不完整」。
mkdir -p /opt/vbst
tar xzf /tmp/Vastbase-G100-*.tar.gz
cp -a vastbase-installer/. /opt/vbst/ # -a 带隐藏文件
chown -R vastbase:vastbase /opt/vbst
python3 scripts/install_base_instance.py --installer-dir /opt/vbst \
--password 'Vastbase@2026' --compat A --shared-buffers 512
默认端口按兼容模式自动取值,不传 --port 即可:
| 兼容模式 | 默认端口 | 同时占用 |
|---|---|---|
| A(Oracle) | 15432 | 15432 / 15433 |
| B(MySQL) | 15436 | 15436 / 15437 |
| MSSQL | 15439 | 15439 / 15440 |
| PG | 15442 | 15442 / 15443 |
脚本会在安装前预检端口(含 port+1)是否被占,避免装到最后一刻才失败。
想先看参数不真装:--dry-run。
installer 是纯交互的,脚本按提示顺序应答(3 次回车 → Y 实例化 → 2 自定义 → 密码两次 →
加密密钥回车 → 目录回车 → 端口 → 连接数 → shared_buffers → 兼容模式 → 汇总回车 → 不加载 License → 退出)。
关键:installer 的自定义安装就能直接指定兼容模式、端口、连接数、shared_buffers,
不必装完再改配置。默认值很坑:shared_buffers 按物理内存推算(123GB 机器会给 31569MB),
务必显式传 --shared-buffers 512。
密码要求:≥8 位,含大小写 + 数字 + 特殊字符。
步骤 4:追加其他兼容模式实例
bash scripts/add_instance.sh --name vb_b --compat B --password 'Vastbase@2026'
bash scripts/add_instance.sh --name vb_mssql --compat MSSQL --password 'Vastbase@2026'
不传 --port 时按上表的模式默认端口分配(B→15436、MSSQL→15439)。
端口必须间隔 ≥ 2:每个实例会同时监听 port 和 port+1(内部保留端口),
所以 15433 / 15437 / 15440 这些不能用,会被前一个实例占着。脚本会自动检查。
内存参数默认 shared_buffers=256MB / max_process_memory=8192MB / max_connections=100,
适合测试环境。max_process_memory 是上限不是预留,实测 RSS 只有 0.5~1.5 GB。
其他可选参数:
| 参数 | 用途 |
|---|---|
--user <系统用户> |
换运行用户(数据目录随之落到该用户 $HOME/data 下) |
--gausshome <路径> |
引用另一份二进制(版本对比用);只设环境变量,不复制文件 |
--shared-buffers / --max-connections / --max-process-memory |
覆盖默认内存与连接数 |
每个实例会登记进 /home/<user>/instances.tsv(名称 端口 兼容模式 数据目录 [GAUSSHOME]),
verify_all.py 和 start_all.sh 都读这张表。
步骤 6:重启 / 休眠恢复后拉起全部实例
机器的进程会被回收(容器休眠、重启),但数据目录在。此时直接 vb_ctl start 常因残留
postmaster.pid 报错,需先判活再清 pid:
bash scripts/start_all.sh # 清残留 pid + 逐个启动(已在运行的跳过)
bash scripts/start_all.sh --status # 只看状态
bash scripts/start_all.sh --stop # 全部停止
脚本按 instances.tsv 遍历,自带 --gausshome 实例的环境切换,幂等可重复跑。
步骤 5:验证
python3 scripts/verify_all.py
输出一张表:每个实例的 vb_version() 摘要 + 该模式的特性语句是否跑通
(A 用 sysdate from dual,B 用 ifnull/date_format,MSSQL 用 getdate(),PG 用 current_database())。
单实例手动查(注意 -d postgres:vsql 默认连与系统用户同名的库,用户不是 vastbase 时会报库不存在):
su - vastbase -c "source /home/vastbase/.Vastbase && vsql -p 15436 -d postgres -c 'select vb_version();'"
关键约束速查
| 约束 | 说明 |
|---|---|
| 兼容模式 | 实例级,A/B/PG/MSSQL;CREATE DATABASE ... DBCOMPATIBILITY 不支持 |
| 端口 | 每实例占 port 与 port+1,规划间隔 ≥2 |
| 内存下限 | max_process_memory ≥ 2GB + cstore_buffers(512MB) + shared_buffers + 保留内存(~3.6GB),低于 8GB 基本起不来 |
| 连接身份 | 初始用户 vastbase 禁止远程登录;走 su - vastbase + 本地 socket,或 TCP + 密码 |
| 多实例连错 | .Vastbase 的 PGPORT 是本实例端口(A 默认 15432),连其他实例必须显式 -p |
| 版本号 | version() 返回 PostgreSQL 9.2.4 是兼容标识;真实版本看 vb_version() |
脚本清单
| 脚本 | 作用 | 幂等 |
|---|---|---|
scripts/get_download_url.py |
官网申请/复用 applyId 换签名链接并下载 | — |
scripts/prepare_host.sh |
建用户、装依赖、造兼容包、改 RemoveIPC | ✅ |
scripts/install_base_instance.py |
pexpect 驱动 installer 装首个实例 | ❌ 重复跑覆盖同一目录 |
scripts/add_instance.sh |
vb_initdb 追加实例(任意兼容模式 / 任意 GAUSSHOME) |
❌ 数据目录已存在则退出 |
scripts/start_all.sh |
批量启动/停止/状态,清残留 pid | ✅ |
scripts/verify_all.py |
批量验 vb_version() + 各模式特性语句 |
✅ |
assets/apply_form.html |
留资信息收集表单(show_widget 渲染),提交后自动回传对话 | — |
常见故障
依赖检查失败、libaio.so.1 缺失、installer 报「安装包不完整」、启动报内存超限、
端口冲突、重启后服务不见了、自动化 installer 时参数填错位——逐条排查见
references/troubleshooting.md。