Oracle Database 12cR2(12.2)から、CDBレベルだけでなくPDBレベルでもAWRレポートを作成できるようになっていますが、AWRレポートの内容の違いについて知らなかったこともあり、今回はCDBとPDBでAWRに関する違いについて調べてみました。
なお今回の調査結果は、Linux版のOracle Database 19c(19.22.0)のRAC環境を用いて確認した結果をベースにまとめたものとなります。
1. AWRスナップショットについて
Oracle Database 12.2からAWRスナップショットもPDBレベルでも取得できるようになっているということで、AWRスナップショットとAWRレポートの取得をして、以下のことがわかりました。
……PDBレベルでAWRスナップショットを取得して嬉しいことって何でしょうね?
PDBレベルで取得しておけば、PDBを他のCDBにPlug-inする際に、AWRスナップショットの情報も一緒にPlug-inできる点がメリットなのかもしれません。他にPDB単位のAWRスナップショットのありがたみがわかったら、追記したいと思います。
2. AWRスナップショットの取得方法について
AWRスナップショットの取得方法には手動取得と自動取得があるので、それぞれについて違いの有無を確認しました。
2.1 手動取得
手動でAWRスナップショットを取得する際に使用するプロシージャは下記のもので、CDBでもPDBでも変わりありません。異なるのは、プロシージャを実行する際の接続先になります。
SQL> exec dbms_workload_repository.create_snapshot();
CDBに接続した状態で上記プロシージャを実行すると、CDBレベルのAWRスナップショットが取得され、PDBに接続した状態で実行すると、接続していたPDBのAWRスナップショットが作成されます。
2.2 自動取得
CDBレベルのAWRスナップショットの自動取得は、デフォルトで有効となっていますが、PDBレベルの自動取得は無効となっている点が異なります(Oracle 23cではデフォルトで有効になっています)。
ここでは、PDBレベルの自動取得を有効にするための設定について紹介します。設定のポイントは以下の3つとなります。
- 【1】初期化パラメータawr_pdb_autoflush_enabledの設定
- 【2】初期化パラメータawr_snapshot_time_offsetの設定
- 【3】AWRスナップショットの取得間隔の設定
【1】awr_pdb_autoflush_enabledの設定
この初期化パラメータawr_pdb_autoflush_enabledが、PDBレベルのAWRスナップショットの自動取得を制御しており、デフォルト値がFALSEであるため、PDBレベルのAWRスナップショットの自動取得が無効になっています。
※Oracle 23cからは、awr_pdb_autoflush_enabledのデフォルト値がTRUEに変更されています。
この初期化パラメータの設定値をCDB上でTRUEにすると、全PDBでAWRスナップショットの自動取得が有効となります。PDB毎に自動取得を有効/無効を設定したい場合は、各PDBに接続した上で、この初期化パラメータの値をTRUE/FALSEに設定します。
SQL> show parameter awr_pdb_autoflush_enabled NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ awr_pdb_autoflush_enabled boolean FALSE SQL> ALTER SYSTEM SET awr_pdb_autoflush_enabled = TRUE; システムが変更されました。 SQL> show parameter awr_pdb_autoflush_enabled NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ awr_pdb_autoflush_enabled boolean TRUE
【2】awr_snapshot_time_offsetの設定
この初期化パラメータawr_snapshot_time_offsetは、AWRスナップショット取得開始時刻のオフセットを秒単位で指定するパラメータで、複数インスタンスで同時にAWRスナップショットの取得が行われることでCPU負荷が急上昇するのを防ぐために、取得タイミングをずらすために使用するパラメータですが、複数のPDBで同時にAWRスナップショット取得が行われても同様のCPU負荷上昇が発生してしまうため、これを防ぐためにこのパラメータを使用します。
具体的には、このパラメータをCDB上で1000000という特別な値を設定することで、AWRスナップショットの取得タイミングを自動的に分散させてくれるとのことです。
SQL> show parameter awr_snapshot_time_offset NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ awr_snapshot_time_offset integer 0 SQL> ALTER SYSTEM SET awr_snapshot_time_offset = 1000000; システムが変更されました。 SQL> show parameter awr_snapshot_time_offset NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ awr_snapshot_time_offset integer 1000000
【3】AWRスナップショットの取得間隔の設定
PDBレベルのAWRスナップショットの自動取得機能自体は、【1】の初期化パラメータawr_pdb_autoflush_enabledで有効にできますが、PDBレベルのAWRスナップショット取得間隔のデフォルト値が非常に大きな期間となっているため、dbms_workload_repository.modify_snapshot_settingsプロシージャを用いて修正する必要があります。この修正は、各PDBに接続して実施する必要があります。以下は取得間隔を1時間に修正する例です。
SQL> select con_id, snap_interval, retention from awr_pdb_wr_control; CON_ID SNAP_INTERVAL RETENTION ---------- ------------------------------ ------------------------------ 3 +40150 00:01:00.0 +00008 00:00:00.0 SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>60); PL/SQLプロシージャが正常に完了しました。 SQL> select con_id, snap_interval, retention from awr_pdb_wr_control; CON_ID SNAP_INTERVAL RETENTION ---------- ------------------------------ ------------------------------ 3 +00000 00:01:00.0 +00008 00:00:00.0
3. AWRレポートの作成について
CDBレベルとPDBレベルのAWRレポートを作成する際、awrrpt.sqlを実行する点に違いはないですが、PDBレベルのAWRレポートを作成する際は、CDBレベルのAWRスナップショットとPDBレベルのAWRスナップショットのどちらかを選択させられる点が異なります。
具体的な違いを紹介するために、以下にawrrpt.sqlを実行した際の冒頭部分の出力内容について、CDBとPDBそれぞれ記載します。
3.1 CDBレベルのAWRレポートの作成
CDBレベルのAWRレポートを作成する際は、CDB(CDB$ROOT)に接続した状態で、AWRレポートを出力するawrrpt.sqlスクリプトを実行します。
CDBの場合、AWRレポートの出力形式を入力した後に、非CDB環境の時と同様に、過去何日分のAWRスナップショットを表示するか、入力要求されます。
SQL> @?/rdbms/admin/awrrpt Specify the Report Type ~~~~~~~~~~~~~~~~~~~~~~~ AWR reports can be generated in the following formats. Please enter the name of the format at the prompt. Default value is 'html'. 'html' HTML format (default) 'text' Text format 'active-html' Includes Performance Hub active report report_typeに値を入力してください: text 旧 1: select 'Type Specified: ',lower(nvl('&&report_type','html')) report_type from dual 新 1: select 'Type Specified: ',lower(nvl('text','html')) report_type from dual Type Specified: text (略) Current Instance ~~~~~~~~~~~~~~~~ DB Id DB Name Inst Num Instance Container Name -------------- -------------- -------------- -------------- -------------- 1688648483 ORCL 1 ORCL1 CDB$ROOT (略) Specify the number of days of snapshots to choose from ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Entering the number of days (n) will result in the most recent (n) days of snapshots being listed. Pressingwithout specifying a number lists all completed snapshots. num_daysに値を入力してください:
3.2 PDBレベルのAWRレポートの作成
PDBレベルのAWRレポートを作成する際は、AWRレポートの作成対象となるPDBへ接続した状態で、AWRレポートを出力するawrrpt.sqlスクリプトを実行します。
AWRレポートの出力形式を入力する所まではCDBと同じですが、この後にAWRレポートを作成する際に、CDBレベルのAWRスナップショットを使用するか(AWR_ROOT)、PDBレベルのAWRスナップショットを使用するか(AWR_PDB)を選択させられる点が、CDB上で実行したときと異なります。
SQL> @?/rdbms/admin/awrrpt Specify the Report Type ~~~~~~~~~~~~~~~~~~~~~~~ AWR reports can be generated in the following formats. Please enter the name of the format at the prompt. Default value is 'html'. 'html' HTML format (default) 'text' Text format 'active-html' Includes Performance Hub active report report_typeに値を入力してください: text 旧 1: select 'Type Specified: ',lower(nvl('&&report_type','html')) report_type from dual 新 1: select 'Type Specified: ',lower(nvl('text','html')) report_type from dual Type Specified: text Specify the location of AWR Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AWR_ROOT - Use AWR data from root (default) AWR_PDB - Use AWR data from PDB awr_locationに値を入力してください:
4. AWRレポートの内容について
4.1 AWRレポートの出力項目の差異について
CDBレベルとPDBレベルで、AWRレポートの出力項目が異なります。CDBレベルのAWRレポートでは全ての項目が出力されますが、PDBレベルのAWRレポートは一部の項目が出力されません。具体的な項目は4.3で後述しますが、以下の系統に関する項目が私の環境では出力されていませんでした。
- (1) ハードウェア/OS関連情報
- (2) メモリ(SGA/PGA/関連アドバイザ)、バックグラウンドプロセス関連情報
- (3) 排他制御(Enqueue/Latch/Mutex等)関連情報
- (4) RAC(キャッシュフュージョン)関連情報
上記の項目から考えると、PDBレベルのAWRレポートには、PDBに閉じて利用/構成されない項目が出力されない様に見えます。
PDBはハードウェアやDBインスタンスなどを共有利用するコンテナデータベースと考えると、(1), (2)が出力されないのは自然だと思います。自然だとは思いますが、キャッシュヒット率などが表示される「Instance Efficiency Percentages」まで出力されないのは、ちょっと辛いかなと……この辺はPDB単位でも集計できるような気もするので、今後改善されることを期待しています。
なお、キャッシュヒット率については、「Service Statistics」にPhysical ReadsとLogical Readsの回数が出力されているので、Logical Reads/(Logical Reads + Physical Reads)とすることで、若干強引ですが参考値として算出できるかと思います。
Service Statistics DB/Inst: ORCL/ORCL1 Snaps: 13-14 -> ordered by DB Time Physical Logical Service Name DB Time (s) DB CPU (s) Reads (K) Reads (K) ---------------------------- ------------ ------------ ------------ ------------ orclpdb 2 1 0 42 ------------------------------------------------------
(3)の排他制御関連はPDBに閉じているのかなと思っていましたが、PDBに跨って排他制御が必要なリソースもあるとは思うと考えると、PDBに閉じない要素なのかなと理解することにしました。
(4)のRAC関連は、Global Cache/Enqueueやインターコネクト関連の項目に該当していることから、(1)~(3)に属していると言えるので、AWRレポートに出力されないのだと考えております。
4.2 PDBレベルのAWRレポートは必要なのか
単純に出力項目の品揃えで考えると、PDBにはあるけどCDBにはない項目は存在しないため、PDBレベルのAWRレポートの必要性に疑問を持たれる方もいるかと思います。正直に言うと、私自身が疑問を持っていた1人だったりします。
実際にCDBレベルとPDBレベルのAWRレポートを見比べてみて、下記の点がPDBレベルのAWRレポートのメリットと考える様になりました。
(1)のSQLの項目(SQL ordered by ~)やセグメントの項目(Segments by ~)など、CDBレベルのAWRレポートではPDB毎に各項目を出力してくれるわけではなく、CDBおよび全PDB混在で各項目の情報が出力されます。各情報にどのPDBまたはCDBなのか出力されているので、それを基に必要な情報をピックアップしないといけないのが煩雑です。
煩雑なだけならよいですが、セグメントの項目については上位5セグメントしか表示されないことから、確認したいPDB以外の情報に追い出されて確認できない可能性もあるため(以下はORCLPDBを見たいのにCDBが追い出している例)、この点はPDBレベルのAWRレポートが優位だと思います。
Segments by Logical Reads DB/Inst: ORCL/ORCL1 Snaps: 169-170 -> Total Logical Reads: 111,785 -> Captured Segments account for 86.9% of Total -> When ** MISSING ** occurs, some of the object attributes may not be available Tablespace Owner Name -------------------- ---------- Subobject Obj. Logical Object Name Name Type Obj# Dataobj# Reads %Total -------------------- ---------- ----- ---------- ---------- ------------ ------- SYS SYSTEM LOB$ TABLE 109 2 26,896 24.06 PDB: CDB$ROOT SYS SYSTEM SEG$ TABLE 14 8 10,736 9.60 PDB: CDB$ROOT SYS SYSTEM I_FILE#_BLOCK# INDEX 9 9 10,176 9.10 PDB: CDB$ROOT TEST USERS IDX01TAB02 INDEX 1785 23948 9,648 8.63 PDB: ORCLPDB TEST USERS TAB01 TABLE 1783 1783 5,200 4.65 PDB: ORCLPDB ------------------------------------------------------
(2)の待機イベントについても、CDBレベルのAWRレポートだとCDB/全PDB混在しているのですが、どのPDBまたはCDBで発生した待機イベントか区別することができない点が(1)と大きく異なります。PDBで発生した待機イベントを正確に把握するためには、PDBレベルのAWRレポートが必要となります。
CDBレベルのAWRレポートでも、下記の「Service Wait Class Stats」で、待機種別毎に集計された待機時間をPDB単位で確認できるので、どんな待機イベントが発生していたかある程度の推測はできるかもしれませんが、正確な情報までは得られません。
Service Wait Class Stats DB/Inst: ORCL/ORCL1 Snaps: 169-170
-> Wait Class info for services in the Service Statistics section.
-> Total Waits and Time Waited displayed for the following wait
classes: User I/O, Concurrency, Administrative, Network
-> Time Waited (Wt Time) in seconds
Service Name
----------------------------------------------------------------
User I/O User I/O Concurcy Concurcy Admin Admin Network Network
Total Wts Wt Time Total Wts Wt Time Total Wts Wt Time Total Wts Wt Time
--------- --------- --------- --------- --------- --------- --------- ---------
SYS$USERS
4768 10 1 0 0 0 1941 0
orclpdb
0 0 0 0 0 0 4 0
SYS$BACKGROUND
659 0 152 0 0 0 60 0
------------------------------------------------------
4.3 AWRレポートの出力項目一覧
以下は、CDBおよびPDBレベルのAWRレポートの各項目の出力有無の一覧となります。
No. | 項目 | CDB | PDB |
---|---|---|---|
1 | Load Profile | ○ | ○ |
2 | Instance Efficiency Percentages | ○ | |
3 | Top 10 Foreground Events by Total Wait Time | ○ | ○ |
4 | Wait Classes by Total Wait Time | ○ | ○ |
5 | Host CPU | ○ | |
6 | Instance CPU | ○ | |
7 | IO Profile | ○ | ○ |
8 | Memory Statistics | ○ | |
9 | Database Resource Limits | ○ | ○ |
10 | Cache Sizes | ○ | |
11 | Shared Pool Statistics | ○ | |
12 | Time Model Statistics | ○ | ○ |
13 | Operating System Statistics | ○ | |
14 | Operating System Statistics - Detail | ○ | |
15 | Foreground Wait Class | ○ | ○ |
16 | Foreground Wait Events | ○ | ○ |
17 | Background Wait Events | ○ | |
18 | Wait Event Histogram | ○ | |
19 | Service Statistics | ○ | ○ |
20 | Service Wait Class Stats | ○ | ○ |
21 | Top 10 Channel Waits | ○ | |
22 | Top Process Types by Wait Class | ○ | ○ |
23 | Top Process Types by CPU Used | ○ | ○ |
24 | SQL ordered by Elapsed Time | ○ | ○ |
25 | SQL ordered by CPU Time | ○ | ○ |
26 | SQL ordered by User I/O Wait Time | ○ | ○ |
27 | SQL ordered by Gets | ○ | ○ |
28 | SQL ordered by Reads | ○ | ○ |
29 | SQL ordered by Physical Reads (UnOptimized) | ○ | ○ |
30 | SQL ordered by Executions | ○ | ○ |
31 | SQL ordered by Parse Calls | ○ | ○ |
32 | SQL ordered by Sharable Memory | ○ | ○ |
33 | SQL ordered by Version Count | ○ | ○ |
34 | SQL ordered by Cluster Wait Time | ○ | ○ |
35 | Key Instance Activity Stats | ○ | ○ |
36 | Instance Activity Stats | ○ | ○ |
37 | Instance Activity Stats - Absolute Values | ○ | ○ |
38 | Instance Activity Stats - Thread Activity | ○ | |
39 | IOStat by Function summary | ○ | |
40 | IOStat by Filetype summary | ○ | ○ |
41 | IOStat by Function/Filetype summary | ○ | |
42 | Tablespace IO Stats | ○ | ○ |
43 | File IO Stats | ○ | ○ |
44 | Buffer Pool Statistics | ○ | |
45 | Checkpoint Activity | ○ | |
46 | Instance Recovery Stats | ○ | |
47 | MTTR Advisory | ○ | |
48 | Buffer Pool Advisory | ○ | |
49 | PGA Aggr Summary | ○ | |
50 | PGA Aggr Target Stats | ○ | |
51 | PGA Aggr Target Histogram | ○ | |
52 | PGA Memory Advisory | ○ | |
53 | Shared Pool Advisory | ○ | |
54 | SGA Target Advisory | ○ | |
55 | Streams Pool Advisory | ○ | |
56 | Java Pool Advisory | ○ | |
57 | Buffer Wait Statistics | ○ | ○ |
58 | Enqueue Activity | ○ | |
59 | Undo Segment Summary | ○ | ○ |
60 | Undo Segment Stats | ○ | ○ |
61 | Latch Activity | ○ | |
62 | Latch Sleep Breakdown | ○ | |
63 | Latch Miss Sources | ○ | |
64 | Mutex Sleep Summary | ○ | |
65 | Parent Latch Statistics | ○ | |
66 | Child Latch Statistics | ○ | |
67 | Segments by Logical Reads | ○ | ○ |
68 | Segments by Physical Reads | ○ | ○ |
69 | Segments by Physical Read Requests | ○ | ○ |
70 | Segments by UnOptimized Reads | ○ | ○ |
71 | Segments by Optimized Reads | ○ | ○ |
72 | Segments by Direct Physical Reads | ○ | ○ |
73 | Segments by Physical Writes | ○ | ○ |
74 | Segments by Physical Write Requests | ○ | ○ |
75 | Segments by Direct Physical Writes | ○ | ○ |
76 | Segments by Table Scans | ○ | ○ |
77 | Segments by DB Blocks Changes | ○ | ○ |
78 | Segments by Row Lock Waits | ○ | ○ |
79 | Segments by ITL Waits | ○ | ○ |
80 | Segments by Buffer Busy Waits | ○ | ○ |
81 | Segments by Global Cache Buffer Busy | ○ | ○ |
82 | Segments by CR Blocks Received | ○ | ○ |
83 | Segments by Current Blocks Received | ○ | ○ |
84 | Segments by Global Cache Remote Grants | ○ | ○ |
85 | Dictionary Cache Stats | ○ | ○ |
86 | Dictionary Cache Stats (RAC) | ○ | ○ |
87 | Library Cache Activity | ○ | ○ |
88 | Library Cache Activity (RAC) | ○ | ○ |
89 | Memory Dynamic Components | ○ | |
90 | Memory Resize Operations Summary | ○ | |
91 | Memory Resize Ops | ○ | |
92 | Process Memory Summary | ○ | |
93 | SGA Memory Summary | ○ | |
94 | SGA breakdown difference by Pool and Name | ○ | |
95 | Replication System Resource Usage | ○ | ○ |
96 | Replication SGA Usage | ○ | ○ |
97 | GoldenGate Capture | ○ | ○ |
98 | GoldenGate Capture Rate | ○ | ○ |
99 | GoldenGate Apply Reader | ○ | ○ |
100 | GoldenGate Apply Coordinator | ○ | ○ |
101 | GoldenGate Apply Server | ○ | ○ |
102 | GoldenGate Apply Coordinator Rate | ○ | ○ |
103 | GoldenGate Apply Reader and Server Rate | ○ | ○ |
104 | XStream Capture | ○ | ○ |
105 | XStream Capture Rate | ○ | ○ |
106 | XStream Apply Reader | ○ | ○ |
107 | XStream Apply Coordinator | ○ | ○ |
108 | XStream Apply Server | ○ | ○ |
109 | XStream Apply Coordinator Rate | ○ | ○ |
110 | XStream Apply Reader and Server Rate | ○ | ○ |
111 | Table Statistics by DML Operations | ○ | ○ |
112 | Table Statistics by Conflict Resolutions | ○ | ○ |
113 | Replication Large Transaction Statistics | ○ | ○ |
114 | Replication Long Running Transaction Statistics | ○ | ○ |
115 | Advanced Queue CPU/IO Usage | ○ | |
116 | Buffered Queues | ○ | |
117 | Buffered Queue Subscribers | ○ | |
118 | Rule Set | ○ | |
119 | Persistent Queues | ○ | |
120 | Persistent Queues Rate | ○ | |
121 | Persistent Queue Subscribers | ○ | |
122 | Resource Limit Stats | ○ | |
123 | Shared Servers Activity | ○ | |
124 | Shared Servers Rates | ○ | |
125 | Shared Servers Utilization | ○ | |
126 | Shared Servers Common Queue | ○ | |
127 | Shared Servers Dispatchers | ○ | |
128 | Parameters modified by this container | ○ | ○ |
129 | Parameters modified by other containers | ○ | ○ |
130 | Multi-Valued Parameters modified by this container | ○ | ○ |
131 | Multi-Valued Parameters modified by other containers | ○ | ○ |
132 | Top SQL with Top Events | ○ | ○ |
133 | Top SQL with Top Row Sources | ○ | ○ |
134 | Top Sessions | ○ | ○ |
135 | Top Blocking Sessions | ○ | ○ |
136 | Top PL/SQL Procedures | ○ | ○ |
137 | Top Events | ○ | ○ |
138 | Top Event P1/P2/P3 Values | ○ | ○ |
139 | Top DB Objects | ○ | ○ |
140 | Activity Over Time | ○ | ○ |
141 | ADDMレポート | ○ | ○ |
142 | RAC Statistics | ○ | |
143 | Global Messaging Statistics | ○ | |
144 | Global CR Server Statistics | ○ | |
145 | Global Current Server Statistics | ○ | |
146 | Global Cache Transfer Statistics | ○ | |
147 | Global Cache Transfer Times (us) | ○ | |
148 | Global Cache Transfer (Immediate) | ○ | |
149 | Global Cache Times (Immediate) | ○ | |
150 | Interconnect Ping Latency Statistics | ○ | |
151 | Interconnect Throughput by Client | ○ | |
152 | Interconnect Device Statistics | ○ | |
153 | Dynamic Remastering Statistics | ○ |