データベースについて調べてみた

データベースについて調べたことのメモ。Oracle要素多めになる予定。

CDBとPDBにおけるAWRの違いについて調べてみた

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レポートの取得をして、以下のことがわかりました。

  • CDBレベルで取得したAWRスナップショットからは、CDBおよびPDB単位のAWRレポートを作成できる
  • PDBレベルで取得したAWRスナップショットからは、そのPDBの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.  Pressing  without
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. (1) ハードウェア/OS関連情報
  2. (2) メモリ(SGA/PGA/関連アドバイザ)、バックグラウンドプロセス関連情報
  3. (3) 排他制御(Enqueue/Latch/Mutex等)関連情報
  4. (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. (1) SQLやセグメントなどの各項目で、対象PDBの情報のみが表示される
  2. (2) 対象PDBで発生した待機イベント情報がわかる

(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  

 

 

前回の記事:SQLトレースを用いてSQL実行時の処理過程を調べてみた