Skip to content

OceanBase 内置诊断命令

核心概念

内置诊断命令是指OceanBase数据库提供的用于监控、分析和诊断数据库状态的命令,这些命令可以帮助运维人员快速了解数据库的运行状况,识别性能瓶颈和故障原因。内置诊断命令涵盖集群状态检查、性能分析、故障诊断等多个方面,是OceanBase运维的重要工具。

集群状态检查命令

1. 集群整体状态

1.1 SHOW CLUSTER STATUS

功能:查看OceanBase集群的整体状态 语法

sql
SHOW CLUSTER STATUS;

示例输出

StatusValue
cluster_id1
cluster_nameobcluster
statusACTIVE
zone_listzone1,zone2,zone3
server_list3
tenant_list2

1.2 ADMIN_CMD('show cluster status')

功能:查看更详细的集群状态信息 语法

sql
ADMIN_CMD('show cluster status');

2. 节点状态

2.1 SHOW SERVER STATUS

功能:查看所有节点的状态 语法

sql
SHOW SERVER STATUS;

2.2 查询GV$OB_SERVERS视图

功能:查看节点的详细信息,包括IP、端口、状态、资源使用情况等 语法

sql
SELECT * FROM oceanbase.GV$OB_SERVERS;

常用字段说明

  • svr_ip: 节点IP地址
  • svr_port: 节点端口
  • status: 节点状态(ACTIVE/INACTIVE)
  • cpu_total: 总CPU核心数
  • cpu_assigned: 已分配的CPU核心数
  • mem_total: 总内存大小
  • mem_assigned: 已分配的内存大小
  • disk_total: 总磁盘大小
  • disk_assigned: 已分配的磁盘大小

3. 副本状态

3.1 查询GV$OB_PARTITIONS视图

功能:查看分区和副本的状态 语法

sql
SELECT * FROM oceanbase.GV$OB_PARTITIONS WHERE table_name = 'table_name';

常用字段说明

  • table_id: 表ID
  • partition_id: 分区ID
  • partition_name: 分区名称
  • role: 副本角色(LEADER/FOLLOWER)
  • status: 副本状态
  • zone: 副本所在的zone
  • svr_ip: 副本所在的节点IP

3.2 查询GV$OB_REPLICA视图

功能:查看副本的详细信息 语法

sql
SELECT * FROM oceanbase.GV$OB_REPLICA;

性能分析命令

1. 会话和连接

1.1 SHOW PROCESSLIST

功能:查看当前活跃的会话和连接 语法

sql
SHOW PROCESSLIST;

示例输出

IdUserHostdbCommandTimeStateInfo
1root192.168.1.100:54321test_dbSleep10NULL
2app192.168.1.101:54322test_dbQuery0initSELECT * FROM t1

1.2 查询GV$OB_SESSIONS视图

功能:查看更详细的会话信息 语法

sql
SELECT * FROM oceanbase.GV$OB_SESSIONS;

2. 慢SQL分析

2.1 查询GV$OB_SLOW_QUERY视图

功能:查看慢SQL日志 语法

sql
SELECT * FROM oceanbase.GV$OB_SLOW_QUERY ORDER BY query_time DESC LIMIT 10;

常用字段说明

  • query_id: 查询ID
  • sql_id: SQL语句ID
  • sql_text: SQL语句文本
  • query_time: 查询执行时间
  • parse_time: 解析时间
  • execute_time: 执行时间
  • rows_examined: 扫描的行数
  • rows_returned: 返回的行数

2.2 ADMIN_CMD('trace session')

功能:跟踪指定会话的执行情况 语法

sql
ADMIN_CMD('trace session <session_id> start');
-- 执行需要跟踪的操作
ADMIN_CMD('trace session <session_id> stop');
ADMIN_CMD('trace session <session_id> show');

3. 执行计划分析

3.1 EXPLAIN

功能:查看SQL语句的执行计划 语法

sql
EXPLAIN SELECT * FROM table_name WHERE condition;

示例输出

IDOPERATORNAMEEST. ROWSCOST
0TABLE SCANt1100000100

Outputs & filters:

  • 0 - output([t1.col1], [t1.col2]), filter(nil), rowset=200 access([t1.col1], [t1.col2]), partitions(p0)

3.2 EXPLAIN EXTENDED

功能:查看更详细的执行计划信息 语法

sql
EXPLAIN EXTENDED SELECT * FROM table_name WHERE condition;

4. 统计信息

4.1 ANALYZE TABLE

功能:收集表的统计信息 语法

sql
ANALYZE TABLE table_name;

4.2 SHOW STATS

功能:查看表的统计信息 语法

sql
SHOW STATS FOR TABLE table_name;

故障诊断命令

1. 日志查询

1.1 ADMIN_CMD('show log')

功能:查看OceanBase日志 语法

sql
ADMIN_CMD('show log <log_type> <limit>');

参数说明

  • log_type: 日志类型,如error、warn、info等
  • limit: 显示的日志条数

示例

sql
ADMIN_CMD('show log error 10');

1.2 查询GV$OB_ERRORS视图

功能:查看错误日志 语法

sql
SELECT * FROM oceanbase.GV$OB_ERRORS ORDER BY timestamp DESC LIMIT 10;

2. 锁和死锁

2.1 查询GV$OB_LOCKS视图

功能:查看当前的锁信息 语法

sql
SELECT * FROM oceanbase.GV$OB_LOCKS;

常用字段说明

  • lock_type: 锁类型
  • lock_mode: 锁模式(S/X/IS/IX)
  • table_id: 表ID
  • partition_id: 分区ID
  • session_id: 持有锁的会话ID
  • block_session_id: 被阻塞的会话ID

2.2 查询GV$OB_DEADLOCKS视图

功能:查看死锁信息 语法

sql
SELECT * FROM oceanbase.GV$OB_DEADLOCKS ORDER BY occur_time DESC;

3. 网络诊断

3.1 ADMIN_CMD('ping server')

功能:测试节点间的网络连通性 语法

sql
ADMIN_CMD('ping server <svr_ip> <svr_port>');

示例

sql
ADMIN_CMD('ping server 192.168.1.101 2882');

3.2 查询GV$OB_NETWORK_STAT视图

功能:查看网络统计信息 语法

sql
SELECT * FROM oceanbase.GV$OB_NETWORK_STAT;

4. 内存诊断

4.1 查询GV$OB_MEMORY视图

功能:查看内存使用情况 语法

sql
SELECT * FROM oceanbase.GV$OB_MEMORY WHERE tenant_id = tenant_id();

常用字段说明

  • module: 内存使用模块
  • total: 总分配内存
  • used: 已使用内存
  • peak: 峰值内存使用

4.2 ADMIN_CMD('show memory')

功能:查看更详细的内存使用信息 语法

sql
ADMIN_CMD('show memory');

存储诊断命令

1. 磁盘和存储

1.1 查询GV$OB_DISK_STAT视图

功能:查看磁盘使用情况 语法

sql
SELECT * FROM oceanbase.GV$OB_DISK_STAT;

常用字段说明

  • path: 磁盘路径
  • total_space: 总磁盘空间
  • free_space: 剩余磁盘空间
  • used_space: 已使用磁盘空间
  • in_use: 是否正在使用

1.2 ADMIN_CMD('show disk usage')

功能:查看磁盘使用详情 语法

sql
ADMIN_CMD('show disk usage');

2. SSTable管理

2.1 查询GV$OB_SSTABLES视图

功能:查看SSTable的信息 语法

sql
SELECT * FROM oceanbase.GV$OB_SSTABLES WHERE table_id = (SELECT table_id FROM oceanbase.DBA_OB_TABLES WHERE table_name = 'table_name');

2.2 ADMIN_CMD('merge status')

功能:查看合并状态 语法

sql
ADMIN_CMD('merge status');

3. 事务日志

3.1 查询GV$OB_ARCHIVELOG视图

功能:查看归档日志信息 语法

sql
SELECT * FROM oceanbase.GV$OB_ARCHIVELOG;

3.2 ADMIN_CMD('show clog status')

功能:查看事务日志(CLOG)的状态 语法

sql
ADMIN_CMD('show clog status');

诊断命令最佳实践

1. 定期执行诊断命令

  • 定期执行集群状态检查命令,如SHOW CLUSTER STATUSSHOW SERVER STATUS
  • 定期查看慢SQL日志,分析性能瓶颈
  • 定期检查节点资源使用情况,如CPU、内存、磁盘等

2. 故障诊断流程

当发生故障时,建议按照以下流程使用诊断命令:

  1. 使用集群状态检查命令,了解集群整体状态
  2. 使用节点状态命令,检查各节点是否正常
  3. 使用会话和连接命令,查看是否有异常连接或会话
  4. 使用慢SQL分析命令,查看是否有性能问题
  5. 使用锁和死锁命令,检查是否有锁冲突
  6. 使用日志查询命令,查看错误日志
  7. 根据诊断结果,定位故障原因并采取相应的修复措施

3. 结合监控系统

  • 将诊断命令的输出集成到监控系统中
  • 配置告警规则,当关键指标异常时自动执行诊断命令
  • 定期保存诊断命令的输出,便于历史分析和对比

4. 权限管理

  • 限制诊断命令的使用权限,只授予运维人员和DBA
  • 使用只读用户执行诊断命令,避免误操作
  • 定期审查诊断命令的使用记录

常见问题(FAQ)

Q1: 如何快速查看集群是否正常?

A1: 可以使用以下命令快速查看集群状态:

sql
SHOW CLUSTER STATUS;
SHOW SERVER STATUS;

如果集群状态为ACTIVE,所有节点状态为ACTIVE,则说明集群正常运行。

Q2: 如何查看当前的慢SQL?

A2: 可以使用以下命令查看慢SQL:

sql
SELECT * FROM oceanbase.GV$OB_SLOW_QUERY ORDER BY query_time DESC LIMIT 10;

或者使用ADMIN_CMD命令:

sql
ADMIN_CMD('show log slow 10');

Q3: 如何查看某个会话正在执行的SQL?

A3: 可以使用以下命令查看会话正在执行的SQL:

sql
SELECT p.id, p.user, p.host, p.db, p.command, p.time, p.state, p.info 
FROM information_schema.processlist p 
WHERE p.id = <session_id>;

Q4: 如何查看锁和死锁信息?

A4: 查看锁信息:

sql
SELECT * FROM oceanbase.GV$OB_LOCKS;

查看死锁信息:

sql
SELECT * FROM oceanbase.GV$OB_DEADLOCKS ORDER BY occur_time DESC;

Q5: 如何查看节点的资源使用情况?

A5: 可以使用以下命令查看节点的资源使用情况:

sql
SELECT svr_ip, svr_port, cpu_total, cpu_assigned, mem_total, mem_assigned, disk_total, disk_assigned 
FROM oceanbase.GV$OB_SERVERS;

Q6: 如何收集表的统计信息?

A6: 可以使用以下命令收集表的统计信息:

sql
ANALYZE TABLE table_name;

或者使用更详细的收集选项:

sql
ANALYZE TABLE table_name COMPUTE STATISTICS FOR ALL COLUMNS;

Q7: 如何查看SQL语句的执行计划?

A7: 可以使用以下命令查看SQL语句的执行计划:

sql
EXPLAIN SELECT * FROM table_name WHERE condition;

对于更详细的执行计划,可以使用:

sql
EXPLAIN EXTENDED SELECT * FROM table_name WHERE condition;