签到成功

知道了

CNDBA社区CNDBA社区

OceanBase 审计视图 gv$ob_sql_audit 说明

2023-09-13 19:12 206 0 原创 OceanBase
作者: dave

1 视图说明

SQL 审计视图(GV$OB_SQL_AUDIT )可以查看在 OceanBase 数据库里执行过的所有 SQL(包含执行失败 SQL),可以用来查看每次请求客户端来源、执行服务器信息、执行状态信息、等待时间以及执行各阶段耗时等。http://www.cndba.cn/dave/article/131448http://www.cndba.cn/dave/article/131448http://www.cndba.cn/dave/article/131448

http://www.cndba.cn/dave/article/131448

1.1 SQL Audit 设置

该功能默认启用:

obclient [oceanbase]> select zone,value  from `GV$OB_PARAMETERS` gop where name like 'enable_sql_audit';
+-------+-------+
| zone  | value |
+-------+-------+
| zone3 | True  |
| zone1 | True  |
| zone2 | True  |
+-------+-------+
3 rows in set (0.014 sec)

功能由enable_sql_audit 参数控制,可以设置为关闭,不过建议开启:http://www.cndba.cn/dave/article/131448

obclient> ALTER SYSTEM SET enable_sql_audit = true;/*开启 SQL Audit*/
obclient> ALTER SYSTEM SET enable_sql_audit = false;/*关闭 SQL Audit*/

1.2 SQL Audit 淘汰机制

gv$ob_sql_audit是虚拟表,是内存中一个 FIFO 队列。租户的后台任务每隔 1s 会根据 OBServer 节点和 SQL Audit 的内存使用情况来决定是否触发淘汰 SQL。SQL Audit 内存上限由 ob_sql_audit_percentage 变量控制。 该变量控制SQL Audit 所使用的内存占租户内存的百分比。默认内存百分比为 3,可设置范围为[0,80]。http://www.cndba.cn/dave/article/131448http://www.cndba.cn/dave/article/131448

obclient [oceanbase]> SHOW VARIABLES LIKE 'ob_sql_audit_percentage';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| ob_sql_audit_percentage | 3     |
+-------------------------+-------+
1 row in set (0.002 sec)

当 SQL Audit 的实际内存使用达到指定阈值时,满足触发淘汰的条件,开启淘汰;当 SQL Audit 的实际内存使用降到指定阈值时,满足停止淘汰的条件,停止淘汰。http://www.cndba.cn/dave/article/131448

SQL Audit 淘汰机制如下表所示。http://www.cndba.cn/dave/article/131448

触发机制 SQL Audit 内存上限 触发淘汰的条件 停止淘汰的条件
内存使用 [0,64M] 内存上限 *50% 0 M
内存使用 [64M,100M] 内存上限-20M 内存上限-40 M
内存使用 [100M,5G] 内存上限 *80% 内存上限 *60%
内存使用 [5G,+∞) 内存上限-1G 内存上限-2 G
记录数 900 万 800万

2 相关示例

在 sys 租户中执行时可以查看所有租户的 SQL 数据;
在业务租户中执行仅可查看自身租户的 SQL 数据。

2.1 查看近期所有 SQL

SELECT /*+ read_consistency(weak) ob_querytimeout(100000000) */  substr(usec_to_time(request_time),1,19) request_time_, s.svr_ip, s.client_Ip, s.sid,s.tenant_id, s.tenant_name, s.user_name, s.db_name, s.query_sql, s.affected_rows, s.return_rows, s.ret_code, s.event, s.elapsed_time, s.queue_time, s.execute_time, round(s.request_memory_used/1024/1024/1024,2) req_mem_mb, plan_type, is_executor_rpc, is_inner_sql, trace_id 
FROM gv$ob_sql_audit s
WHERE 1=1  and s.tenant_id = 1002
 and user_name='u_tpcc' 
 and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) )
ORDER BY request_time DESC
LIMIT 100;

request_time 是时间戳,可通过函数 usec_to_time 和 time_to_usec 进行时间戳和微秒数的转换。http://www.cndba.cn/dave/article/131448

2.2 分析统计近期所有 SQL

根据 sql_id 统计平均总耗时、平均执行时间等。

SELECT sql_id, count(*), round(avg(elapsed_time)) avg_elapsed_time, round(avg(execute_time)) avg_exec_time
FROM gv$ob_sql_audit s
WHERE 1=1  and s.tenant_id = 1002
 and user_name='u_tpcc' 
 and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) )
GROUP BY sql_id
order by avg_elapsed_time desc 
;

2.3 查看报错的 SQL

ret_code 是 SQL 执行报错时的错误码,无报错时为 0,出现报错时错误码为负数。

SELECT /*+ read_consistency(weak) ob_querytimeout(100000000) */  substr(usec_to_time(request_time),1,19) request_time_, s.svr_ip, s.client_Ip, s.sid,s.tenant_id, s.tenant_name, s.user_name, s.db_name, s.sql_id,  s.query_sql, s.affected_rows, s.return_rows, s.ret_code, s.event, s.elapsed_time, s.queue_time, s.execute_time, round(s.request_memory_used/1024/1024/1024,2) req_mem_mb, plan_type, is_executor_rpc, is_inner_sql, trace_id 
FROM gv$ob_sql_audit s
WHERE 1=1  and s.tenant_id = 1002
 and user_name='u_tpcc' 
 and ret_code < 0
 and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) )
ORDER BY request_time DESC
LIMIT 500;

2.4 查看远程 SQL 和分布式 SQL

plan_type 的值有三个:1 表示本地 SQL;2 表示远程 SQL;3 表示分布式 SQL。

SELECT /*+ read_consistency(weak) ob_querytimeout(100000000) */  substr(usec_to_time(request_time),1,19) request_time_, s.svr_ip, s.client_Ip, s.sid,s.tenant_id, s.tenant_name, s.user_name, s.db_name, s.sql_id,  s.query_sql, s.affected_rows, s.return_rows, s.ret_code, s.event, s.elapsed_time, s.queue_time, s.execute_time, round(s.request_memory_used/1024/1024/1024,2) req_mem_mb, plan_type, is_executor_rpc, is_inner_sql, trace_id 
FROM gv$ob_sql_audit s
WHERE 1=1  and s.tenant_id = 1002
 and user_name='u_tpcc' 
 and plan_type > 1
 and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) )
ORDER BY request_time DESC
LIMIT 500;

远程 SQL 的出现需要结合事务的业务逻辑分析。

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2208
    原创
  • 2
    翻译
  • 529
    转载
  • 184
    评论
  • 访问:5998795次
  • 积分:4136
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ