前言
OceanBase 的日常运维和传统单机数据库有明显区别。它不仅需要管理数据库对象和 SQL,还需要同时关注集群、Zone、OBServer、租户、资源单元、资源池、日志流、合并任务以及备份恢复。
对于刚接触 OceanBase 的 DBA 来说,最容易出现的问题不是某条 SQL 不会写,而是没有建立起完整的运维视角:在 OceanBase 中,集群是基础设施层,租户是数据库服务层,资源池和 Unit 是资源隔离层。很多看似普通的连接失败、SQL 变慢或磁盘空间异常,最终都可能与租户资源分配、OBServer 状态或者集群合并任务有关。
本文整理了 OceanBase DBA 日常工作中比较实用的 100 条命令,覆盖以下场景:
- OBD 集群管理
- OBServer 与 Zone 状态检查
- 租户与资源管理
- 数据库对象和空间查询
- 会话、事务和锁排查
- SQL 性能分析
- 执行计划与 Trace
- 参数与合并管理
- 备份、归档和恢复
- 用户及权限管理
OceanBase 社区版主要提供 MySQL 兼容模式,系统租户通常使用 root@sys 登录,租户级运维则应连接到具体业务租户。OceanBase 的系统视图大部分位于 oceanbase 数据库下。
本文以 OceanBase 4.x 为基础。不同的小版本可能存在视图字段或语法差异,执行前建议先在测试环境验证。
命令中的集群名、租户名、IP、端口、目录和密码均为示例,需要根据实际环境替换。
标记为“高危”的命令可能停止服务、删除租户或者改变集群状态,生产环境必须谨慎执行。
一、OBD 集群管理命令
OceanBase Database Proxy、OBServer 和集群配置通常可以通过 OBD 统一管理。对于使用 OBD 部署的社区版环境,下面这些命令是最基础的运维入口。OBD 官方提供了集群部署、启动、停止、扩容、升级和租户查看等完整命令。
1. 查看 OBD 版本
obd --version
用于确认当前服务器安装的 OBD 版本。
2. 查看 OBD 管理的所有集群
obd cluster list
可以查看集群名称、部署状态以及对应组件版本。
3. 查看指定集群详细信息
obd cluster display obcluster
用于查看集群内 OBServer、OBProxy、Prometheus 等组件的节点地址和运行状态。
4. 启动 OceanBase 集群
obd cluster start obcluster
启动指定集群中的 OceanBase 相关组件。
5. 停止 OceanBase 集群
obd cluster stop obcluster
高危命令。
该命令会停止整个集群,生产环境执行前必须确认业务已经停止访问。
6. 重启 OceanBase 集群
obd cluster restart obcluster
重启集群内所有受 OBD 管理的组件。
生产环境不建议在未分析故障原因的情况下直接执行集群重启。
7. 编辑集群配置
obd cluster edit-config obcluster
进入集群配置编辑界面。
修改完成后,通常需要执行配置重载或者重启对应组件。
8. 根据 YAML 文件部署集群
obd cluster deploy obcluster -c deploy.yaml
高危命令。
根据 YAML 配置文件创建新的 OceanBase 集群。
9. 为集群增加 OBServer 节点
obd cluster scale_out obcluster -c scale_out.yaml
根据扩容配置文件向现有集群增加 OBServer 或其他组件节点。
扩容前需要检查新节点的磁盘、端口、用户、目录、时钟同步和网络连通性。
10. 升级 OceanBase 组件
obd cluster upgrade obcluster \
-c oceanbase-ce \
-V <目标版本>
高危命令。
升级前必须核对版本兼容矩阵、备份状态、集群健康状态以及升级路径。
二、连接、进程和日志检查
OceanBase 默认常见端口包括:
- OBServer SQL 端口:2881
- OBServer RPC 端口:2882
- OBProxy 服务端口:2883
具体端口仍应以实际部署配置为准。
11. 查看集群中的租户信息
obd cluster tenant show obcluster
用于查看 OBD 管理集群中的租户列表和连接信息。
12. 直接连接系统租户
obclient \
-h 192.168.10.11 \
-P 2881 \
-u root@sys \
-p
直接连接指定 OBServer 的系统租户。
系统租户主要用于集群、资源、租户和备份管理,不建议承载业务数据。
13. 通过 OBProxy 连接系统租户
obclient \
-h 192.168.10.20 \
-P 2883 \
-u root@sys#obcluster \
-p
通过 OBProxy 连接时,用户名一般采用:
用户名@租户名#集群名
14. 通过 OBProxy 连接业务租户
obclient \
-h 192.168.10.20 \
-P 2883 \
-u app_user@app_tenant#obcluster \
-p
业务应用通常也应通过 OBProxy 访问 OceanBase,以避免直接依赖某个 OBServer 节点。
15. 执行 SQL 脚本
obclient \
-h 192.168.10.20 \
-P 2883 \
-u root@sys#obcluster \
-p \
< init.sql
适合执行初始化脚本、巡检脚本或者批量 SQL。
16. 查看 OceanBase 数据库版本
SELECT VERSION();
用于确认当前连接节点对应的 OceanBase 数据库版本。
17. 查看 OceanBase 相关进程
ps -ef | grep -E 'observer|obproxy' | grep -v grep
检查 OBServer 和 OBProxy 进程是否存在。
18. 检查 OceanBase 端口监听
ss -lntp | grep -E '2881|2882|2883'
可以快速检查 SQL、RPC 和 OBProxy 端口是否正常监听。
19. 实时查看 OBServer 日志
tail -f /home/admin/oceanbase/log/observer.log
observer.log 是排查 OBServer 启动失败、参数问题、内部错误和性能异常的重要日志。
20. 检索 RootService 错误日志
grep -E 'ERROR|WDIAG|WARN' \
/home/admin/oceanbase/log/rootservice.log \
| tail -100
RootService 负责租户管理、资源调度、合并、负载均衡等核心管理工作,其日志对集群级故障排查非常重要。
三、OBServer、Zone 和磁盘状态检查
GV$OB_SERVERS 可以查看集群中所有 OBServer 的 CPU、内存、日志盘和数据盘使用情况,是 OceanBase 集群巡检中最重要的视图之一。
21. 查看所有 OBServer 状态
SELECT *
FROM oceanbase.GV$OB_SERVERS\G
用于查看每个 OBServer 的地址、Zone、资源容量和磁盘状态。
22. 查看所有 Zone
SELECT *
FROM oceanbase.DBA_OB_ZONES;
重点关注 Zone 的状态、类型和区域分布。
23. 查看 OBServer CPU 和内存分配
SELECT
SVR_IP,
SVR_PORT,
ZONE,
CPU_CAPACITY,
CPU_ASSIGNED,
CPU_CAPACITY - CPU_ASSIGNED AS CPU_FREE,
ROUND(MEM_CAPACITY / 1024 / 1024 / 1024, 2) AS MEM_CAPACITY_GB,
ROUND(MEM_ASSIGNED / 1024 / 1024 / 1024, 2) AS MEM_ASSIGNED_GB
FROM oceanbase.GV$OB_SERVERS
ORDER BY ZONE, SVR_IP;
如果 CPU_ASSIGNED 或 MEM_ASSIGNED 已接近总容量,后续创建租户、扩容 Unit 或资源迁移可能失败。
24. 查看数据盘使用率
SELECT
SVR_IP,
SVR_PORT,
ROUND(DATA_DISK_CAPACITY / 1024 / 1024 / 1024, 2)
AS DATA_CAPACITY_GB,
ROUND(DATA_DISK_IN_USE / 1024 / 1024 / 1024, 2)
AS DATA_USED_GB,
ROUND(
DATA_DISK_IN_USE /
NULLIF(DATA_DISK_CAPACITY, 0) * 100,
2
) AS DATA_USED_PCT
FROM oceanbase.GV$OB_SERVERS
ORDER BY DATA_USED_PCT DESC;
OceanBase 数据盘空间不足可能影响转储、合并、数据迁移和正常写入。
25. 查看 clog 日志盘使用率
SELECT
SVR_IP,
SVR_PORT,
ROUND(LOG_DISK_CAPACITY / 1024 / 1024 / 1024, 2)
AS LOG_CAPACITY_GB,
ROUND(LOG_DISK_IN_USE / 1024 / 1024 / 1024, 2)
AS LOG_USED_GB,
ROUND(
LOG_DISK_IN_USE /
NULLIF(LOG_DISK_CAPACITY, 0) * 100,
2
) AS LOG_USED_PCT
FROM oceanbase.GV$OB_SERVERS
ORDER BY LOG_USED_PCT DESC;
日志盘空间与 OceanBase 的事务日志、日志流和副本同步直接相关,需要单独监控。
26. 检查数据盘健康状态
SELECT
SVR_IP,
SVR_PORT,
ZONE,
DATA_DISK_HEALTH_STATUS
FROM oceanbase.GV$OB_SERVERS
WHERE DATA_DISK_HEALTH_STATUS <> 'NORMAL';
正常情况下,该查询不应返回异常节点。
27. 查看 observer 进程 CPU 和线程状态
pidstat -p "$(pidof observer)" 1
适合观察 observer 进程 CPU、上下文切换和运行状态。
28. 查看磁盘 I/O 延迟
iostat -x 1
重点关注:
%utilawaitr_awaitw_awaitaqu-sz
OceanBase 对磁盘延迟较为敏感,尤其是日志盘和数据盘发生持续高延迟时。
29. 查看文件系统空间
df -hT
除了数据盘,还要检查:
- OceanBase 安装目录
- 日志目录
- clog 目录
- 备份目录
- 临时目录
30. 查看最近的 RootService 事件
SELECT *
FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY
LIMIT 100;
可以用于排查租户创建、资源调度、Unit 迁移、节点上下线以及合并相关事件。
四、租户、Unit 和资源池查询
OceanBase 的租户资源通常由三层对象组成:
Resource Unit Config
↓
Resource Pool
↓
Tenant
创建租户时,一般先创建 Unit 配置,再创建资源池,最后将资源池分配给租户。
31. 查看所有租户
SELECT *
FROM oceanbase.DBA_OB_TENANTS;
在系统租户执行,可以查看当前集群中的用户租户、系统租户和 Meta 租户。
32. 查看租户核心信息
SELECT
TENANT_ID,
TENANT_NAME,
TENANT_TYPE,
COMPATIBILITY_MODE,
STATUS,
TENANT_ROLE,
PRIMARY_ZONE,
LOCALITY
FROM oceanbase.DBA_OB_TENANTS
ORDER BY TENANT_ID;
重点关注租户状态、兼容模式、主 Zone 和副本分布。
33. 查看 Unit 配置
SELECT *
FROM oceanbase.DBA_OB_UNIT_CONFIGS;
Unit 配置定义单个资源单元可使用的 CPU、内存、IOPS 和日志盘资源。
34. 查看资源池
SELECT *
FROM oceanbase.DBA_OB_RESOURCE_POOLS;
资源池是 Unit 的集合,并最终分配给租户。
35. 查看 Unit 分布
SELECT *
FROM oceanbase.DBA_OB_UNITS;
可以查看每个 Unit 当前分配到哪个租户、资源池、Zone 和 OBServer。
36. 联合查看资源池和 Unit 配置
SELECT
P.RESOURCE_POOL_ID,
P.NAME AS RESOURCE_POOL_NAME,
P.TENANT_ID,
P.UNIT_COUNT,
C.UNIT_CONFIG_ID,
C.NAME AS UNIT_CONFIG_NAME,
C.MAX_CPU,
ROUND(C.MEMORY_SIZE / 1024 / 1024 / 1024, 2)
AS MEMORY_GB
FROM oceanbase.DBA_OB_RESOURCE_POOLS P
JOIN oceanbase.DBA_OB_UNIT_CONFIGS C
ON P.UNIT_CONFIG_ID = C.UNIT_CONFIG_ID
ORDER BY P.RESOURCE_POOL_ID;
不同版本的字段名称可能略有差异,执行前可先使用 DESC 查看视图结构。
37. 创建 Unit 配置
CREATE RESOURCE UNIT app_unit
MAX_CPU = 4,
MEMORY_SIZE = '8G',
MAX_IOPS = 10000,
MIN_IOPS = 5000,
IOPS_WEIGHT = 1,
LOG_DISK_SIZE = '20G';
Unit 配置决定租户单个 Unit 可使用的资源上限。
38. 修改 Unit 配置
ALTER RESOURCE UNIT app_unit
MAX_CPU = 8,
MEMORY_SIZE = '16G';
调整 Unit 资源前,需要确认集群 OBServer 是否仍有足够的可分配资源。
39. 创建资源池
CREATE RESOURCE POOL app_pool
UNIT = 'app_unit',
UNIT_NUM = 1,
ZONE_LIST = ('zone1', 'zone2', 'zone3');
资源池中的 Unit 会按照 Zone 分布。
40. 修改资源池 Unit 数量
ALTER RESOURCE POOL app_pool
UNIT_NUM = 2;
增加 UNIT_NUM 可以扩展租户在每个 Zone 中的资源单元数量。
五、租户创建、修改和删除
租户是 OceanBase 对外提供数据库服务的基本单位。租户拥有独立的用户、数据库对象、系统变量、资源配额和事务环境。
41. 创建 MySQL 模式租户
CREATE TENANT IF NOT EXISTS app_tenant
CHARSET = 'utf8mb4',
PRIMARY_ZONE = 'zone1;zone2;zone3',
RESOURCE_POOL_LIST = ('app_pool')
SET
ob_tcp_invited_nodes = '%';
创建完成后,可以通过下面的用户名登录:
root@app_tenant
42. 修改租户 Primary Zone
ALTER TENANT app_tenant
PRIMARY_ZONE = 'zone2;zone1;zone3';
Primary Zone 会影响租户领导副本的优先分布。
43. 修改租户 Locality
ALTER TENANT app_tenant
LOCALITY = 'F@zone1,F@zone2,F@zone3';
高危配置变更。
Locality 决定租户副本类型和副本分布。修改前必须确认目标 Zone 和资源池能够满足新的副本要求。
44. 锁定租户
ALTER TENANT app_tenant LOCK;
锁定后,该租户的普通用户通常不能正常登录。
45. 解锁租户
ALTER TENANT app_tenant UNLOCK;
用于恢复被锁定租户的登录能力。
46. 修改租户系统变量
ALTER TENANT app_tenant
SET VARIABLES
ob_tcp_invited_nodes = '10.0.0.0/8';
用于限制允许访问该租户的客户端网段。
修改访问白名单前,应确认 DBA 管理地址不会被误排除。
47. 查看租户创建语句
SHOW CREATE TENANT app_tenant\G
适合核对租户的资源池、Locality、Primary Zone 和系统变量配置。
48. 删除租户
DROP TENANT app_tenant;
高危命令。
删除租户前应确认:
- 业务已停止访问
- 备份有效
- 数据不再需要
- 租户名称无误
- 没有恢复或备份任务正在运行
49. 强制彻底删除租户
DROP TENANT app_tenant PURGE;
极高危命令。
PURGE 会跳过回收站保留逻辑,执行后通常无法通过租户回收站恢复。
50. 删除资源池和 Unit 配置
DROP RESOURCE POOL app_pool;
DROP RESOURCE UNIT app_unit;
必须先确保资源池已经不再分配给任何租户。
删除顺序通常为:
删除租户
↓
删除资源池
↓
删除 Unit 配置
六、数据库对象和空间查询
下面这些命令应在具体业务租户中执行,而不是在 sys 租户执行。
51. 查看指定数据库中的表
SHOW TABLES FROM appdb;
用于快速查看数据库对象。
52. 查看表结构和建表语句
SHOW CREATE TABLE appdb.orders\G
可以检查分区、索引、字符集、压缩方式和表属性。
53. 查看表索引
SHOW INDEX FROM appdb.orders;
重点关注:
- 索引名称
- 是否唯一
- 索引列顺序
- 基数估算
- 索引类型
54. 查看租户内表空间使用情况
SELECT *
FROM oceanbase.DBA_OB_TABLE_SPACE_USAGE
WHERE DATABASE_NAME = 'appdb';
DBA_OB_TABLE_SPACE_USAGE 可以查看当前租户中表和索引的空间使用情况。
55. 查看占用空间最大的表
SELECT
DATABASE_NAME,
TABLE_NAME,
SIZE
FROM oceanbase.DBA_OB_TABLE_SPACE_USAGE
ORDER BY SIZE DESC
LIMIT 20;
适合快速定位大表。
不同版本中 SIZE 的单位和视图字段可能存在差异,应结合当前版本文档确认。
56. 通过 information_schema 查看表信息
SELECT
TABLE_SCHEMA,
TABLE_NAME,
TABLE_TYPE,
ENGINE,
TABLE_ROWS,
CREATE_TIME,
UPDATE_TIME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'appdb'
ORDER BY TABLE_NAME;
TABLE_ROWS 通常属于统计估算值,不应直接作为精确行数使用。
57. 查看分区表信息
SELECT
TABLE_SCHEMA,
TABLE_NAME,
PARTITION_NAME,
PARTITION_METHOD,
PARTITION_EXPRESSION,
PARTITION_DESCRIPTION,
TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'appdb'
AND TABLE_NAME = 'orders'
ORDER BY PARTITION_ORDINAL_POSITION;
适合检查分区数量、分区表达式和分区边界。
58. 查看表分区和副本位置
SELECT *
FROM oceanbase.DBA_OB_TABLE_LOCATIONS
WHERE DATABASE_NAME = 'appdb'
AND TABLE_NAME = 'orders';
可以查看表对应 Tablet、日志流以及副本所在 OBServer。
59. 收集表统计信息
ANALYZE TABLE appdb.orders;
当表数据发生大幅变化、执行计划明显异常或者索引选择不合理时,可以考虑重新收集统计信息。
60. 创建普通索引
ALTER TABLE appdb.orders
ADD INDEX idx_orders_status(status);
在大表上创建索引前,需要评估:
- 索引创建时间
- 对 CPU 和 IO 的影响
- 磁盘空间
- 业务写入压力
- 是否存在重复索引
七、会话和事务排查
GV$OB_PROCESSLIST 可以从集群维度查看租户会话,GV$OB_TRANSACTION_PARTICIPANTS 可以查看事务参与者及事务上下文。
61. 查看当前节点会话
SHOW FULL PROCESSLIST;
适合快速查看当前连接节点上的用户会话和正在执行的 SQL。
62. 查看租户全部节点会话
SELECT *
FROM oceanbase.GV$OB_PROCESSLIST;
与 SHOW PROCESSLIST 相比,GV$OB_PROCESSLIST 更适合集群级会话排查。
63. 查看正在执行的非空闲会话
SELECT *
FROM oceanbase.GV$OB_PROCESSLIST
WHERE COMMAND <> 'Sleep'
ORDER BY TIME DESC;
可以快速筛选正在执行 SQL 的会话。
64. 查看执行超过 60 秒的会话
SELECT
SVR_IP,
SVR_PORT,
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM oceanbase.GV$OB_PROCESSLIST
WHERE TIME > 60
ORDER BY TIME DESC;
对于长时间运行 SQL,还需要结合 SQL Audit、执行计划和等待情况进一步判断。
65. 终止当前查询但保留连接
KILL QUERY <SESSION_ID>;
适合中止异常查询,但保留客户端连接。
66. 终止整个客户端连接
KILL CONNECTION <SESSION_ID>;
执行后客户端连接会断开,未提交事务通常会回滚。
67. 使用 OceanBase 命令终止会话
ALTER SYSTEM KILL SESSION '<SESSION_ID>';
部分版本还支持立即终止模式:
ALTER SYSTEM KILL SESSION '<SESSION_ID>' IMMEDIATE;
OceanBase 官方提供了 ALTER SYSTEM KILL SESSION 语法用于终止会话。
68. 查看当前事务参与者
SELECT *
FROM oceanbase.GV$OB_TRANSACTION_PARTICIPANTS;
可以查看事务 ID、会话 ID、事务上下文创建时间以及待写入日志大小等信息。
69. 查看长时间未结束的事务
SELECT
SVR_IP,
SVR_PORT,
TENANT_ID,
SESSION_ID,
TX_ID,
CTX_CREATE_TIME,
TIMESTAMPDIFF(
SECOND,
CTX_CREATE_TIME,
NOW()
) AS TX_SECONDS,
PENDING_LOG_SIZE
FROM oceanbase.GV$OB_TRANSACTION_PARTICIPANTS
ORDER BY TX_SECONDS DESC;
对于长事务,要进一步确认:
- 是否长时间未提交
- 是否产生大量 Undo 或事务日志
- 是否阻塞其他事务
- 是否由批处理程序引起
- 是否存在网络中断或连接池异常
70. 查看事务超时参数
SHOW VARIABLES LIKE 'ob_trx_timeout';
ob_trx_timeout 通常以微秒为单位,修改前必须确认单位。
例如,设置事务超时为 120 秒:
SET SESSION ob_trx_timeout = 120000000;
八、锁、死锁和 SQL Audit 排查
OceanBase 的 SQL Audit 是性能排查的重要入口,它记录 SQL 的执行耗时、CPU 时间、逻辑读、物理读、返回码、Trace ID 和执行文本等信息。相关时间字段通常以微秒为单位。
71. 查看锁等待信息
SELECT *
FROM oceanbase.GV$OB_LOCK_WAIT_STAT;
该视图在部分 OceanBase 版本中可用于查看锁等待关系。
如果当前版本不存在该视图,可以先检查:
SHOW TABLES
FROM oceanbase
LIKE '%LOCK%';
72. 查看死锁历史
SELECT *
FROM oceanbase.DBA_OB_DEADLOCK_EVENT_HISTORY;
该视图可以用于查询 OceanBase 记录的死锁事件。
73. 查看耗时超过 1 秒的 SQL
SELECT
SVR_IP,
SVR_PORT,
SQL_ID,
TRACE_ID,
ELAPSED_TIME,
EXECUTE_TIME,
CPU_TIME,
RETURN_CODE,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE ELAPSED_TIME > 1000000
ORDER BY ELAPSED_TIME DESC
LIMIT 20;
1000000 微秒等于 1 秒。
74. 按 SQL_ID 统计累计耗时
SELECT
SQL_ID,
COUNT(*) AS EXECUTIONS,
ROUND(SUM(ELAPSED_TIME) / 1000000, 2)
AS TOTAL_SECONDS,
ROUND(AVG(ELAPSED_TIME) / 1000, 2)
AS AVG_MS,
MIN(QUERY_SQL) AS QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE IS_INNER_SQL = 0
GROUP BY SQL_ID
ORDER BY SUM(ELAPSED_TIME) DESC
LIMIT 20;
这类 SQL 比单纯按单次耗时排序更有价值,因为高频、小耗时 SQL 也可能消耗大量集群资源。
75. 查看 CPU 消耗最高的 SQL
SELECT
SVR_IP,
SQL_ID,
TRACE_ID,
ROUND(CPU_TIME / 1000, 2) AS CPU_MS,
ROUND(ELAPSED_TIME / 1000, 2) AS ELAPSED_MS,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE IS_INNER_SQL = 0
ORDER BY CPU_TIME DESC
LIMIT 20;
如果 CPU 时间接近总耗时,通常说明 SQL 主要消耗在计算过程,而不是等待磁盘或网络。
76. 查看逻辑读最高的 SQL
SELECT
SQL_ID,
TRACE_ID,
LOGICAL_READS,
ELAPSED_TIME,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE IS_INNER_SQL = 0
ORDER BY LOGICAL_READS DESC
LIMIT 20;
逻辑读高通常意味着扫描的数据块较多,需要重点检查:
- 是否缺少索引
- 是否索引选择性较差
- 是否存在大范围扫描
- 分区裁剪是否生效
- SQL 条件是否发生隐式转换
77. 查看物理读最高的 SQL
SELECT
SQL_ID,
TRACE_ID,
PHYSICAL_READS,
ELAPSED_TIME,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE IS_INNER_SQL = 0
ORDER BY PHYSICAL_READS DESC
LIMIT 20;
物理读高可能说明缓存命中率较低或者 SQL 访问了大量冷数据。
78. 查看执行失败的 SQL
SELECT
REQUEST_TIME,
SVR_IP,
SQL_ID,
TRACE_ID,
RETURN_CODE,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE RETURN_CODE <> 0
ORDER BY REQUEST_TIME DESC
LIMIT 50;
RETURN_CODE 是内部返回码,排查时还需要结合客户端错误、observer 日志和 Trace ID。
79. 根据 Trace ID 查询完整执行记录
SELECT *
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE TRACE_ID = '<TRACE_ID>'\G
Trace ID 是串联客户端请求、SQL Audit 和 OBServer 日志的重要标识。
80. 根据 SQL_ID 查询执行历史
SELECT
REQUEST_TIME,
SVR_IP,
SVR_PORT,
TRACE_ID,
ELAPSED_TIME,
CPU_TIME,
LOGICAL_READS,
PHYSICAL_READS,
RETURN_CODE,
QUERY_SQL
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE SQL_ID = '<SQL_ID>'
ORDER BY REQUEST_TIME DESC
LIMIT 100;
适合分析同一条 SQL 在不同时间、不同 OBServer 上的性能波动。
九、执行计划、Trace、参数和合并管理
81. 查看 Plan Cache 整体状态
SELECT *
FROM oceanbase.GV$OB_PLAN_CACHE_STAT;
用于查看各 OBServer 上租户 Plan Cache 的内存使用和缓存状态。
82. 根据 SQL_ID 查看缓存执行计划
SELECT *
FROM oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT
WHERE SQL_ID = '<SQL_ID>'\G
可以获取:
- PLAN_ID
- SQL_ID
- 执行次数
- 平均耗时
- 计划生成时间
- 计划缓存状态
- 所在 OBServer
83. 查看 Plan Cache 中的详细执行计划
SELECT DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(
'<SVR_IP>',
<SVR_PORT>,
<TENANT_ID>,
<PLAN_ID>
);
不同 OceanBase 小版本的执行计划查看函数和参数可能存在差异,应以当前版本的 DBMS_XPLAN 文档为准。较新的版本通常需要同时提供服务器、租户和计划 ID。
84. 查看 SQL 静态执行计划
EXPLAIN
SELECT *
FROM appdb.orders
WHERE status = 1;
重点关注:
- TABLE SCAN 还是 INDEX SCAN
- 扫描行数
- 过滤条件
- 分区裁剪
- JOIN 顺序
- JOIN 算法
- 是否存在排序和临时结果集
85. 开启会话级 Show Trace
SET ob_enable_show_trace = ON;
该设置仅对当前会话生效。
86. 查看最近一条 SQL 的执行 Trace
SELECT COUNT(*)
FROM appdb.orders
WHERE status = 1;SHOW TRACE;
SHOW TRACE 可以查看 SQL 在 OceanBase 内部的执行阶段和耗时分布,是分析响应时间的重要工具。
87. 查看 OceanBase 参数
SHOW PARAMETERS LIKE 'syslog_level';
也可以直接查询参数视图:
SELECT *
FROM oceanbase.GV$OB_PARAMETERS
WHERE NAME = 'syslog_level';
88. 临时调整日志级别
ALTER SYSTEM SET syslog_level = 'WDIAG';
开启更详细日志可能明显增加日志量,只应在问题排查期间使用。
排查结束后应及时恢复:
ALTER SYSTEM SET syslog_level = 'INFO';
89. 手动触发 Major Freeze
ALTER SYSTEM MAJOR FREEZE;
高危运维命令。
Major Freeze 会推动集群进入下一轮大版本冻结和合并流程,不建议在集群负载较高、磁盘空间紧张或者正在执行其他重大任务时随意触发。
90. 查看大合并状态
SELECT *
FROM oceanbase.DBA_OB_MAJOR_COMPACTION;
还可以查看冻结历史:
SELECT *
FROM oceanbase.DBA_OB_FREEZE_INFO;
巡检时应重点关注:
- 合并是否长时间未完成
- 各 Zone 合并进度是否一致
- 是否存在合并错误
- SCN 是否持续推进
- 数据盘空间是否足够
十、归档、备份、恢复和权限管理
OceanBase 物理备份以租户为单位。执行备份前,通常需要先配置日志归档目的端和数据备份目的端,并启动归档。
91. 配置租户日志归档目录
ALTER SYSTEM SET LOG_ARCHIVE_DEST =
'LOCATION=file:///data/obbackup/archive
BINDING=Optional
PIECE_SWITCH_INTERVAL=1d'
TENANT = app_tenant;
实际环境也可以使用对象存储作为归档介质,具体格式取决于 OceanBase 版本和存储类型。
92. 启动租户日志归档
ALTER SYSTEM ARCHIVELOG
TENANT = app_tenant;
停止日志归档:
ALTER SYSTEM NOARCHIVELOG
TENANT = app_tenant;
启动后必须检查归档状态,不能仅以命令执行成功作为判断依据。
93. 配置数据备份目录
ALTER SYSTEM SET DATA_BACKUP_DEST =
'file:///data/obbackup/data'
TENANT = app_tenant;
备份目录需要满足:
- 所有相关节点可访问
- OceanBase 运行用户具有读写权限
- 空间充足
- 网络和存储稳定
- 不与生产数据目录混用
94. 执行租户全量备份
ALTER SYSTEM BACKUP
TENANT = app_tenant;
备份并包含归档日志:
ALTER SYSTEM BACKUP
TENANT = app_tenant
PLUS ARCHIVELOG;
OceanBase 官方支持针对指定租户执行全量或增量备份。
95. 查看日志归档状态
SELECT *
FROM oceanbase.DBA_OB_ARCHIVELOG;
启动备份前,应确认归档状态正常推进,而不是处于停止、异常或卡住状态。
96. 查看当前备份任务
SELECT *
FROM oceanbase.DBA_OB_BACKUP_JOBS;
在系统租户中,也可以查看集群范围的备份任务视图:
SELECT *
FROM oceanbase.CDB_OB_BACKUP_JOBS;
97. 查看备份任务明细和历史
SELECT *
FROM oceanbase.DBA_OB_BACKUP_TASKS;
查看已结束的备份任务:
SELECT *
FROM oceanbase.DBA_OB_BACKUP_JOB_HISTORY;
OceanBase 提供当前任务、任务明细和历史任务等多类备份视图。
98. 按时间点恢复租户
ALTER SYSTEM RESTORE restore_tenant
FROM
'file:///data/obbackup/data,
file:///data/obbackup/archive'
UNTIL TIME = '2026-07-20 10:00:00'
WITH
'pool_list=restore_pool
&locality=F@zone1,F@zone2,F@zone3
&primary_zone=zone1';
极高危命令。
恢复前必须确认:
- 备份目录正确
- 归档日志完整
- 目标恢复时间有效
- 恢复资源池已创建
- 资源池容量足够
- 新租户名称不存在冲突
- Locality 与集群 Zone 匹配
OceanBase 的租户恢复需要指定备份路径、恢复终点以及用于承载恢复租户的资源池。
99. 创建业务用户
CREATE USER 'app_user'@'%'
IDENTIFIED BY 'StrongPassword_2026!';
生产环境不建议允许所有来源地址访问,可以限制具体网段:
CREATE USER 'app_user'@'10.%'
IDENTIFIED BY 'StrongPassword_2026!';
100. 授权并查看用户权限
GRANT
SELECT,
INSERT,
UPDATE,
DELETE
ON appdb.*
TO 'app_user'@'%';
查看用户权限:
SHOW GRANTS
FOR 'app_user'@'%';
回收权限:
REVOKE DELETE
ON appdb.*
FROM 'app_user'@'%';
生产环境应遵循最小权限原则,避免直接向业务账号授予:
GRANT ALL PRIVILEGES ON *.*
OceanBase DBA 日常排查建议
掌握命令只是第一步。真正遇到 OceanBase 故障时,建议按照从集群到租户、从资源到 SQL 的顺序进行排查。
1. 先确认故障范围
首先判断是:
- 单条 SQL 异常
- 单个租户异常
- 单台 OBServer 异常
- 单个 Zone 异常
- 整个集群异常
- OBProxy 或连接层异常
故障范围判断错误,后续排查很容易走偏。
2. 再检查集群基础状态
优先检查:
OBServer 是否全部在线
Zone 状态是否正常
CPU 和内存资源是否耗尽
数据盘和日志盘是否接近满载
大合并是否长时间未完成
是否存在资源迁移或副本异常
3. 然后进入租户和 SQL 层
租户异常时重点检查:
Unit 资源是否充足
资源池分布是否合理
是否存在长事务
是否存在锁等待或死锁
SQL Audit 中是否出现高耗时 SQL
Plan Cache 是否异常
执行计划是否发生变化
4. 最后再考虑参数调整和重启
OceanBase 参数数量较多,但生产问题通常不能仅靠修改参数解决。
尤其不建议在没有明确证据的情况下直接执行:
重启集群
重启 OBServer
修改租户资源
修改 Locality
手动触发 Major Freeze
提高日志级别后长期不恢复
强制终止大量会话
这些操作可能暂时缓解现象,但也可能掩盖真正的问题,甚至扩大故障影响。
总结
OceanBase DBA 与传统 MySQL DBA 最大的区别,是不能只盯着数据库实例和 SQL。OceanBase 是一个原生分布式数据库,日常运维必须同时理解:
集群
OBServer
Zone
租户
资源池
Unit
副本
日志流
合并
SQL Audit
备份与归档
对于刚接触 OceanBase 的 DBA,建议优先掌握以下几个核心入口:
oceanbase.GV$OB_SERVERS
oceanbase.DBA_OB_ZONES
oceanbase.DBA_OB_TENANTS
oceanbase.DBA_OB_UNITS
oceanbase.DBA_OB_RESOURCE_POOLS
oceanbase.GV$OB_PROCESSLIST
oceanbase.GV$OB_TRANSACTION_PARTICIPANTS
oceanbase.GV$OB_SQL_AUDIT
oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT
oceanbase.DBA_OB_MAJOR_COMPACTION
如果这些视图能够熟练使用,绝大多数 OceanBase 日常巡检、租户资源检查、SQL 性能分析和故障定位工作都能够找到较明确的排查方向。
版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除
想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

17认证网








