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 STATUS、SHOW 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;