OceanBase 数据库日常运维场景的实用脚本集合,涵盖 Trace ID 离线解析、故障节点副本清理与重建、租户核心运行指标监控,以及 OCP 参数批量审计与修正。
这是一个纯 bash 的 OceanBase Trace ID 离线解析工具。它将形如 YB42C0A82146-0006454899BBDC0D-0-0 的 Trace ID 拆成四段:第一段反解出产生该 Trace 的服务器 IP 地址与端口(IPv4),第二段把序列号当微秒时间戳换算成可读时间并按 BATCH=1<<20 划分高低位段,第三/四段判断是否为嵌套 SQL 和并行任务。解析逻辑依据 OB 源码 ob_trace_id.h、main.cpp、ob_time_utility.cpp、ob_net_util.cpp(ntohl) 的实现推导而来。当前只实现了 IPv4(Trace ID 首字符为 Y),IPv6 分支会提示"暂未实现"。
用法:
# 直接传 Trace ID
sh parse_trace_id.sh YB42C0A82146-0006454899BBDC0D-0-0
# 或赋予执行权限后运行
chmod +x parse_trace_id.sh
./parse_trace_id.sh 'YB42C0A82146-0006454899BBDC0D-0-0'
# 不带参数会打印用法提示并以 exit 1 退出
sh parse_trace_id.sh无需连接 OceanBase 数据库,也不需要 root 权限,可从 observer 日志或 OBProxy 日志里复制 Trace ID 直接离线解析。
参数:
位置参数(仅 1 个):$1 = 待解析的 OceanBase Trace ID,标准格式为 以Y开头的首段-序列号hex-InnerSQLIDhex-SubTaskIDhex,例如 YB42C0A82146-0006454899BBDC0D-0-0。脚本内部变量:IP_TYPE 取首字符(Y=IPv4,否则按 IPv6 处理);FIRST_PART 为首段去掉首字符后的 hex(含端口+IP);SECOND_PART 为序列号 hex;THIRD_PART 为 Inner SQL ID hex;FOURTH_PART 为 Sub Task ID hex。无环境变量,无交互式 read 输入。
输出:
纯文本打印到标准输出,分块展示:1)【IP 地址和端口】IP 版本、IP 地址、端口号及详细解析(原始 hex、端口高 16 位、IP 低 32 位);2)【序列号信息】序列号的十六进制/十进制、组成分析、按微秒时间戳解析出的秒和微秒及对应时间、线程空间(BATCH=1048576)分析、高 44 位/低 20 位的位段划分与时间戳估算;3)【扩展信息】Inner SQL ID、Sub Task ID,并判断是否嵌套 SQL(>0 则打印 Execution ID=值+1)和是否并行任务;4)【完整解析总结】来源服务器 IP:端口、服务器启动时刻估算、SQL 类型(嵌套SQL/普通SQL)、任务类型(并行任务/单线程任务)。无参数时打印用法和示例提示。
注意事项:
前置依赖:bash 及标准命令 cut、tr、printf、date。时间转换兼容 GNU date(date -d @秒)和 BSD/macOS date(date -r 秒),二者择一即可。功能限制:仅实现 IPv4(Trace ID 首字符 Y),遇到 IPv6(非 Y 开头)会输出"IPv6 解析暂未实现"。脚本明确说明:序列号低 20 位混合了微秒时间戳和线程内请求计数,无法从单个 Trace ID 准确分离出服务器启动时间和请求计数,故启动时间仅为估算(秒级精度)。无 OB 版本硬性要求,只要 Trace ID 符合 OB 标准格式即可解析;脚本无网络操作、无需连库、无需特权。
交互式脚本,用于在某个 observer 节点故障后,清理该故障节点上所有租户的副本(修改 locality、分裂资源池、删除故障节点资源池),或在节点重装后重新把租户副本建回来(创建资源池、修改资源池、补回 locality)。脚本通过 mysql 客户端连接 oceanbase 库执行,自动查 DBA_OB_TENANT_JOBS 监控 ALTER_TENANT_LOCALITY 任务进度。清理(选项1)与重建(选项2)是先后衔接的两步:清理完成后需到 OCP 删除故障节点 IP 并重装,再运行选项 2 重建副本。
用法:
脚本为交互式,需在能连到 OceanBase 的机器上运行,且已安装 mysql 客户端。
# 测试模式:只生成 SQL 写入文件,不实际执行(强烈建议先空跑一遍)
bash ob_recovery.sh -t
# 详细日志模式
bash ob_recovery.sh -l
# 测试模式 + 详细日志
bash ob_recovery.sh -t -l
# 查看帮助
bash ob_recovery.sh -h启动后会依次交互提示:
- 输入数据库连接串,支持两种格式(实际验证连接用的是 mysql 客户端):
cbclient -h主机 -P端口 -u用户 -p密码 -D数据库mysql -h主机 -P端口 -u用户 -p密码 -D数据库 - 输入故障节点 observer 的 IP;
- 选择操作:输入 1=清理故障节点租户副本,2=重建故障节点租户副本。
参数:
命令行选项(getopts "tlh"):
- -t:测试模式,生成的 SQL 只写入文件不执行。
- -l:详细日志(VERBOSE),打印连接串解析结果、生成的 SQL 等细节。
- -h:显示帮助并退出。
交互输入:
- DB_CONNECTION_STRING:数据库连接串,必须以 cbclient 或 mysql 开头,脚本校验格式。
- FAULT_IP:故障节点 observer 的 IP,正则校验 IPv4 格式。
- OPERATION:操作编号,校验必须为 1 或 2。
脚本内部默认值:DB_PORT 缺省 2881,DB_NAME 缺省 oceanbase。 注意:SQL 模板中故障 IP 的占位写死为 192.192.33.77,运行时由 execute_sql_results 用字符串替换成实际输入的 FAULT_IP。
输出:
- 控制台:带时间戳和颜色的 INFO/SUCCESS/WARNING/ERROR 日志(同时写入日志文件);任务进度监控时每秒打印 DBA_OB_TENANT_JOBS 的进度表(START_TIME、TENANT_ID、JOB_ID、JOB_STATUS、PROGRESS),每 10 秒打印已等待秒数。
- 日志文件 ob_recovery_YYYYMMDD_HHMMSS.log:全部步骤执行记录与 SQL 输出。
- 测试模式额外生成 generated_sql_YYYYMMDD_HHMMSS.txt:按步骤注释写出的 ALTER/DROP/CREATE 等 SQL,可直接人工核对或拿去执行。
- 清理流程结束打印提示:去 OCP 删除故障节点 IP 并重装,再跑选项 2 重建。
注意事项:
前置依赖:必须先安装 mysql 客户端命令(脚本启动即检查,未安装直接退出);虽接受 cbclient 格式连接串,但实际连库与验证都用 mysql。 权限/连接:连接的是 oceanbase 库(默认),执行 ALTER TENANT、DROP/CREATE RESOURCE POOL 等管理操作,需具备 sys 租户或相应管理权限的账号。 依赖的系统视图:DBA_OB_TENANT_JOBS、DBA_OB_RESOURCE_POOLS、__ALL_UNIT、DBA_OB_TENANTS、DBA_OB_SERVERS、DBA_OB_UNIT_CONFIGS、__ALL_ROOTSERVICE_JOB。 任务监控:对 ALTER_TENANT_LOCALITY 任务每秒轮询、最长等待 3600 秒超时;进度按 START_TIME >= NOW()-24 小时过滤。 工作流顺序:选项1(清理)完成后,需到 OCP 删除故障节点 IP 并重装 observer,再运行选项2(重建)补回副本,二者不可调换。 源码未体现:脚本无显式 OceanBase 版本声明;IP 占位 192.192.33.77 表明该脚本源自某具体环境,跨环境使用时如 SQL 模板逻辑与之不符需人工核对(源码未体现其他环境的兼容处理)。
该脚本对指定租户(默认会话变量 @tid=1034)做两次 oceanbase.gv$sysstat 快照,中间间隔 SLEEP(5) 秒,计算 QPS、TPS、IO 读/写速率等增量指标,同时读取内存、MemStore、CPU 等存量指标,最后通过 RPAD 对齐输出一张监控汇总表。所有 gv$sysstat 指标均用 SUM(value) 对全部节点汇总。脚本末尾还附带一条按库(database_name)统计 data_size / required_size 的查询,按数据量降序返回。
用法:
# 1) 先编辑脚本,把第二行的 SET @tid = 1034; 改成你的租户ID
# 2) 通过 OBProxy(2883) 连到 oceanbase 库执行
mysql -h<IP> -P2883 -u<user> -p<password> -D oceanbase -A < ob_monitor_test.sql
# 或用 obclient
obclient -h<IP> -P2883 -u<user> -p<password> -D oceanbase -A < ob_monitor_test.sql
# 注:源码文件头注释里命令写的是 ob_monitor.sql(部署用文件名),实际拉取的文件名为 ob_monitor_test.sql,按实际文件名执行即可。参数:
- @tid:会话变量,脚本第 11 行硬编码
SET @tid = 1034;,需按目标租户 ID 手工修改,用于全部 gv$sysstat 查询的 con_id 过滤。 - 第二段库级大小查询里 tenant_id 写死为 1034(
WHERE t1.tenant_id = 1034),未复用 @tid,更换租户时需同步修改此处。 - 快照间隔固定 5 秒(
DO SLEEP(5);),不可外部传入。 - 脚本无 $1/$2 命令行参数、无 read 输入、无环境变量依赖。
输出:
共产生两个结果集:
- 监控汇总表:两列(列名均为空,RPAD 对齐),含表头"指标 / 当前值"及 13 行指标——QPS、TPS、IO读(MB/s)、IO写(MB/s)、已用内存(GB)、内存上限(GB)、内存使用率(%)、MemStore(GB)、MemStore上限(GB)、MemStore使用率(%)、CPU使用(核)、CPU配额(核)、CPU使用率(%)。
- 库级数据量明细:列 tenant_id、database_name、database_id、data_size(MB)、required_size(MB),按 data_size 降序。
注意事项:
- 必须连到 oceanbase 库(-D oceanbase),脚本访问 oceanbase.gv$sysstat、oceanbase.cdb_ob_table_locations、oceanbase.__all_virtual_tablet_pointer_status、oceanbase.CDB_OBJECTS。
- 需要对上述系统视图的查询权限(通常为 sys 租户或具备 DBA/只读监控权限的账号)。
- 增量指标(QPS/TPS/IO 读写)依赖两次快照,脚本含 SLEEP(5) 会阻塞当前会话约 5 秒。
- 注释自述"全部3节点汇总",实际 SUM(value) 汇总维度取决于集群 observer 节点数。
- 除法均用 NULLIF(...,0) 保护,分母为 0 时对应百分比返回 NULL。
- CPU/MemStore 等部分指标在 gv$sysstat 中按×100 存储,脚本里对 cpu usage、min cpus 显式除以 100 还原。
- 源码未体现具体 OceanBase 版本要求;所用视图为 4.x 常用,建议在 4.x 环境验证字段可用性。
纯 Python3 标准库实现,零依赖。对 OCP 的 集群参数 / 租户参数 / OBProxy 参数 做批量查询、合规比对、修正与回滚。实测兼容 OCP 4.3.5 / 4.4.2。
功能:
- 查询:批量拉取参数当前值,与标准值比对,输出 CSV(标 ✓/✗)+ 汇总日志;失败的租户自动按 428(缺密码)/ 500(连接失败)归类
- 修正 (fix):把不符合标准的参数批量改为标准值(dry-run 预览 +
--apply执行,交互确认),改前在线复核 + 自动生成回滚文件 - 回滚 (rollback):按回滚文件把参数改回原值
用法:
python3 ocp_params.py init # 生成默认 config.py(首次使用)
python3 ocp_params.py # 查询参数,输出 CSV + summary.log
python3 ocp_params.py fix # dry-run:显示修改计划
python3 ocp_params.py fix --apply # 执行修改(交互确认)
python3 ocp_params.py rollback # 回滚:把参数改回原值
python3 ocp_params.py -h # 帮助首次使用需编辑 config.py,填入 OCP 地址与凭据(密码推荐用 env:环境变量名,避免明文落盘)。
特性:自适应并发(遇 429/5xx 自动降档)、多 OCP 并行、写前在线复核防覆盖、审计完整性 sha256 校验。
公众号:勇敢DBA不怕困难 —— 解锁更多数据库运维知识