运维人员可根据需要,通过使用 PL/SQL 程序包 DBMS_MONITOR 中相关方法,控制相关应用程序不同标识信息维度是否开启全链路诊断 trace,以及该 trace 的打点和相关信息打印到 trace 日志的策略。日志打印会根据采样频率判断是否会被采样并记录到内存中,有一定的概率打印到 trace 日志中。
trace 打开和关闭操作
您可以通过调用 DBMS_MONITOR 包下的 trace 相关方法实现 trace 不同级别的开关模式。
在这里介绍下方法中涉及到的相关变量定义:
session_id:会话 ID,可以通过 show processlist(MySQL 模式),GV$OB_PROCESSLIST 等视图查询。client_id:客户端 ID,可以通过 GV$OB_PROCESSLIST 的 client 字段查询module_name:模块名,可以通过 GV$OB_PROCESSLIST 的 module 字段查询。action_name:活动名,可以通过 GV$OB_PROCESSLIST 的 action 字段查询。tenant_name:租户名,可选项为:空值(非 null,表示当前租户)和各租户名。level:打印日志的粒度。目前支持三个粒度等级,其中 Level1 为模块级别的粗粒度,Level3 的粒度最精细。sample_pct:控制采样频率,取值范围为 [0,1]。record_policy: 日志打印策略,即 trace 信息输出到日志文件中策略, 支持以下 3 种策略。ALL,所有 span 和 tag 信息均打印到日志文件中, 并且是在每个 span 结束时, 就打印到日志文件中。
ONLY_SLOW_QUERY,当前请求为 slow query ,则该部分信息的span 和 tag 会打印到日志文件中。
SAMPLE_AND_SLOW_QUERY,当前请求为 slow query 则该部分信息的span 和 tag 会打印到日志文件中;其他请求信息的 span 和 tag 有一定的概率会打印到日志文件中。
更多的内容请参见相关 DBMS_MONITOR 包的定义。
session 级别
打开 trace
DBMS_MONITOR.OB_SESSION_TRACE_ENABLE( session_id IN BINARY_INTEGER DEFAULT NULL, level IN INT, sample_pct IN NUMBER, record_policy IN VARCHAR2);示例:记录当前 session 相关耗时等信息,采样频率为 50%,并且只记录 slow query,具体 SQL 如下。
call dbms_monitor.ob_session_trace_enable(null,1,0.5,'ONLY_SLOW_QUERY');关闭 trace
DBMS_MONITOR.OB_SESSION_TRACE_DISABLE(session_id IN BINARY_INTEGER);示例:关闭当前 session trace。
call dbms_monitor.ob_session_trace_disable(null);
client_identifier 级别
打开 trace
DBMS_MONITOR.OB_CLIENT_ID_TRACE_ENABLE( client_id IN VARCHAR2, level IN INT, sample_pct IN NUMBER, record_policy IN VARCHAR2);示例:记录 client_id 为 jdbc 的相关耗时等信息,采样频率为 50%,并且只记录 slow query,具体 SQL 如下。
call dbms_monitor.ob_client_id_trace_enable('jdbc',1,0.5,'ONLY_SLOW_QUERY');关闭 trace
DBMS_MONITOR.OB_CLIENT_ID_TRACE_DISABLE(client_id IN VARCHAR2);示例:关闭 client_id 为 jdbc 的 trace。
call dbms_monitor.ob_client_id_trace_disable('jdbc');
module/action级别
打开 trace
DBMS_MONITOR.OB_MOD_ACT_TRACE_ENABLE( module_name IN VARCHAR2 DEFAULT ANY_MODULE, action_name IN VARCHAR2 DEFAULT ANY_ACTION, level IN INT, sample_pct IN NUMBER, record_policy IN VARCHAR2);示例:记录 module_name 为 backup,action_name 为 insert的相关耗时等信息,采样频率为 50%,并且只记录 slow query,具体 SQL 如下。其中的 module_name 和 action_name 通过 dbms_application_info 包的SET_MODULE 方法设置。
call dbms_application_info.set_module('backup','insert'); call dbms_monitor.ob_mod_act_trace_enable('backup','insert',1,0.5,'ONLY_SLOW_QUERY');关闭 trace
DBMS_MONITOR.OB_MOD_ACT_TRACE_DISABLE( module_name IN VARCHAR2, action_name IN VARCHAR2 DEFAULT ALL_ACTIONS);示例:关闭 module_name 为 backup,action_name 为 insert 的 trace。
call dbms_monitor.ob_mod_act_trace_disable('backup','insert');
租户级别
打开 trace
DBMS_MONITOR.OB_TENANT_TRACE_ENABLE( level IN INT, sample_pct IN NUMBER, record_policy IN VARCHAR2);示例:记录当前租户中的耗时等信息,全部记录并全部打印,具体 SQL 如下。
call dbms_monitor.ob_tenant_trace_enable(1, 1, 'ALL');关闭 trace
DBMS_MONITOR.OB_TENANT_TRACE_DISABLE(tenant_name IN VARCHAR2 DEFAULT NULL);示例:关闭租户名为 ORACLE 的 trace。
call dbms_monitor.ob_tenant_trace_disable('ORACLE');示例:关闭当前租户的 trace。
call dbms_monitor.ob_tenant_trace_disable();
相关日志信息输出到 trace.log,具体内容示例如下:
[20xx-0x-xx 00:07:46.027232] [1751][T1_TNT_L0][T1][YB42AC12050D-0005E42565DA44B2-0-0] {"trace_id":"0005e495-f920-5adc-7cd1-3730afa11dbd","name":"sql_execute","id":"0005e426-2c2b-0755-0000-000000000005","start_ts":1658707664460666,"end_ts":1658707666027098,"parent_id":"0005e426-3355-05b6-0000-000000000002","is_follow":false}
[20xx-0x-xx 00:07:46.027234] [1751][T1_TNT_L0][T1][YB42AC12050D-0005E42565DA44B2-0-0] {"trace_id":"0005e495-f920-5adc-7cd1-3730afa11dbd","name":"pc_get_plan","id":"0005e426-5aac-d38c-0000-000000000004","start_ts":1658707664460552,"end_ts":1658707664460660,"parent_id":"0005e426-a22f-6cd4-0000-000000000003","is_follow":false}




