1 视图说明
SQL 审计视图(GV$OB_SQL_AUDIT )可以查看在 OceanBase 数据库里执行过的所有 SQL(包含执行失败 SQL),可以用来查看每次请求客户端来源、执行服务器信息、执行状态信息、等待时间以及执行各阶段耗时等。
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 参数控制,可以设置为关闭,不过建议开启:
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]。
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 的实际内存使用降到指定阈值时,满足停止淘汰的条件,停止淘汰。
SQL Audit 淘汰机制如下表所示。
触发机制 | 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 进行时间戳和微秒数的转换。
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 的出现需要结合事务的业务逻辑分析。
版权声明:本文为博主原创文章,未经博主允许不得转载。