2026年5月15日時点の情報です。
1. はじめに
Oracle の診断で利用する 10046 イベント(SQL Trace)と 10053 イベント(オプティマイザトレース)。オンプレや通常の DBaaS では普通に使えますが、Autonomous Database Serverless (ADB-S) では話が変わります。
前回記事「V$DIAG_ALERT_EXTは廃止済み!ADB-S 26aiでアラートログやトレースを読む正しい方法」の可視性マトリクスで、次のように書いていました。
ALTER SESSION SET EVENTS 10046/10053△ 一部制限あり(詳細は別記事で検証予定)
本記事はその「△」の内容を実機で確認し、ADB-S 26ai でトレースを取るための正しい手順をまとめます。
なお、Oracle 19c の ADB-S については Connor McDonald が 2025 年 10 月に検証済み1ですが、バージョン 23.26.2(26ai)での挙動と SESSION_CLOUD_TRACE の詳細について、本記事で補完します。
結論先出し
- ADB-Sの19cと同様
ALTER SESSION SET EVENTS '10046...'は ORA-01031 で失敗 -
2ステップ回避策(
SQL_TRACE=TRUE→DBMS_MONITOR)で Waits 付きトレースが取得可能。最小権限はEXECUTE ON DBMS_MONITOR+READ ON C##CLOUD$SERVICE.SESSION_CLOUD_TRACE(PDB_DBA でも可) - 取得したトレースは
SESSION_CLOUD_TRACEビューで参照可能。WAIT / STAT 行ともに取得できる - 10053 は ORA-01031 で失敗。オプティマイザの判断過程は追えないと想定。実行計画の確認には
DBMS_XPLAN.DISPLAY_CURSOR(format='ALL'でクエリ変換情報も取得可)、長時間クエリには SQL Monitor が使える
今回の検証ゴール
| # | 検証項目 |
|---|---|
| 1 | 10046: 2ステップ回避策は ADB-S 26ai でも通じるか。Waits 情報は取れるか |
| 2 | 10046: SESSION_CLOUD_TRACE でどう読むか |
| 3 | 10053: ADB-S 26ai での制限を実機確認。代替候補(DBMS_XPLAN / SQL Monitor)で何が取れるか |
検証環境
| 項目 | 内容 |
|---|---|
| リージョン | ap-tokyo-1 |
| データベースバージョン | Oracle AI Database 26ai Enterprise Edition Release 23.26.2.1.0 |
2. 事前セットアップ: Object Storage の準備
SESSION_CLOUD_TRACE にトレースが書き出されるには、Object Storage バケットと Credential の設定が必要です。未設定の場合は以下を先に実施してください(詳細は公式 Docs 参照)。
-- Credential の作成(Auth Token を使用)
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'DEF_CRED_NAME',
username => 'your_user@example.com',
password => '<auth_token>'
);
END;
/
-- ロギング先バケットと既定 Credential を設定
ALTER DATABASE PROPERTY SET
DEFAULT_LOGGING_BUCKET = 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket>/o/';
ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';
設定済みかどうかは次で確認できます。
SELECT property_name, property_value
FROM database_properties
WHERE property_name IN ('DEFAULT_LOGGING_BUCKET', 'DEFAULT_CREDENTIAL');
バケットは Standard ストレージ階層 で作成してください。公式 Docs では Standard ストレージ階層が前提として記載されています。
3. 10046 イベント(SQL Trace)
3.1. 直接 EVENTS 構文は使えない
まず、オンプレで使い慣れた構文を試します。
-- NG パターン①: EVENTS 構文
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
-- NG パターン②: DBMS_SESSION
EXEC DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, binds => FALSE);
結果:
ORA-01031: 権限が不足しています
両方とも ORA-01031 で失敗します。
3.2. 取得できる方法: 2ステップ回避策
各ステップに必要な権限は以下のとおりです。
| ステップ | 必要な権限 |
|---|---|
Step 2(SQL_TRACE=TRUE) |
CREATE SESSION のみ |
Step 3(DBMS_MONITOR) |
EXECUTE ON DBMS_MONITOR |
SESSION_CLOUD_TRACE 参照 |
READ ON C##CLOUD$SERVICE.SESSION_CLOUD_TRACE を付与 |
最小権限で構成したい場合は、ADMIN で次の権限を付与してください。
GRANT EXECUTE ON DBMS_MONITOR TO <user>;
GRANT READ ON C##CLOUD$SERVICE.SESSION_CLOUD_TRACE TO <user>;
GRANT SELECT ON C##CLOUD$SERVICE.SESSION_CLOUD_TRACE は ADMIN でも ORA-01031 で失敗します。READ 権限を使ってください。
Step 1: セッション識別情報を設定(任意、ファイル名への反映に使われる)
BEGIN
DBMS_SESSION.SET_IDENTIFIER('trace_test');
DBMS_APPLICATION_INFO.SET_MODULE('my_module', NULL);
END;
/
Step 2: 基本 SQL Trace を有効化
ALTER SESSION SET SQL_TRACE = TRUE;
Step 3: Waits 情報を追加(DBMS_MONITOR)
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(waits => TRUE, binds => FALSE);
binds => TRUE を指定するとバインド変数の値も記録されます。実行計画の変動要因(バインドピーキング等)を調べる際に有用ですが、ADB-S 26ai での binds => TRUE による取得については本記事では未検証です。
Step 4: 対象ワークロードを実行
-- ここで計測したい SQL を実行する
SELECT COUNT(*) FROM all_objects WHERE object_type = 'TABLE';
Step 5: トレースを停止(この時点で SESSION_CLOUD_TRACE に書き出される)
ALTER SESSION SET SQL_TRACE = FALSE;
SQL_TRACE = FALSE で停止するまで、SESSION_CLOUD_TRACE には何も書き出されません。従来の Oracle DB(停止前でも一定量で自動フラッシュ)とは挙動が異なります。
他セッションのトレースも可能です。 DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id => <SID>, serial_num => <SERIAL#>, waits => TRUE, binds => FALSE) で別セッションを指定できます。Object Storage に .trc ファイルとして書き出されます。停止は DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => <SID>, serial_num => <SERIAL#>) で行います。
3.3. SESSION_CLOUD_TRACE でトレースを読む
停止後、SESSION_CLOUD_TRACE ビューで参照できます。
-- 行数確認
SELECT COUNT(*) FROM session_cloud_trace;
-- 先頭から読む
SELECT trace
FROM session_cloud_trace
ORDER BY row_number;
実際に取得できた行数は 4,059 行でした。ビューの行構造は以下のとおりです。
ヘッダ部(先頭約 20 行): バージョン・インスタンス情報
Oracle AI Database 26ai Enterprise Edition Release 23.26.2.1.0 - Production
Build label: RDBMS_23.0.0.0.0_LINUX.X64_260311.ADBS
Instance name: xxxxxxxx
STAT 行(実行計画統計):
SELECT row_number, trace
FROM session_cloud_trace
WHERE trace LIKE 'STAT%'
ORDER BY row_number
FETCH FIRST 5 ROWS ONLY;
STAT #140108357471312 id=1 cnt=1 pid=0 pos=1 obj=237 op='TABLE ACCESS STORAGE FULL ...
WAIT 行(待機イベント):
SELECT row_number, trace
FROM session_cloud_trace
WHERE trace LIKE 'WAIT%'
ORDER BY row_number
FETCH FIRST 5 ROWS ONLY;
WAIT #140108354373368: nam='SQL*Net message to client' ela=8 driver id=... tim=...
WAIT #140108354373368: nam='SQL*Net message from client' ela=34934069 driver id=... tim=...
nam が待機イベント名、ela が経過時間(マイクロ秒)です。
- 同一セッションで複数回 ON/OFF を繰り返すと行が追記されます
- セッションを切断すると
SESSION_CLOUD_TRACEはクリアされるため、必要な行は切断前に退避してください - 自セッション・他セッションいずれのトレースも Object Storage に
.trcファイルとして保存されます。パス構造はsqltrace/<CLIENT_ID>/[<MODULE>/]sqltrace_<SID>_<SERIAL#>.trc。MODULE 未設定時はその階層が省略されます(実測例:sqltrace/SQL-Developer/sqltrace_24059_1895.trc、sqltrace/trace_test/event_trace_test/sqltrace_9024_3910.trc) -
.trcファイルは OCI コンソール(バケット画面から直接ダウンロード)または OCI CLI(oci os object get --bucket-name <bucket> --name <path> --file <local_file>)で取得できます。手元に取得後、tkprofで整形できます
4. 10053 イベント(オプティマイザトレース)
4.1. ADB-S 26ai では完全にブロック
ALTER SESSION SET EVENTS '10053 trace name optimizer level 1';
結果:
ORA-01031: 権限が不足しています
ORA-01031 で失敗します。ADB-S 26ai では 10053 は取得手段がありません。必要な場合は Oracle Support への SR を検討してください。
4.2. 10053 で取りたい情報と現実的な代替手段
10053 の本来の目的は「オプティマイザがなぜその実行計画を選んだかの判断過程を追う」ことです。具体的には、オプティマイザが参照した統計値・カーディナリティの計算過程・複数の候補プランのコスト比較・クエリ変換の適用判断などが含まれます。
代替候補として SQL Monitor と DBMS_XPLAN format='ALL' を ADB-S 26ai 上で実機確認した結果を以下にまとめます。
SQL Monitor(DBMS_SQLTUNE.REPORT_SQL_MONITOR)
EXECUTE ON DBMS_SQLTUNE があれば実行可能です。
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => NULL, type => 'TEXT')
FROM dual;
ただし SQL Monitor が自動で対象とするのは並列クエリか実行時間が 5 秒を超えるクエリのみです(公式 Docs: Monitoring Database Operations 参照)。
DBMS_XPLAN.DISPLAY_CURSOR (format => 'ALL')
format => 'ALL' を指定すると、'ALLSTATS LAST' では得られない以下の追加セクションが出力されます。
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, 0, 'ALL'));
出力に追加されるセクション(抜粋):
Query Block Name / Object Alias (identified by operation id):
1 - SEL$69
2 - SEL$1 / "from$_subquery$_002"@"SEL$69"
5 - SET$1 / "ALL_OBJECTS"@"SEL$1"
Hint Report:
Total hints for statement: 2
0 - SEL$54: NO_MERGE
SQL Analysis Report:
14 - SEL$E029B2FF / "O"@"SEL$5"
- The following columns have predicates which preclude their
use as keys in index range scan. Consider rewriting the predicates.
"NAME"
A-Rows / A-Time も同時に取得したい場合は format => 'ALL ALLSTATS LAST' のように組み合わせられます。
代替手段の比較
| 知りたいこと |
DBMS_XPLAN.DISPLAY_CURSOR ※1 |
SQL Monitor | 10053 ※2 |
|---|---|---|---|
| どの計画が選ばれたか | ✅ | ✅ | ✅ |
| E-Rows / A-Rows の乖離 | ✅ | ✅(長時間・並列のみ) | ✅ |
| Query Block 名 / Object Alias | ✅ | ❌ | ✅ |
| 述語情報の詳細(access / filter) | ✅ | △ | ✅ |
| Column Projection 情報 | ✅ | ❌ | ✅ |
| Hint Report | ✅ | ❌ | ✅ |
| SQL Analysis(改善提案) | ✅ | ❌ | ✅ |
| なぜその計画を選んだか | ❌ | ❌ | ✅ |
| オプティマイザが参照した統計値 | ❌ | ❌ | ✅ |
| コスト計算の内訳 | ❌ | ❌ | ✅ |
| クエリ変換の適用過程 | ❌ | ❌ | ✅ |
※1 format => 'ALL ALLSTATS LAST' で E-Rows/A-Rows・Query Block 名等をまとめて取得可能
※2 10053 列はオンプレミス等、取得可能な環境での本来の機能を示しています。ADB-S 26ai では ORA-01031 でブロックされます。
「なぜこの実行計画になるのか」を追いたい場合は、ADB-S 26ai では有効な手段がなく Oracle Support への SR が必要になると想定されます。
5. まとめ
| # | 検証項目 | 結論 |
|---|---|---|
| 1 | 2ステップ回避策は 26ai で通じるか | ✅ 通じる。最小権限は EXECUTE ON DBMS_MONITOR + READ ON C##CLOUD$SERVICE.SESSION_CLOUD_TRACE
|
| 2 |
SESSION_CLOUD_TRACE でどう読むか |
STAT / WAIT 行ともに取得可。SQL_TRACE=FALSE が書き出しトリガー |
| 3 | 10053 の制限と代替手段 | 10053 は ORA-01031 で完全ブロック。SQL Monitor(長時間・並列クエリのみ)と DBMS_XPLAN format='ALL'(Query Block 名・Hint Report 等)が代替として使える |
ADB-S でのトレース取得は「オンプレと同じ方法ではできないが、公式サポートされた代替手段がある」という整理になります。診断が必要になった際の参考にしてください。