この記事は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を補完するキャッシュ機能を使用することもできます。
自分で試してみるのが、一番です。
参考文献
- True Cache on oracle.com
- Interactive Oracle True Cache Technical Architecture
- Oracle True Cacheの紹介
- Installation Guide for Linux x86-64Configuring True Cache on Oracle Database Free
- Database Licensing Information User Manual
- Oracle True Cache User’s Guide
- True Cache on GitHub