運用保守担当者は、必要に応じてPL/SQLパッケージDBMS_MONITOR内の関連メソッドを使用して、アプリケーションが異なる識別情報の次元でフルトレースを有効にするかどうか、およびそのトレースの計測と関連情報をトレースログに出力するポリシーを制御できます。ログの出力はサンプリング頻度に基づいて決定され、一定の確率でトレースログに記録されます。
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:ログ出力の粒度。現在、3つの粒度レベルがサポートされており、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
);
例:現在のセッションに関連する時間などの情報を記録し、サンプリング頻度は50%で、スロークエリのみを記録します。
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);
例:現在のセッションのトレースを無効にします。
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%で、スロークエリのみを記録します。
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のトレースを無効にします。
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%で、スロークエリのみを記録します。ここでの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のトレースを無効にします。
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
);
以下の例では、現在のテナント内で消費された時間情報をすべて記録し、すべて出力します。
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}
フルトレースについて詳しくは、クエリの経路を参照してください。