※本ページは、”Viewing Exadata Flash Cache Contents“の翻訳です。

Exadataのドキュメントから引用:

Exadata Smart Flash Cacheは、データ使用量、アクセス・パターン、およびアクセスされているデータのタイプを示すデータベースからのヒントに基づいて、キャッシュに最も役立つデータをインテリジェントに判別します。また、再利用されない、またはキャッシュに収まらないデータのキャッシュを回避します。

時々、私たちは好奇心旺盛なDBA(OK、いつも…)に出くわします。上記のSmart Flash Cacheの場合、ドキュメントの次のステートメントに「キャッシュは自動的に実行され、ユーザーや管理者の労力は必要ありません」と記載されていますが、そこに何があるのか​​を知りたいのです。 。

Exadata Storage Serverにログインして、何が利用できるかを見てみましょう。ドキュメントによると、flashcachecontent の object_type があります。

[root@xdpmceladm01 ~]# cellcli
CellCLI> help list flashcachecontent
Usage: LIST FLASHCACHECONTENT [filters] [attribute_list] [DETAIL]
Purpose: Displays specified attributes for flash cache entries.

detail オプションは、私たちが見ることができる属性を教えてくれます。

CellCLI> list flashcachecontent detail
---8<---
cachedKeepSize: 0
cachedSize: 13565952
cachedWriteSize: 13565952
clusterName:
columnarCacheSize: 0
columnarKeepSize: 0
dbID: 4154436461
dbUniqueName: TARDIS.CDB$ROOT
hitCount: 0
missCount: 0
objectNumber: 4294967295
tableSpaceNumber: 4
---8<---

dbUniqueName、objectNumber、tableSpaceNumberなどの属性のリストがあります。この flashcachecontent が存在するストレージサーバーの名前も返す必要があるため、クラスター内のすべてのストレージサーバーの全体像を取得し、それをデータベースオブジェクト名に関連付けることで、flashcachecontent の意味を理解できるようになります。

ストレージサーバーのセキュリティ設定に応じて、exacliコマンド、またはdcliコマンドを使用できます。最終的には同じ結果になりますが、今回ははexacliコマンドを使用します。 (ExaCLIの使用方法についてはこちらをご覧ください)。

最初のストレージサーバーでcellcliコマンドを用いて、exacliコマンドでStorage Server の詳細を表示するために必要な権限を持つロールとユーザーを作成します。

CellCLI> create role ext_admin

CellCLI> grant privilege list on flashcachecontent attributes -
dbid,dbUniqueName,objectNumber,tablespaceNumber,cachedSize,cachedKeepSize, -
cachedWriteSize,columnarCacheSize,columnarKeepSize,hitCount,missCount to ROLE ext_admin

CellCLI> create user ext_admin_user password=*

CellCLI> grant role ext_admin to user ext_admin_user

他のすべてのストレージサーバーに対して同じコマンドを実行します…

次に、データベースに接続するデータベースサーバーから、exacliコマンドでストレージサーバーに接続します。

[oracle@xdpmvm01clu01 ~]$ exacli -l ext_admin_user --cookie-jar \
/home/oracle/.exacli/my.cookie.jar -c xdpmceladm01
No cookies found for ext_admin_user@xdpmceladm01.
Password: *********
EXA-30016: This connection is not secure. You have asked ExaCLI to connect to cell xdpmceladm01 securely.
The identity of xdpmceladm01 cannot be verified.
Got certificate from server: C=US,ST=California,L=Redwood City,O=Oracle Corporation,OU=Exadata PM,CN=xdpmceladm01.xdpm.local
Do you want to accept and store this certificate? (Press y/n)
y
exacli ext_admin_user@xdpmceladm01> exit

再び、あなたが確認する他のすべてのストレージサーバーについて繰り返します。

セキュアなアクセスが可能になったので、テストしてみましょう。

[oracle@xdpmvm01clu01 ~]$ exacli -l ext_admin_user --cookie-jar /home/oracle/.exacli/my.cookie.jar \
-c xdpmceladm01 -e 'list celldisk' |head -3

CELL-06015: Current user does not have privileges to run this command.

[oracle@xdpmvm01clu01 ~]$ exacli -l ext_admin_user --cookie-jar /home/oracle/.exacli/my.cookie.jar \
-c xdpmceladm01 -e 'list flashcachecontent attributes all' |head -3

CELL-06015: Current user does not have privileges to run this command.

[oracle@xdpmvm01clu01 ~]$ exacli -l ext_admin_user --cookie-jar /home/oracle/.exacli/my.cookie.jar \ 
-c xdpmceladm01 -e 'list flashcachecontent attributes dbUniqueName'|head -3
TARDIS.CDB$ROOT
CDB1.CDB$ROOT
CDB1.PDB11

Alexさんが使っているTARDIS*データベースと私のPDBデータベースがあるのが分かります。 また、exacliコマンドのセキュリティが期待どおりに機能していることにも確認してください。 ext_adminロールに「celldisk」オブジェクト、または flashcachecontent の「ALL」属性へのアクセスを許可せず、特定の属性のみを許可したため、CELL-06015特権は拒否を通知しました。

exadcliコマンドを使用すると、すべてのストレージサーバーをループし、flashcachecontent属性を抽出し、/u01ファイルシステムにあるフラットファイルに整理できるようになります。

ヒント:exadcliの「d」の意味に注意してください。これは、exacliとdcliを同時に実行するのと同じ意味があります。loop..exacli…endl oopやdcli”cellcli..” などの複数のステップを実行する代わりに、単一のexadcliコマンドを使用するだけ複数のStorage Server に対してコマンドを実行できます。

まず、一時ファイルとスクリプトを保持するディレクトリを作成します。

mkdir -p /u01/app/oracle/tmp/fc_data

bash スクリプトを作成します

$ vi /u01/app/oracle/tmp/fc_data/extract_fcca.sh
#!/bin/bash
# Add /usr/local/bin to $PATH
export PATH=${PATH}:/usr/local/bin
# Modify the following line with the username to use for logging on to cells
CELLUSER=ext_admin_user
# Modify the following line with the dcli group with the list of cells
CELLGROUP=/home/oracle/cell_group

# commands used
PS=/bin/ps
GREP=/bin/grep
WC=/bin/wc
ECHO=/bin/echo

MAX_EXADCLI_SESSIONS=10

# make sure we do not spawn too many exadcli sessions
# ideally use /proc/*/stat, but we may not have permissions
num_sess=`$PS -ef | $GREP exadcli | $GREP -v grep | $WC -l`
if [ ${num_sess} -gt ${MAX_EXADCLI_SESSIONS} ]
then
  $ECHO "Exceeded Max exadcli sessions: $MAX_EXADCLI_SESSIONS"
  exit -1
fi

# Execute exadcli and substitute spaces with a delimiter, strip : from hostname
/usr/local/bin/exadcli -l ${EXACLIUSER} -g ${CELLGROUP} \
--cookie-jar=/home/oracle/.exacli/my.cookie.jar list flashcachecontent \
 attributes dbid,dbUniqueName,objectNumber,tablespaceNumber,cachedSize, \
cachedKeepSize,cachedWriteSize,columnarCacheSize,columnarKeepSize,hitCount, \
missCount | /bin/sed -e "s/[[:space:]]\+/\|/g" -e "s/://g"

作成したスクリプトに実行権限を追加するのを忘れないようにしてください。

chmod 700 extract_fcca.sh

簡単にテストしてみるとスクリプトが期待通りに動くのが分かります。

[oracle@xdpmvm01clu01 fc_data]$ ./extract_fcca.sh
---8<---
xdpmceladm01|1055950008|CDB1.CDB$ROOT|0|0|676061184|0|623362048|0|0|543|38
xdpmceladm01|4154436461|TARDIS.CDB$ROOT|0|0|704512|0|704512|0|0|2|0
xdpmceladm02|4054767370|CDB1.PDB$SEED|0|2147483647|12451840|0|393216|0|0|16|0
---8<---

上記のシェルスクリプトにベイルアウトセクションがあることに気付くかもしれません。 exadcliコマンドを一度に何度も実行すると(この場合、10を超える同時セッション)、終了します。

これでその側面が完了したので、データベースにログインしていくつかのオブジェクトを作成しましょう。

$ . oraenv
ORACLE_SID = [oracle] ? CDB11
The Oracle base has been set to /u01/app/oracle

[oracle@xdpmvm01clu01 fc_data]$ sqlplus -S / as sysdba
alter session set container = PDB11;

-- create and connect as Scott, the great tamer of tigers...

CREATE USER scott IDENTIFIED BY tiger CONTAINER = CURRENT QUOTA UNLIMITED ON USERS;
GRANT CONNECT, CREATE TABLE, CREATE VIEW TO scott;
CREATE OR REPLACE DIRECTORY fc_data AS '/u01/app/oracle/tmp/fc_data';
GRANT READ,WRITE,EXECUTE ON DIRECTORY fc_data TO scott;
GRANT SELECT ON DBA_OBJECTS TO scott;
GRANT SELECT ON v_$tablespace TO scott;
GRANT SELECT ON v_$database to scott;
-- connect as scott to the pluggable database instance
connect scott/tiger@xdpmvm01clu01.xdpm.local:1521/pdb11

SQL * Plusで、exadcliスクリプトを呼び出す外部テーブルを作成します。

CREATE TABLE debug$fc_et (
       cell_name           VARCHAR2(50),
       db_id               NUMBER,
       db_name             VARCHAR2(30),
       object_id           NUMBER,
       tablespace_id       NUMBER,
       cached_size         NUMBER,
       cached_keep_size    NUMBER,
       cached_write_size   NUMBER,
       columnar_cache_size NUMBER,
       columnar_keep_size  NUMBER,
       hit_count           NUMBER,
       miss_count          NUMBER)
       ORGANIZATION EXTERNAL (
               TYPE oracle_loader
  DEFAULT DIRECTORY fc_data
  ACCESS PARAMETERS (
                    RECORDS DELIMITED BY newline
               PREPROCESSOR fc_data:'extract_fcca.sh'
                    BADFILE fc_data:'fcc.bad'
                    LOGFILE fc_data:'fcc.log'
                     FIELDS TERMINATED BY '|'
              MISSING FIELD VALUES ARE NULL
                          ( cell_name,
                            db_id,
                            db_name,
                            object_id,
                            tablespace_id,
                            cached_size,
                            cached_keep_size,
                            cached_write_size,
                            columnar_cache_size,
                            columnar_keep_size,
                            hit_count,
                            miss_count
                          )
                      )
             LOCATION (fc_data:'extract_fcca.sh'))
         REJECT LIMIT UNLIMITED;

どのデータベースがflashcachecontentを消費しているかを示すビューを作成します。

CREATE OR REPLACE VIEW debug$fc_et_db_vw (
       database_name, 
       cached_mb, 
       keep_mb, 
       write_mb, 
       hits, 
       misses, 
       hit_pct)
       AS SELECT db_name,
       SUM(cached_size)/1048576 cached_mb,
       SUM(cached_keep_size)/1048576 keep_mb,
       SUM(cached_write_size)/1048576 write_mb,
       SUM(hit_count) hits,
       SUM(miss_count) misses,
       ROUND(100*SUM(hit_count)/DECODE(SUM(hit_count+miss_count),0,NULL,SUM(hit_count+miss_count)),1) hit_pct
  FROM debug$fc_et
 GROUP BY db_name
 ORDER BY SUM(cached_size);

これで、どのデータベースが flashcache 空間を消費しているかを確認できます。

set lines 200
set pages 200
col database_name for a20
SELECT *
  FROM debug$fc_et_db_vw
 ORDER BY hit_pct DESC;

明らかに私とは異なる結果が得られると思いますが、次のようになります。

DATABASE_NAME          CACHED_MB KEEP_MB   WRITE_MB   HITS MISSES  HIT_PCT
-------------------- ---------- -------- ---------- ------ ------ --------
CDB1.PDB11           10647.6953        0 1258.42969  21125    241     98.9
CDB1.PDB$SEED        366.148438        0  353.15625    419    136     75.5
TARDIS.PDB$SEED      365.625           0 352.515625    399    130     75.4

「UNKNOWN」という名前のデータベースが表示される場合があります。

DATABASE_NAME          CACHED_MB KEEP_MB   WRITE_MB   HITS MISSES  HIT_PCT
-------------------- ---------- -------- ---------- ------ ------ --------
UNKNOWN              6555.08203        0 6436.44922    738     89     89.2

これは、unknownというデータベースを実行していることを意味するのではなく、オブジェクトに関連付けられたデータベースがないことを意味します。これは通常、ACFSまたはADVMオブジェクトであるためです(たとえば、Exadata 21.2の新機能 ACFS I/O Caching in Flash Cache を覚えておいてください)。 tablespace_nameまたはobject_idを見ると、追加の手がかりが得られる場合があります。

flashcachecontent detail テーブルをこのデータベースのオブジェクトテーブルに接続するためのビューを作成します。

CREATE OR REPLACE VIEW debug$fc_et_ob_vw (
       database_name, 
       tablespace_name, 
       owner, 
       object_name, 
       object_type, 
       keep_mb, 
       tot_mb, 
       perc, 
       hits, 
       misses, 
       hit_ratio )
       AS SELECT d.name database_name,
                 t.name tablespace_name,
                 o.owner,
                 NVL(o.object_name, '('||MAX(cc.object_id)||')') object_name,
                 o.object_type,
                 ROUND(SUM(cached_keep_size)/1024/1024) keep_mb,
                 ROUND(SUM(cached_size)/1024/1024) tot_mb,
                 ROUND(RATIO_TO_REPORT(SUM(cc.cached_size)) OVER ()*100) perc,
                 SUM(cc.hit_count) hits,
                 SUM(cc.miss_count) misses,
                 ROUND((SUM(cc.hit_count)/NULLIF(SUM(cc.hit_count)+SUM(cc.miss_count),0)*100)) hit_ratio
            FROM debug$fc_et cc, v$tablespace t, dba_objects o, v$database d
           WHERE cc.object_id = o.data_object_id (+)
             AND cc.tablespace_id = t.ts# (+)
             AND cc.db_id = d.dbid
           GROUP BY d.name, t.name, o.owner, o.object_name, o.object_type;

上記のビューでの警告の言葉、特にFusionAppsなどでは、DBA_OBJECTSが非常に大きくなる可能性があり、列dba_object_idはインデックス付けされていないため、その場合はこのビューのSQLを作り直すことをお勧めします。 また、dbidがv$database の dbidと一致しない場合があるため、それを考慮してクエリをやり直す必要がある場合があります。

これで、PDBデータベースのflashcache に何が入っているかを確認できます。

set lines 200
set pages 200
col object for a40
col tablespace_name for a20
SELECT owner||'.'||object_name ||'('||object_type||')' object,
       tablespace_name,
       keep_mb,
       tot_mb,
       hit_ratio
  FROM debug$fc_et_ob_vw
 WHERE OWNER IN ('SCOTT','SH','OE','HR','BI','IX','OE')
 ORDER BY tot_mb DESC;

繰り返しますが、私とは異なる結果が得られますが、次のようになります。

OBJECT                                TABLESPACE_NAME   KEEP_MB TOT_MB HIT_RATIO
------------------------------------- ---------------   ------- ------ ---------
SH.SALES_TIME_BIX(INDEX PARTITION)    EXAMPLE                 0     13       100
SH.SALES_PROMO_BIX(INDEX PARTITION)   EXAMPLE                 0      9       100
SH.SALES_PROD_BIX(INDEX PARTITION)    EXAMPLE                 0      9
SH.SALES_CUST_BIX(INDEX PARTITION)    EXAMPLE                 0      7       100
SH.COSTS_PROD_BIX(INDEX PARTITION)    EXAMPLE                 0      5        96
OE.PRODUCT_REF_LIST_NESTEDTAB(TABLE)  EXAMPLE                 0      5
SH.PRODUCTS_PROD_SUBCAT_IX(INDEX)     EXAMPLE                 0      4
SH.COSTS(TABLE PARTITION)             EXAMPLE                 0      3       100
SH.COSTS_TIME_BIX(INDEX PARTITION)    EXAMPLE                 0      3
OE.ORD_CUSTOMER_IX(INDEX)             EXAMPLE                 0      3

(私のデモシステムではあまり起こっていません。)

これが、Exadataの内部動作のいくつかを掘り下げて確認したいDBAに役立つことを願っています。

これについて助けてくれたCeciliaに大いに感謝します(データベースパフォーマンスチューニングの10のヒント、Exadataおよび一般のデータベースについて)に関する以前の投稿の1つから覚えているかもしれません)。

私たちは常にあなたのフィードバックに興味を持っています。Twitter @ExadataPM@GavinAtHQ、または @alex_blyth を介して私たちと交流することを歓迎します。

関連記事