この記事はUlrike SchwinnによるGetting started with True Cache in Oracle Database 23ai FREE を日本語に翻訳したものです。

2024年8月19日


Oracle databaseの素晴らしい機能の1つに23aiのTrue Cacheという新しいキャッシュ・テクノロジーがあります。 私のコンピュート・インスタンスの1つにこれをセットアップして、いくつかの初期テストを実行しました。この投稿はかなり長いため、次の4つの部分に分けて説明します。

概要

まず、この新しいキャッシュ・テクノロジーがどのようなものか説明します。Oracle True Cacheは、Oracle Database用のインメモリで一貫性のある自動管理キャッシュです。すべてのOracle Databaseオブジェクトとデータ・タイプをキャッシュします。True Cacheは、プライマリ・データベースの完全な機能を持つ読み取り専用のレプリカである。技術的に言えば、ディスク・レスのActive Data Guard(ADG)であり、物理的なREDOを使用して、更新を適用します。従来のキャッシュとは異なり、True Cacheは最も頻繁にアクセスされるデータを自動的にキャッシュに保持し、プライマリ・データベース、同じキャッシュ内の他のオブジェクト、および他のキャッシュとの一貫性を保ちます。

つまり、標準のOracle Database Buffer Cacheに加えて、Oracle Databaseの前にある補助的な読み取り専用のデータベース・キャッシュとして使用することができます。キャッシュされたデータを使用できるすべてのクエリは、True Cacheも使用できます。True Cacheへのクエリはコミットされたデータのみを返し、データは常に一貫しています。すべてのキャッシュと同様に、True Cacheデータはプライマリ・データベースに存在する最新のデータとは限りません。

Oracle True Cacheには次のような利点があります。

  • プライマリ・データベースからクエリをオフロードすることで、スケーラビリティとパフォーマンスを向上させる。
  • True Cacheをアプリケーションの近くに配置することで、アプリケーションのレスポンスタイムとネットワーク待ち時間を短縮する。これは、データレジデンシの要件により、データベースがアプリケーションとは異なる場所にある場合に特に有効です。.
  • 複数のTrue Cacheにデータを分割することで、大きなインメモリ・ストレージ領域を作成する。すべてのTrue Cacheにキャッシュされたデータの合計サイズは、単一のプライマリ・データベースまたはキャッシュの場合よりもはるかに大きくすることができる。
  • キャッシュの内容を自動的に維持する。
  • アプリケーションに対して透過的であるため、開発とメンテナンスが簡素化される。

そのため、そのため、パフォーマンスを向上させ、アプリケーション開発を簡素化するために使用できます。アプリケーションは、必要に応じて、True Cacheからプライマリ・データベースへの接続を手動で切り替えることができます。ただし、最新のJDBC Thinドライバを使用しているJavaアプリケーション開発者は、True Cacheをフル活用するために、読み取り専用のプライマリ・データベース接続を自動的にTrue Cacheに送信されるようにすることができます。

使用可能なユースケース・シナリオの概要を知るには、インタラクティブな”Oracle True Cache Technical Architecture diagrams“を参照してください。ダイアグラムは、次のシナリオを説明しています。

  • JDBC Thinドライバを使用する4つの中間層を持つ一般的なTrue Cacheの構成。
  • 同じTrue Cacheデータベース・アプリケーション・サービスを使用する複数の同じTrue Cacheによる均一な構成。クライアント・セッションは、True Cacheに均等に分散され、True Cacheはすべて同じデータ・セットをキャッシュします。
  • データが複数のTrue Cacheに分割され、それぞれのTrue Cacheが異なるデータのサブセットをキャッシュするパーティション構成。すべてのTrue Cacheにキャッシュされるデータの合計サイズは、単一のプライマリ・データベースまたは単一のキャッシュを均等使用する構成よりもはるかに大きくなる可能性があります。
  • 複数のサービスを持つTrue Cacheパーティション構成。

現状、どのように利用できるのか?一般的に、このテクノロジーはOracle Database 23aiで利用可能です。Base EE、BaseDB EE-HP、BaseDB EE-EP、ExaDBなど、すべてのクラウド・データベースのエディションで使用でき、ダウンロード可能なアップデートされたOracle Database 23ai FREEエディションでも使用できます。始める前に、Database ライセンス情報ユーザー・マニュアルをご覧ください。 FREE データベース・ソフトウェアを使用する際は、以下の点にご留意ください。

  • Oracle Database Freeでは、プライマリ・データベースに対して最大1つまでTrue Cacheを配置できます。それ以外の場合、True Cacheとプライマリ・データベースのエディションが一致している必要があります。たとえば、Enterprise EditionのTrue Cacheは、Enterprise Editionのプライマリ・データベースにのみ配置できます。
  • Free True Cacheは、メモリ、CPU、およびユーザー データに関するすべての Oracle Database Free ライセンス制限に準拠する必要があります。

Databaseのインストールと設定

どのように動作するのかを理解するために、Oracle Database 23ai freeのインストールと設定を行いました。 2つのコンピュート・インスタンスを利用して、1つはTrue Cache用(ここでは”instance-tc.xxxx.vcnus.oraclevcn.com”)、もう1つはOracle Database 23ai free(ここでは”instance-23ai.xxxx.vcnus.oraclevcn.com”)です。 True Cacheのインストールと設定はさまざまな方法で実施できます。 私はOracle DBCAを利用したこのドキュメント(Configuring True Cache on Oracle Database Free)に記載されている手順に従いました。
始める前に、2つのコンピュート・インスタンスのファイア・ウォールを停止して、無効化しました。それから、次の手順で両インスタンスをセットアップしました。

1)プライマリ・データベース(instance-23ai.xxxx.vcnus.oraclevcn.com)のセットアップ
Oracle Database Free True Cacheを構成する前に、プライマリ・ノードに Oracle Database Freeのプライマリ・データベースをインストールしてセットアップします。

  • RPMパッケージを使用してOracle Database Freeをインストールし、Installation Guide for Linux x86-64の説明に従ってプライマリデータベースを作成および設定します。
  • アーカイブ・ログ(ARCHIVELOG)モードを有効にし、モードを確認します。
    SQL> select log_mode from V$DATABASE;
    LOG_MODE
    ------------
    ARCHIVELOG
    

2) Oracle Database Free True Cache(instance-tc.xxxx.vcnus.oraclevcn.com)の設定
プライマリ・データベースをセットアップ後、True CacheノードにOracle Database Free True Cacheを設定します。

  • RPMパッケージを使用してOracle Database Free softwareのみをインストールします(Installing Oracle Database Free RPM)参照)。
    重要なヒント: True Cacheノードでデータベースを作成および設定をしないでください!
  • oracleユーザーでログインして、次のようなenv.shスクリプトを作成します。
    export ORACLE_SID=FREE
    export ORACLE_BASE=/opt/oracle
    export ORACLE_HOME=/opt/oracle/product/23ai/dbhomeFree
    export PATH=/home/oracle/.local/bin:/home/oracle/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:
    /opt/oracle/product/23ai/dbhomeFree/bin
  • /opt/oracle/product/23ai/dbhomeFree/dbs/orapwFREEにあるプライマリのパスワード・ファイルを、True Cacheノードの/opt/oracle/tmpにコピーします。
  • True Cache環境を構成する最も簡単な方法は、Oracle Database Configuration Assistant(Oracle DBCA)を使用することです。以下のOracle DBCAコマンドを実行して、True Cache構成を完了します。詳細については、Oracle DBCA Commands and Parameters for True Cacheの章を参照してください。
    始める前に、プライマリ・データベースの簡単接続文字列(sourceDBConnectionString)が機能していることを確認します。次に、SYSパスワードの入力を求められます。
    ./dbca -silent -createTrueCache -gdbName FREE -sourceDBConnectionString instance-23ai.xxxx.vcnus.oraclevcn.com:1521/FREE -passwordFileFromSourceDB /opt/oracle/tmp/orapwFREE
    

    出力は以下のようになります。

    Enter Remote DB SYS user password:
    
    Session ID of the current execution is: 1
    Log file location: /opt/oracle/cfgtoollogs/dbca/FREE/trace.log_2024-05-21_12-15-20PM_58538
    -----------------
    Running Extract_password_file_from_blob_file job
    Completed Extract_password_file_from_blob_file job
    25% complete
    -----------------
    Running Create_static_listener job
    Completed Create_static_listener job
    38% complete
    -----------------
    Running Register_listener job
    Completed Register_listener job
    50% complete
    -----------------
    Running Extract_tde_wallet_from_blob_file job
    Skipping. Job is detected as not applicable.
    54% complete
    -----------------
    Running Setup_required_directories job
    Completed Setup_required_directories job
    57% complete
    -----------------
    Running Create_pfile job
    Completed Create_pfile job
    61% complete
    -----------------
    Running Start_nomount_instance job
    Completed Start_nomount_instance job
    64% complete
    -----------------
    Running Create_TDE_wallet job
    Skipping. Job is detected as not applicable.
    68% complete
    -----------------
    Running Create_truecache_instance job
    
    Completed Create_truecache_instance job
    71% complete
    -----------------
    Running Add_oratab_entry job
    Completed Add_oratab_entry job
    75% complete
    -----------------
    Running Reopen_wallet job
    Skipping. Job is detected as not applicable.
    100% complete
    ---------- PLUGIN NOTES ----------
    Successfully created True Cache.
    In order to complete the operation,configure the True Cache database application services from the primary database.
    ---------- END OF PLUGIN NOTES ----------
    Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE.log" for further details.

マニュアルには、True Cache用のデータベース・アプリケーション・サービスの構成方法に関する追加手順が記載されています。ここではそれらを省略して、基本的な設定でテストしてみましょう。

検証手順

それでは、True Cacheインスタンスのセットアップを確認してみましょう。True Cacheインスタンスはすでに起動しており、init.oraは作成済みです。

SQL> select name, open_mode, database_role from v$database;
NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
FREE      READ ONLY WITH APPLY TRUE CACHE

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ ONLY  NO

SQL> select controlfile_type from v$database;
CONTROLFIL
----------
TRUE CACHE

次に、新しいビュー V$TRUE_CACHEをクエリし、True Cacheの詳細を調べてみましょう。

SQL> col TRUE_CACHE_NAME format a15
SQL> col status format a10 
SQL> col primary_name format a15
SQL> select TRUE_CACHE_NAME, PRIMARY_NAME, STATUS, REMOTE_VERSION, CON_ID from v$true_cache;

TRUE_CACHE_NAME PRIMARY_NAME    STATUS          REMOTE_VERSION         CON_ID
--------------- --------------- --------------- ------------------ ----------
FREE            FREE            HEALTHY         23.0.0.0.0                  0

次に、パラメータ・ファイルを調べてみましょう。$ORACLE_HOME/dbs/init_FREE.oraを表示

[oracle@instance-tc-1 dbs]$ more  init_FREE.ora
##############################################################################
# Copyright (c) 1991, 2024 by Oracle Corporation
##############################################################################
###########################################
# Database Identification
###########################################
db_name="FREE"
###########################################
# File Configuration
###########################################
db_create_file_dest="/opt/oracle/oradata"
db_files=200
###########################################
# Miscellaneous
###########################################
enable_pluggable_database=true
true_cache=true
###########################################
# Network Registration
###########################################
remote_listener=instance-23ai.xxxx.vcnus.oraclevcn.com:1521
local_listener=LISTENER
###########################################
# SGA Memory
###########################################
sga_target=1536m
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=512m
###########################################
# Standby Database
###########################################
fal_client=instance-tc.xxxx.vcnus.oraclevcn.com:1521/FREE
fal_server=instance-23ai.xxxx.vcnus.oraclevcn.com:1521/FREE
db_unique_name="FREE"

簡単にするために、True Cacheとプライマリ・インスタンスのtnsnames.oraに以下の2つのエントリを追加しました。

freepdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = instance-23ai.xxxx.vcnus.oraclevcn.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = freepdb1)
    )
  )

free_tc =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = instance-tc.xxxx.vcnus.oraclevcn.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = freepdb1)
    )
  )

サービス名は両ホストでfreepdb1となっており、プライマリ・ホスト接続用のtnsnamesのエントリ freepdb1 とTrue Cacheサービス用のfree_tcが使用されます。 そのため、プライマリまたはTrue Cacheインスタンスへの接続には、両方を使用することになります。

通常、SHUTDOWNコマンドを使用してTrue Cacheインスタンスをシャットダウンできます。既存のTrue Cacheを起動するには、STARTUPコマンドを使用します。次の例では、True Cacheインスタンスを再起動しています。

SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 1599564808 bytes
Fixed Size                  5360648 bytes
Variable Size             402653184 bytes
Database Buffers         1191182336 bytes
Redo Buffers                 368640 bytes
Database mounted.
Database opened.

それでは、実際にデータをクエリーしてみましょう。最初はプライマリ・データベース・キャッシュを使用し、次にTrue Cacheを使用します。

基本テスト

クエリー用のデータを取得するために、GitHubからデータベース・スキーマ SH をインストールします。クイック・インストールの方法について簡単な説明はOracle Databaseのためのサンプル・データを参照してください。

CUSTOMERS表を使ってみましょう。パーティション化されておらず、作業するのに十分なブロックがあります。
デフォルト・サービス freepdb1を持つプライマリ・ホストで、CUSTOMER表を確認します。

SQL> select num_rows, blocks, partitioned from all_tables 
     where owner='SH' and table_name='CUSTOMERS';
  NUM_ROWS     BLOCKS PAR
---------- ---------- ---
     55500       1630 NO

それでは、以下のコマンドでプライマリ・ホスト上のバッファ・キャッシュにCUSTOMERS表を事前ロードしましょう。
注意: “_small_table_threshold”を手動で変更し、大きなテーブルのダイレクト・パス・リードを回避してください。”_small_table_threshold”は、ダイレクト・リードのテーブル・サイズの下限値を定義します。

-- "_small_table_threshold"は、ダイレクト・リード用のテーブル・サイズの下限値を定義するもので、手動で増やすことが可能
-- alter session set "_small_table_threshold"=3000;

SQL> select /*+FULL(c)*/ count(*) from sh.customers c;
  COUNT(*)
----------
     55500

次のステップでは、V$BHでキャッシュの状態をチェックする。覚えておいてほしい: V$BHは、現在バッファ・キャッシュにあるDATA_OBJECT_IDを持つブロックをリストする。

SQL> set trimspool on
SQL> set linesize 180
SQL> col object_name format a30
SQL> col object_type format a20
SQL> col owner format a25
SQL> col number_of_blocks format 9999999999999

SQL> SELECT o.OBJECT_NAME, o.OBJECT_TYPE, o.OWNER, COUNT(*) NUMBER_OF_BLOCKS,   
  2  substr(d.database_role,1,10) role   
  3  FROM DBA_OBJECTS o, V$BH bh,  v$database d   
  4  WHERE o.DATA_OBJECT_ID = bh.OBJD   
  5  AND o.OWNER in ('SH') and o.object_name like 'CUSTOMERS%'   
  6  GROUP BY o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE,d.database_role;

OBJECT_NAME                    OBJECT_TYPE          OWNER                     NUMBER_OF_BLOCKS ROLE
------------------------------ -------------------- ------------------------- ---------------- ----------------------------------------
CUSTOMERS                      TABLE                SH                                    1541 PRIMARY
CUSTOMERS_GENDER_BIX           INDEX                SH                                       5 PRIMARY
CUSTOMERS_MARITAL_BIX          INDEX                SH                                       1 PRIMARY
CUSTOMERS_PK                   INDEX                SH                                       1 PRIMARY
CUSTOMERS_YOB_BIX              INDEX                SH                                       1 PRIMARY

それでは、tnsname free_tcを使ってTrue Cacheインスタンスにクエリーしてみましょう。

SQL> connect system/password@free_tc
SQL> set trimspool on
SQL> set linesize 180
SQL> col object_name format a30
SQL> col object_type format a20
SQL> col owner format a25
SQL> col number_of_blocks format 9999999999999

SQL> SELECT o.OBJECT_NAME, o.OBJECT_TYPE, o.OWNER, COUNT(*) NUMBER_OF_BLOCKS,
  2  substr(d.database_role,1,10) role
  3  FROM DBA_OBJECTS o, V$BH bh,  v$database d
  4  WHERE o.DATA_OBJECT_ID = bh.OBJD
  5  AND o.OWNER in ('SH') and o.object_name like 'CUSTOMERS%'
  6  GROUP BY o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE,d.database_role;
no rows selected 

では、SHとしてTrue Cacheインスタンスに接続してみましょう。CUSTOMERS表の1行をクエリーします。これにはプライマリ・キーを使用します。

SQL> connect sh/sh@free_tc
SQL> set lines 200
SQL> select * from sh.customers where cust_id=1;

   CUST_ID CUST_FIRST_NAME      CUST_LAST_NAME                           C CUST_YEAR_OF_BIRTH CUST_MARITAL_STATUS  CUST_STREET_ADDRESS                      CUST_POSTA CUST_CITY
---------- -------------------- ---------------------------------------- - ------------------ -------------------- ---------------------------------------- ---------- ------------------------------
CUST_CITY_ID CUST_STATE_PROVINCE                      CUST_STATE_PROVINCE_ID COUNTRY_ID CUST_MAIN_PHONE_NUMBER    CUST_INCOME_LEVEL              CUST_CREDIT_LIMIT
------------ ---------------------------------------- ---------------------- ---------- ------------------------- ------------------------------ -----------------
CUST_EMAIL                                         CUST_TOTAL     CUST_TOTAL_ID CUST_SRC_ID CUST_EFF_ CUST_EFF_ C
-------------------------------------------------- -------------- ------------- ----------- --------- --------- -
         1 Abigail              Kessel                                   M               1957                      7 South 3rd Circle                       30828      Downham Market
       51396 England - Norfolk                                         52591      52789 127-379-8954              G: 130,000 - 149,999                        9000
Kessel@company.example.com                         Customer total         52772             01-JAN-19           I

True Cacheを確認してみましょう。索引と表のブロックがTrue Cache上にあります。

SQL> set trimspool on
SQL> set linesize 180
SQL> col object_name format a30
SQL> col object_type format a20
SQL> col owner format a25
SQL> col number_of_blocks format 9999999999999

SQL> SELECT o.OBJECT_NAME, o.OBJECT_TYPE, o.OWNER, COUNT(*) NUMBER_OF_BLOCKS,
  2  substr(d.database_role,1,10) role
  3  FROM DBA_OBJECTS o, V$BH bh,  v$database d
  4  WHERE o.DATA_OBJECT_ID = bh.OBJD
  5  AND o.OWNER in ('SH') and o.object_name like 'CUSTOMERS%'
  6  GROUP BY o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE,d.database_role;

OBJECT_NAME                    OBJECT_TYPE          OWNER                     NUMBER_OF_BLOCKS ROLE
------------------------------ -------------------- ------------------------- ---------------- ----------------------------------------
CUSTOMERS_PK                   INDEX                SH                                       2 TRUE CACHE
CUSTOMERS                      TABLE                SH                                       2 TRUE CACHE

それでは、次のクエリーを使用してさらにブロックをロードしてみましょう。

-- SQL> alter session set "_small_table_threshold"=3000;

SQL> select /*+FULL(c)*/ count(*) from sh.customers c;
  COUNT(*)
----------
     55500

モニタリング・セッションで確認できるように、表ブロックは予想通りTrue Cacheにある。

SQL> SELECT o.OBJECT_NAME, o.OBJECT_TYPE, o.OWNER, COUNT(*) NUMBER_OF_BLOCKS, substr(d.database_role,1,10) role
  2  FROM DBA_OBJECTS o, V$BH bh, v$database d
  3  WHERE o.DATA_OBJECT_ID = bh.OBJD
  4  AND o.OWNER in ('SH') and o.object_name like 'CUSTOMERS%'
  5  GROUP BY o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE, d.database_role;

OBJECT_NAME                    OBJECT_TYPE          OWNER                     NUMBER_OF_BLOCKS ROLE
------------------------------ -------------------- ------------------------- ---------------- ----------------------------------------
CUSTOMERS                      TABLE                SH                                    1541 TRUE CACHE
CUSTOMERS_PK                   INDEX                SH                                       2 TRUE CACHE

これで最初のテストは終わりです。
この投稿で使用したクエリーと設定は、この機能がどのように設定され使用されるかを理解できるように、意図的に非常に基本的なものにしました。 実際のシナリオでは、追加のアプリケーション・サービスを使用してこの設定を拡張できます(Configuring Database Application Services for True Cache参照)。KEEP Bufferや結果キャッシュなど、True Cacheを補完するキャッシュ機能を使用することもできます。

自分で試してみるのが、一番です。

参考文献