プライマリ・コンテンツに移動
Oracle® TimesTen In-Memory Database Kubernetesオペレータ・ユーザーズ・ガイド
リリース18.1
F33742-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

B TimesTen Cacheの例

この付録では、Kubernetes環境でTimesTen Cacheを使用するための実際の例を示します。この例は、本番目的には使用しないでください。これは、テスト環境を想定したものです。Oracle Databaseは、目的の環境に固有の設定でカスタマイズする必要があります。

トピック:

データをキャッシュするためのOracle Databaseの設定

次の各項では、Oracle Databaseで実行する必要があるタスクについて説明します。

Oracle Databaseユーザーの作成

TimesTen Cacheを使用するには、まず、次のユーザーをOracle Databaseで作成しておく必要があります。

  • キャッシュ管理ユーザー。このユーザーは、キャッシュ環境に関する情報を格納するOracle Databaseオブジェクトを作成およびメンテナンスします。このユーザーは、キャッシュ・グループ・タイプの事前定義済動作も実施します。

  • TimesTenデータベースにキャッシュされるOracle Database表を所有する1人または複数のスキーマ・ユーザー。

詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のOracle Databaseユーザーの作成に関する項を参照してください。

この例では、Oracle Databaseにcacheuser2キャッシュ管理ユーザーとorattスキーマ・ユーザーを作成します。

  1. Oracle Databaseにアクセスできるシェルを作成し、SQL*Plusを使用してsysユーザーとしてOracle Databaseに接続します。その次に、TimesTen Cache管理オブジェクトを格納するデフォルトの表領域を作成します。詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のOracle Databaseユーザーの作成に関する項を参照してください。

    この例では、cachetablespace2表領域を作成します。

    % sqlplus sys/syspwd@oracache as sysdba
     
    SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 23 22:10:20 2020
     
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing 
    options
    
    SQL> CREATE TABLESPACE cachetablespace2 DATAFILE 'datatt2.dbf' SIZE 100M;
     
    Tablespace created.
    
  2. SQL*Plusを使用してスキーマ・ユーザーを作成します。このスキーマ・ユーザーには、TimesTenデータベースにキャッシュされるOracle Databaseの表を作成するために必要な最小限の権限セットを付与します。

    この例では、orattスキーマ・ユーザーを作成します。

    SQL> CREATE USER oratt IDENTIFIED BY oraclepwd;
     
    User created.
     
    SQL> GRANT CREATE SESSION, RESOURCE TO oratt;
     
    Grant succeeded.
    
  3. SQL*Plusを使用してキャッシュ管理ユーザーを作成します。このユーザーにcachetablespace2表領域を割り当てます。このOracleキャッシュ管理ユーザーと同じ名前をcacheUserメタデータ・ファイルで使用することになります。cacheUserメタデータ・ファイルの詳細は、「cacheUser」および「メタデータ・ファイルとKubernetes機能の作成」を参照してください。

    この例では、cacheuser2ユーザーを作成します。

    SQL> CREATE USER cacheuser2 IDENTIFIED BY oraclepwd 
           DEFAULT TABLESPACE cachetablespace2 
           QUOTA UNLIMITED ON cachetablespace2;
     
    User created.
    
    SQL> commit;
     
    Commit complete.
    
    SQL> exit
    

キャッシュ管理ユーザーへの権限の付与

キャッシュ管理ユーザーには、TimesTenデータベースに作成するキャッシュ・グループ・タイプと、それらのキャッシュ・グループに対して実行される操作に応じて、特定の権限セットを付与する必要があります。TimesTenには、Oracle Databaseで実行できるgrantCacheAdminPrivileges.sql SQL*Plusスクリプトが用意されています。これを使用すると、キャッシュ操作の実行に必要な最小限の権限をキャッシュ管理ユーザーに付与できます。こうした権限の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のOracleデータベース・ユーザーへの権限の付与に関する項およびキャッシュ管理ユーザーおよびキャッシュ・マネージャ・ユーザーに必要な権限に関する項を参照してください。

次のステップに従って、grantCacheAdminPrivileges.sqlスクリプトを実行します。

  1. Oracle Databaseにアクセスできるシェルを作成して、任意のディレクトリから空のサブディレクトリを作成します。この例では、oraclescriptsサブディレクトリを作成します。

    % mkdir -p oraclescripts
    
  2. Linux開発ホストからkubectl cpコマンドを使用して、Linux開発ホストのinstallation_dir/oraclescriptsディレクトリにあるgrantCacheAdminPrivileges.sqlスクリプトを前の手順で作成したoraclescriptsディレクトリにコピーします。installation_dirディレクトリは、TimesTenディストリビューションの解凍時に作成されたものです。TimesTenディストリビューションの解凍手順の詳細は、「TimesTenおよびTimesTenオペレータのダウンロード」を参照してください。

    % cp /installation_dir/oraclescripts/grantCacheAdminPrivileges.sql 
    database-oracle:oraclescripts/grantCacheAdminPrivileges.sql
    
  3. シェルから、このスクリプトがoraclescriptsディレクトリに配置されていることを確認します。

    % ls oraclescripts
    grantCacheAdminPrivileges.sql
     
    
  4. SQL*Plusを使用して、sysユーザーとしてOracle Databaseに接続します。その次に、oraclescripts/grantCacheAdminPrivileges.sqlスクリプトを実行します。このスクリプトでは、cacheuser2キャッシュ管理ユーザーにキャッシュ・グループの操作を実行するために必要な最小限の権限を付与します。詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のOracle Databaseユーザーへの権限の付与に関する項を参照してください。

    % sqlplus sys/syspwd@oracache as sysdba
     
    SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 23 22:10:20 2020
     
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing 
    options
    
    SQL> @grantCacheAdminPrivileges "cacheuser2";
     
    Please enter the administrator user id
    The value chosen for administrator user id is cacheuser2
     
    TT_CACHE_ADMIN_ROLE role already exists
    ***************** Initialization for cache admin begins ******************
    0. Granting the CREATE SESSION privilege to CACHEUSER2
    1. Granting the TT_CACHE_ADMIN_ROLE to CACHEUSER2
    2. Granting the DBMS_LOCK package privilege to CACHEUSER2
    3. Granting the DBMS_DDL package privilege to CACHEUSER2
    4. Granting the DBMS_FLASHBACK package privilege to CACHEUSER2
    5. Granting the CREATE SEQUENCE privilege to CACHEUSER2
    6. Granting the CREATE CLUSTER privilege to CACHEUSER2
    7. Granting the CREATE OPERATOR privilege to CACHEUSER2
    8. Granting the CREATE INDEXTYPE privilege to CACHEUSER2
    9. Granting the CREATE TABLE privilege to CACHEUSER2
    10. Granting the CREATE PROCEDURE  privilege to CACHEUSER2
    11. Granting the CREATE ANY TRIGGER  privilege to CACHEUSER2
    12. Granting the GRANT UNLIMITED TABLESPACE privilege to CACHEUSER2
    13. Granting the DBMS_LOB package privilege to CACHEUSER2
    14. Granting the SELECT on SYS.ALL_OBJECTS privilege to CACHEUSER2
    15. Granting the SELECT on SYS.ALL_SYNONYMS privilege to CACHEUSER2
    16. Checking if the cache administrator user has permissions on the 
        default tablespace
        Permission exists
    18. Granting the CREATE TYPE privilege to CACHEUSER2
    19. Granting the SELECT on SYS.GV$LOCK privilege to CACHEUSER2
    20. Granting the SELECT on SYS.GV$SESSION privilege  to CACHEUSER2
    21. Granting the SELECT on SYS.DBA_DATA_FILES privilege  to CACHEUSER2
    22. Granting the SELECT on SYS.USER_USERS privilege  to CACHEUSER2
    23. Granting the SELECT on SYS.USER_FREE_SPACE privilege  to CACHEUSER2
    24. Granting the SELECT on SYS.USER_TS_QUOTAS privilege  to CACHEUSER2
    25. Granting the SELECT on SYS.USER_SYS_PRIVS privilege  to CACHEUSER2
    26. Granting the SELECT on SYS.V$DATABASE privilege  to CACHEUSER2 (optional)
    27. Granting the SELECT ANY TRANSACTION privilege to CACHEUSER2
    ********* Initialization for cache admin user done successfully *********
    

grantCacheAdminPrivileges.sqlスクリプトをOracle Databaseで正常に実行しました。

キャッシュされるOracle Database表の作成

この例では、orattユーザー・スキーマに2つの表を作成します。このユーザーの詳細は、「Oracle Databaseユーザーの作成」を参照してください。

  • readtab: この表は、読取り専用キャッシュ・グループにキャッシュされることになります。

  • writetab: この表は、AWTキャッシュ・グループにキャッシュされることになります。

  1. Oracle Databaseにアクセスできるシェルを作成し、SQL*Plusを使用してsysユーザーとしてOracle Databaseに接続します。その次に、oratt.readtab表とoratt.writetab表を作成します。

    % sqlplus sys/syspwd@oracache as sysdba
     
    SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 23 22:10:20 2020
     
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing 
    options
    
    SQL> CREATE TABLE oratt.readtab (keyval NUMBER NOT NULL PRIMARY KEY, 
           str VARCHAR2(32));
     
    Table created.
    
    SQL> CREATE TABLE oratt.writetab (pk NUMBER NOT NULL PRIMARY KEY, 
           attr VARCHAR2(40));
     
    Table created.
    
  2. SQL*Plusを使用して、oratt.readtab表とoratt.writetab表に行を挿入します。その次に、行が挿入されていることを確認します。

    SQL> INSERT INTO oratt.readtab VALUES (1,'Hello');
     
    1 row created.
    
    SQL> INSERT INTO oratt.readtab VALUES (2,'World');
     
    1 row created.
    
    SQL> INSERT INTO oratt.writetab VALUES (100, 'TimesTen');
     
    1 row created.
    
    SQL> INSERT INTO oratt.writetab VALUES (101, 'Cache');
     
    1 row created.
    
    SQL> commit;
     
    Commit complete.
    

    行が表に挿入されていることを確認します。

    SQL> SELECT * FROM oratt.readtab;
     
        KEYVAL STR
    ---------- --------------------------------
             1 Hello
             2 World
     
    SQL>  SELECT * FROM oratt.writetab;
     
            PK ATTR
    ---------- ----------------------------------------
           100 TimesTen
           101 Cache
    
  3. SQL*Plusを使用して、oratt.readtab表に対するSELECT権限と、oratt.writetab表に対するSELECTINSERTUPDATEおよびDELETEの各権限をキャッシュ管理ユーザー(この例ではcacheuser2)に付与します。

    SQL> GRANT SELECT ON oratt.readtab TO cacheuser2;
     
    Grant succeeded.
     
    SQL> GRANT SELECT ON oratt.writetab TO cacheuser2;
     
    Grant succeeded.
     
    SQL> GRANT INSERT ON oratt.writetab TO cacheuser2;
     
    Grant succeeded.
     
    SQL> GRANT UPDATE ON oratt.writetab TO cacheuser2;
     
    Grant succeeded.
     
    SQL> GRANT DELETE ON oratt.writetab TO cacheuser2;
     
    Grant succeeded.
    
  4. SQL*Plusを使用して、nls_database_parametersシステム・ビューを問い合せて、Oracle Databaseのデータベース文字セットを確認します。Oracle Databaseのデータベース文字セットは、TimesTenのデータベース文字セットと一致している必要があります。(TimesTenのデータベース文字セットは、この後で設定します。詳細は、「メタデータ・ファイルとKubernetes機能の作成」を参照してください)。

    この例では、問合せによってAL32UTF8データベース文字セットが返されます。

    SQL> SELECT value FROM nls_database_parameters WHERE 
           parameter='NLS_CHARACTERSET';
     
    VALUE
    ------------------------------------------------------------------------------
    AL32UTF8
    

TimesTenキャッシュ・グループ表にキャッシュされるOracle Databaseの表が正常に作成されました。

メタデータ・ファイルとKubernetes機能の作成

TimesTen Cacheの使用に固有のメタデータ・ファイルがあります。

  • cacheUser: このファイルは必須です。このファイルのユーザーは、TimesTenデータベースで作成されたもので、キャッシュ・マネージャとしての役割を果たします。このユーザーの名前は、Oracle Databaseで作成したキャッシュ管理ユーザーの名前と一致する必要があります。Oracle Databaseのキャッシュ管理ユーザーの詳細は、「Oracle Databaseユーザーの作成」を参照してください。また、cacheUserメタデータ・ファイルの詳細は、「cacheUser」を参照してください。

  • cachegroups.sql: このファイルは必須です。このファイルの内容は、CREATE CACHE GROUPの定義です。このファイルには、LOAD CACHE GROUP文と、キャッシュ・グループ表(ttOptEstimateStatsttOptUpdateStatsなど)の統計を更新する組込みプロシージャを含めることもできます。このファイルの詳細は、「cachegroups.sql」を参照してください。

  • tnsnames.ora: このファイルは必須です。アプリケーションが接続するOracle Net Servicesを定義します。TimesTen Cacheの場合は、このファイルでTimesTenとOracle Database (データのキャッシュ元)の間の接続を構成します。このコンテキストでは、TimesTenがOracle Databaseに接続するアプリケーションです。このファイルの詳細は、「tnsnames.oraファイル」を参照してください。

  • sqlnet.ora: このファイルは場合応じて必須になります。Oracle Databaseの構成に応じて必要になることがあります。このファイルでは、クライアント・アプリケーションがOracle Databaseと通信する方法のオプションを定義します。このコンテキストでは、TimesTenがアプリケーションです。tnsnames.orasqlnet.oraの両方のファイルで、アプリケーションがOracle Databaseと通信する方法を定義します。このファイルの詳細は、「sqlnet.oraファイル」を参照してください。

  • db.ini: TimesTen Cacheを使用する場合、このファイルは必須です。このファイルの内容には、TimesTenデータベースのTimesTen接続属性が含まれます。その内容は、TimesTenのsys.odbc.iniファイルに含めることになります。TimesTen Cacheについては、接続属性のOracleNetServiceNameDatabaseCharacterSetを指定する必要があります。DatabaseCharacterSet接続属性は、Oracleデータベース文字セットと一致する必要があります。このファイルの詳細は、「db.iniファイル」を参照してください。

  • schema.sql: このファイルの内容には、表、順序、ユーザーなどのデータベース・オブジェクトが含まれます。インスタンス管理者は、ttIsqlユーティリティを使用して、このファイルをデータベースの作成直後に実行します。このファイルはオペレータがTimesTen Cacheまたはレプリケーションを構成する前に実行されるため、このファイルにキャッシュ定義が含まれていないことを確認してください。

    TimesTen Cacheでは、1人または複数のキャッシュ表ユーザーがキャッシュ表を所有します。このキャッシュ表ユーザーがキャッシュ・マネージャ・ユーザーでない場合は、schema.sqlファイルを指定する必要があります。さらに、このファイルにスキーマ・ユーザーを含めて、そのスキーマ・ユーザーに適切な権限を割り当てることも必要です。たとえば、Oracle Databaseでorattスキーマ・ユーザーが作成されていたときに、このユーザーがTimesTenキャッシュ・マネージャ・ユーザーでない場合は、このファイルにTimesTen orattユーザーを作成する必要があります。Oracle Databaseのスキーマ・ユーザーの詳細は、「Oracle Databaseユーザーの作成」を参照してください。また、schema.sqlファイルの詳細は、「schema.sqlファイル」を参照してください。

さらに、サポートされている次のメタデータ・ファイルも使用できます。

  • adminUser: このファイル内のユーザーは、TimesTenデータベースに作成されて、ADMIN権限を付与されます。このファイルの詳細は、「adminUserファイル」を参照してください。

  • epilog.sql: このファイルの内容には、オペレータがレプリケーションを構成した後に実行する必要がある操作が含まれます。たとえば、XLAを使用する場合は、このファイルでXLA用のレプリケートされたブックマークを作成できます。このファイルは、キャッシュとレプリケーションの構成後に実行されます。このファイルの詳細は、「epilog.sql」を参照してください。

これらのメタデータ・ファイルは、Kubernetesの1つ以上の機能(たとえば、Kubernetes Secret、ConfigMapまたは初期化コンテナ)に含めることができます。これにより、メタデータ・ファイルがTimesTenコンテナの/ttconfigディレクトリに確実に移入されます。この/ttconfigディレクトリにメタデータ・ファイルを配置する方法についての要件はありません。詳細は、「/ttconfigディレクトリの移入」を参照してください。

この例では、ConfigMap機能を使用して、TimesTenコンテナに/ttconfigディレクトリを移入します。この例では、メタデータ・ファイルのadminUserdb.inischema.sqlcacheUsercachegroups.sqltnsnames.oraおよびsqlnet.oraを使用します。

Linux開発ホストで、次のことを実行します。

  1. 選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_cachetestサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にcm_cachetestディレクトリを使用します)。

    % mkdir -p cm_cachetest
    
  2. ConfigMapディレクトリに移動します。

    % cd cm_cachetest
    
  3. このConfigMapディレクトリ(この例ではcm_cachetest)にadminUserファイルを作成します。このadminUserファイルで、tigerパスワードを使用してscottユーザーを作成します。

    vi adminUser
    
    scott/tiger
    
  4. このConfigMapディレクトリ(この例ではcm_cachetest)にdb.iniファイルを作成します。このdb.iniファイルでは、接続属性のPermSizeDatabaseCharacterSetおよびOracleNetServiceNameを定義します。DatabaseCharacterSet値は、Oracle Databaseのデータベース文字セット値と一致している必要があります。nls_database_parametersシステム・ビューを問い合せてOracle Databaseのデータベース文字セットを確認する方法の詳細は、「キャッシュされるOracle Database表の作成」を参照してください。この例では、値はAL32UTF8です。

    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    OracleNetServiceName=Oracache
    
  5. このConfigMapディレクトリ(この例ではcm_cachetest)にschema.sqlファイルを作成します。この例では、orattユーザーを作成します。このユーザーは以前にOracle Databaseで作成されたものです。Oracle Databaseのorattユーザーの詳細は、「Oracle Databaseユーザーの作成」を参照してください。

    vi schema.sql
    
    create user oratt identified by ttpwd;
    grant admin to oratt;
    
  6. このConfigMapディレクトリ(この例ではcm_cachetest)にcacheUserメタデータ・ファイルを作成します。cacheUserファイルには、cacheuser/ttpassword/orapasswordという形式の1つの行を含める必要があります。cacheuserは、TimesTenデータベースでキャッシュ・マネージャとして指定するユーザーです。ttpasswordは、このユーザーに割り当てるTimesTenパスワードです。また、orapasswordは、すでにOracle Databaseキャッシュ管理ユーザーに割り当てられているOracle Databaseパスワードです。このファイル内のcacheUser名は、前に作成したOracle Databaseキャッシュ管理ユーザーと一致している必要がある点に注意してください。Oracle Databaseキャッシュ管理ユーザーの詳細は、「Oracle Databaseユーザーの作成」を参照してください。

    この例では、パスワードがoraclepwdcacheuser2ユーザーが、すでにOracle Databaseに作成されています。そのため、TimesTenキャッシュ・マネージャ・ユーザーとしてcacheuser2を指定します。このTimesTenキャッシュ・マネージャ・ユーザーには、任意のTimesTenパスワードを割り当てることができます。この例では、ttpwdを割り当てます。

    vi cacheuser
    
    cacheuser2/ttpwd/oraclepwd
    
  7. このConfigMapディレクトリ(この例ではcm_cachetest)にcachegroups.sqlメタデータ・ファイルを作成します。cachegroups.sqlファイルには、キャッシュ・グループ定義が含まれています。この例では、動的AWTキャッシュ・グループと読取り専用キャッシュ・グループが作成されます。また、LOAD CACHE GROUP文も含まれています。この文は、Oracle Databaseのoratt.readtabキャッシュ表からTimesTenデータベースのoratt.readtabキャッシュ表に行をロードするためのものです。

    vi cachegroups.sql
    
    CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache
    FROM oratt.writetab (
      pk NUMBER NOT NULL PRIMARY KEY,
      attr VARCHAR2(40)
    );
     
    CREATE READONLY CACHE GROUP readcache
    AUTOREFRESH
      INTERVAL 5 SECONDS
    FROM oratt.readtab (
      keyval NUMBER NOT NULL PRIMARY KEY,
      str VARCHAR2(32)
    );
     
    LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
    
  8. このConfigMapディレクトリ(この例ではcm_cachetest)にtnsnames.oraメタデータ・ファイルを作成します。

    vi tnsnames.ora
    
    OraTest =   
     (DESCRIPTION = 
       (ADDRESS = (PROTOCOL = TCP)(HOST = database.myhost.svc.cluster.local)
         (PORT = 1521))     
       (CONNECT_DATA =       
         (SERVER = DEDICATED)       
         (SERVICE_NAME = OraTest.my.domain.com)))
    OraCache =  
     (DESCRIPTION =   
       (ADDRESS = (PROTOCOL = TCP)(HOST = database.myhost.svc.cluster.local)
         (PORT = 1521))     
       (CONNECT_DATA =       
         (SERVER = DEDICATED)       
         (SERVICE_NAME = OraCache.my.domain.com)))
    
  9. このConfigMapディレクトリ(この例ではcm_cachetest)にsqlnet.oraメタデータ・ファイルを作成します。

    vi sqlnet.ora
    
    NAME.DIRECTORY_PATH= {TNSNAMES, EZCONNECT, HOSTNAME}
    SQLNET.EXPIRE_TIME = 10
    SSL_VERSION = 1.2
    
  10. Linuxのlsコマンドを使用して、メタデータ・ファイルがConfigMapディレクトリ(この例ではcm_cachetest)内にあることを確認します。

    % ls
    adminUser        cacheUser  schema.sql  tnsnames.ora
    cachegroups.sql  db.ini     sqlnet.ora
    
  11. ConfigMapを作成します。cm_cachetestディレクトリ内のファイルは、ConfigMapに含めておくことで、TimesTenコンテナで使用できるようにします。

    この例では次のとおりです。

    • ConfigMapの名前はcachetestです。cachetestは適宜の名前に置き換えます(この例では、cachetest太字で表示しています)。

    • この例では、ConfigMapにコピーするファイルが存在しているディレクトリとしてcm_cachetestを使用しています。別のディレクトリを使用する場合、cm_cachetestは目的のディレクトリの名前に置き換えます(この例では、cm_cachetest太字で表示しています)。

    kubectl createコマンドを使用して、ConfigMapを作成します。

    % kubectl create configmap cachetest --from-file=cm_cachetest
    configmap/cachetest created
    
  12. kubectl describeコマンドを使用して、ConfigMap (この例ではcachetest)の内容を確認します。メタデータ・ファイルは太字で表示しています。

    % kubectl describe configmap cachetest;
    Name:         cachetest
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Data
    ====
    tnsnames.ora:
    ----
    
    OraTest =   
     (DESCRIPTION = 
       (ADDRESS = (PROTOCOL = TCP)(HOST = database.myhost.svc.cluster.local)
         (PORT = 1521))     
       (CONNECT_DATA =       
         (SERVER = DEDICATED)       
         (SERVICE_NAME = OraTest.my.domain.com)))
    OraCache =  
     (DESCRIPTION =   
       (ADDRESS = (PROTOCOL = TCP)(HOST = database.myhost.svc.cluster.local)
         (PORT = 1521))     
       (CONNECT_DATA =       
         (SERVER = DEDICATED)       
         (SERVICE_NAME = OraCache.my.domain.com)))
     
    adminUser:
    ----
    scott/tiger
     
    cacheUser:
    ----
    cacheuser2/ttpwd/oraclepwd
     
    cachegroups.sql:
    ----
    CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache
    FROM oratt.writetab (
      pk NUMBER NOT NULL PRIMARY KEY,
      attr VARCHAR2(40)
    );
     
    CREATE READONLY CACHE GROUP readcache
    AUTOREFRESH
      INTERVAL 5 SECONDS
    FROM oratt.readtab (
      keyval NUMBER NOT NULL PRIMARY KEY,
      str VARCHAR2(32)
    );
     
    LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
     
    db.ini:
    ----
    permSize=200
    databaseCharacterSet=AL32UTF8
    oracleNetServiceName=Oracache
     
    schema.sql:
    ----
    create user oratt identified by ttpwd;
    grant admin to oratt;
     
    sqlnet.ora:
    ----
    NAME.DIRECTORY_PATH= {TNSNAMES, EZCONNECT, HOSTNAME}
    SQLNET.EXPIRE_TIME = 10
    SSL_VERSION = 1.2
     
     
    Events:  <none>
    

cachetest ConfigMapの作成とデプロイが完了しました。

TimesTenClassicオブジェクトの作成

この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクトの詳細は、TimesTenClassicオブジェクトの定義および作成およびTimesTenClassicオブジェクト・タイプを参照してください。

次のステップを実行します。

  1. 空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、cachetest)。YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。

    この例では、次のフィールドに注目してください。

    • name: cachetestはTimesTenClassicオブジェクト(太字で表示)の名前に置き換えます。

    • storageClassName: ociを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。

    • storageSize: 250Gを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSizeには250Gの値を使用しています。デモ用の場合は、50Gの値で対応できます。

    • image: phx.ocir.io/youraccount/tt1814110:3は、イメージ・レジストリの場所(phx.ocir.io/youraccount)とTimesTenが含まれているイメージ(tt1814110:3)に置き換えます。

    • imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。

    • dbConfigMap: この例では、メタデータ・ファイル(太字で表示)に1つのConfigMap (cachetest)を使用しています。

    % vi cachetest.yaml
    
    apiVersion: timesten.oracle.com/v1
    kind: TimesTenClassic
    metadata:
      name: cachetest
    spec:
      ttspec:
        storageClassName: oci
        storageSize: 250G
        image: phx.ocir.io/youraccount/tt1814110:3
        imagePullSecret: sekret
        imagePullPolicy: Always
        dbConfigMap:
        - cachetest
    
  2. kubectl createコマンドを使用して、YAMLファイル(この例ではcachetest.yaml)の内容からTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。

    % kubectl create -f cachetest.yaml
    timestenclassic.timesten.oracle.com/cachetest created
    

KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。

TimesTenClassicオブジェクトのデプロイメントの監視

kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。

  1. kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。

    % kubectl get ttc cachetest
    NAME        STATE          ACTIVE   AGE
    cachetest   Initializing   None     41s
    
  2. kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。

    % kubectl get ttc cachetest
    NAME        STATE    ACTIVE        AGE
    cachetest   Normal   cachetest-0   3m58s
    
  3. kubectl describeコマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。

    次の点に注目してください。

    • cachetest Configmapは、dbConfigMapフィールドで正しく参照されています(太字で表示)。

    • キャッシュ・エージェントはアクティブ・ポッドとスタンバイ・ポッド(太字で表示)で実行されています。

    • キャッシュ管理ユーザーのUIDとパスワードは、アクティブ・ポッドとスタンバイ・ポッド(太字で表示)で設定されています。

    • アクティブ・ポッドとスタンバイ・ポッド(太字で表示)に2つのキャッシュ・グループが作成されています。

    • レプリケーション・エージェントは、アクティブ・ポッドとスタンバイ・ポッド(太字で表示)で実行されています。

    % kubectl describe ttc cachetest
    Name:         cachetest
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    API Version:  timesten.oracle.com/v1
    Kind:         TimesTenClassic
    Metadata:
      Creation Timestamp:  2020-10-24T03:29:48Z
      Generation:          1
      Resource Version:    78390500
      Self Link:           /apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/cachetest
      UID:                 2b18d81d-15a9-11eb-b999-be712d29a81e
    Spec:
      Ttspec:
        Db Config Map:
          cachetest
        Image:               phx.ocir.io/youraccount/tt1814110:3
        Image Pull Policy:   Always
        Image Pull Secret:   sekret
        Storage Class Name:  oci
        Storage Size:        250G
    Status:
      Active Pods:       cachetest-0
      High Level State:  Normal
      Last Event:        28
      Pod Status:
        Cache Status:
          Cache Agent:        Running
          Cache UID Pwd Set:  true
          N Cache Groups:     2
        Db Status:
          Db:            Loaded
          Db Id:         30
          Db Updatable:  Yes
        Initialized:     true
        Pod Status:
          Agent:                Up
          Last Time Reachable:  1603510527
          Pod IP:               10.244.7.92
          Pod Phase:            Running
        Replication Status:
          Last Time Rep State Changed:  0
          Rep Agent:                    Running
          Rep Peer P State:             start
          Rep Scheme:                   Exists
          Rep State:                    ACTIVE
        Times Ten Status:
          Daemon:          Up
          Instance:        Exists
          Release:         18.1.4.11.0
        Admin User File:   true
        Cache User File:   true
        Cg File:           true
        High Level State:  Healthy
        Intended State:    Active
        Name:              cachetest-0
        Schema File:       true
        Cache Status:
          Cache Agent:        Running
          Cache UID Pwd Set:  true
          N Cache Groups:     2
        Db Status:
          Db:            Loaded
          Db Id:         30
          Db Updatable:  No
        Initialized:     true
        Pod Status:
          Agent:                Up
          Last Time Reachable:  1603510527
          Pod IP:               10.244.8.170
          Pod Phase:            Running
        Replication Status:
          Last Time Rep State Changed:  1603510411
          Rep Agent:                    Running
          Rep Peer P State:             start
          Rep Scheme:                   Exists
          Rep State:                    STANDBY
        Times Ten Status:
          Daemon:            Up
          Instance:          Exists
          Release:           18.1.4.11.0
        Admin User File:     true
        Cache User File:     true
        Cg File:             true
        High Level State:    Healthy
        Intended State:      Standby
        Name:                cachetest-1
        Schema File:         true
      Rep Create Statement:  create active standby pair "cachetest" on 
      "cachetest-0.cachetest.mynamespace.svc.cluster.local", "cachetest" on 
      "cachetest-1.cachetest.mynamespace.svc.cluster.local" NO RETURN store 
      "cachetest" on "cachetest-0.cachetest.mynamespace.svc.cluster.local" 
      PORT 4444 FAILTHRESHOLD 0 store "cachetest" on 
     "cachetest-1.cachetest.mynamespace.svc.cluster.local" PORT 4444 
     FAILTHRESHOLD 0
      Rep Port:              4444
      Status Version:        1.0
    Events:
      Type  Reason       Age    From       Message
      ----  ------       ----   ----       -------
      -     Create       5m40s  ttclassic  Secret 
    tt2b18d81d-15a9-11eb-b999-be712d29a81e created
      -     Create       5m40s  ttclassic  Service cachetest created
      -     Create       5m40s  ttclassic  StatefulSet cachetest created
      -     StateChange  4m28s  ttclassic  Pod cachetest-0 Agent Up
      -     StateChange  4m28s  ttclassic  Pod cachetest-0 Release 18.1.4.11.0
      -     StateChange  4m28s  ttclassic  Pod cachetest-0 Daemon Up
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 RepScheme None
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 RepAgent Not Running
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 RepState IDLE
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 Database Loaded
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 Database Updatable
      -     StateChange  3m18s  ttclassic  Pod cachetest-0 CacheAgent Not Running
      -     StateChange  2m57s  ttclassic  Pod cachetest-0 CacheAgent Running
      -     StateChange  2m47s  ttclassic  Pod cachetest-1 Agent Up
      -     StateChange  2m47s  ttclassic  Pod cachetest-1 Release 18.1.4.11.0
      -     StateChange  2m46s  ttclassic  Pod cachetest-0 RepAgent Running
      -     StateChange  2m46s  ttclassic  Pod cachetest-0 RepScheme Exists
      -     StateChange  2m46s  ttclassic  Pod cachetest-0 RepState ACTIVE
      -     StateChange  2m46s  ttclassic  Pod cachetest-1 Daemon Up
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 CacheAgent Running
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 Database Not Updatable
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 Database Loaded
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 RepAgent Not Running
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 RepScheme Exists
      -     StateChange  2m9s   ttclassic  Pod cachetest-1 RepState IDLE
      -     StateChange  2m3s   ttclassic  Pod cachetest-1 RepAgent Running
      -     StateChange  118s   ttclassic  Pod cachetest-1 RepState STANDBY
      -     StateChange  118s   ttclassic  TimesTenClassic was Initializing, now 
    Normal
    

TimesTenデータベースのアクティブ・スタンバイ・ペアが(Normalで示されているように)正常にデプロイされました。TimesTen Cacheが正しく構成されていて、適切に動作していることを確認する準備が整いました。

TimesTen Cacheの適切な構成の確認

TimesTen Cacheが正しく構成されていて、適切に機能していることを確認するには、次のステップを実行します。

  1. アクティブ・ポッド(この例ではcachetest-0)とスタンバイ・ポッド(この例ではcachetest-1)を確認します。

    % kubectl get pods
    NAME                                       READY   STATUS    RESTARTS   AGE
    cachetest-0                                2/2     Running   0          8m16s
    cachetest-1                                2/2     Running   0          8m15s
    timestenclassic-operator-f84766548-tch7s   1/1     Running   0          36d
    
  2. kubectl exec -itコマンドを使用して、アクティブ・ポッド(この例ではcachetest-0)のシェルを呼び出します。

    % kubectl exec -it cachetest-0 -c tt -- /usr/bin/su - oracle
    
  3. ttIsqlを使用して、cachetestデータベースに接続します。TimesTenの接続属性が正しいことを確認します。特に、OracleNetServiceName接続属性がOracache (太字で表示)に正しく設定されていることを確認してください。

    % ttIsql cachetest;
     
    Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
     
     
     
    connect "DSN=cachetest";
    Connection successful: DSN=cachetest;UID=oracle;DataStore=/tt/home/oracle/datastore/cachetest;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;AutoCreate=0;
    PermSize=200;OracleNetServiceName=Oracache;DDLReplicationLevel=3;
    ForceDisconnectEnabled=1;
    (Default setting AutoCommit=1)
    
  4. ttIsql cachegroupsを使用して、キャッシュ・グループcacheuser2.readcacheおよびcacheuser2.writecacheの定義を表示します。

    Command> cachegroups;
     
    Cache Group CACHEUSER2.READCACHE:
     
      Cache Group Type: Read Only
      Autorefresh: Yes
      Autorefresh Mode: Incremental
      Autorefresh State: On
      Autorefresh Interval: 5 Seconds
      Autorefresh Status: ok
      Aging: No aging defined
     
      Root Table: ORATT.READTAB
      Table Type: Read Only
     
    Cache Group CACHEUSER2.WRITECACHE:
     
      Cache Group Type: Asynchronous Writethrough (Dynamic)
      Autorefresh: No
      Aging: LRU on
     
      Root Table: ORATT.WRITETAB
      Table Type: Propagate
     
    2 cache groups found.
    
  5. ttIsqlを使用して、oratt.readtabキャッシュ表を問い合せます。Oracle Databaseにキャッシュされたoratt.readtab表のデータが、TimesTenデータベースのoratt.readcacheキャッシュ表に正しくロードされていることを確認します。cachegroups.sqlメタデータ・ファイルには、前述の手順でLOAD CACHE GROUP文を指定しました。このcachegroups.sqlメタデータ・ファイルの詳細は、「メタデータ・ファイルとKubernetes機能の作成」を参照してください。

    Command> SELECT * FROM oratt.readtab;
    < 1, Hello >
    < 2, World >
    2 rows found.
    

キャッシュ・グループが作成されたことと、データが正しくoratt.readtab表にロードされたことを確認しました。

キャッシュ・グループ表に対する操作の実行

この項の例では、oratt.readtab表とoratt.writetab表に対する操作を実行して、TimesTen Cacheが正しく機能していることを確認します。

oratt.readtab表に対する操作の実行

この項では、oratt.readtab表に対する操作を実行します。

  1. Oracle Databaseにアクセスできるシェルを作成し、SQL*Plusを使用して、スキーマ・ユーザー(この例ではoratt)としてOracle Databaseに接続します。その次に、Oracle Databaseのoratt.readtab表で、新しい行の挿入、既存の行の削除および既存の行の更新を実行して、その変更をコミットします。

    % sqlplus oratt/oraclepwd@oracache;
     
    SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 23 21:57:42 2020
     
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing 
    options
    
    SQL> INSERT INTO oratt.readtab VALUES (3,'Welcome');
     
    1 row created.
     
    SQL> DELETE FROM oratt.readtab WHERE keyval=2;
     
    1 row deleted.
     
    SQL> UPDATE oratt.readtab SET str='Hi' WHERE keyval=1;
     
    1 row updated.
     
    SQL> COMMIT;
     
    Commit complete.
    

    読取り専用キャッシュ・グループが5秒間隔の自動リフレッシュを指定して作成されていたため、readcacheキャッシュ・グループのTimesTen oratt.readtabキャッシュ表は、キャッシュされているOracle Databaseのoratt.readtab表のコミットされた更新内容で5秒後に自動的にリフレッシュされます。次のステップでは、データがOracle DatabaseからTimesTenデータベースに正しく伝播されたことをテストします。

  2. kubectl exec -itコマンドを使用して、TimesTenアクティブ・データベース(この例ではcachetest-0)を実行しているポッドのコンテナのシェルを起動します。

    % kubectl exec -it cachetest-0 -c tt -- /usr/bin/su - oracle
    
  3. TimesTenのttIsqlユーティリティを使用して、cachetestデータベースに接続します。TimesTen oratt.readtab表を問い合せて、Oracle Databaseのコミットされた更新内容で表が更新されたことを確認します。

    % ttIsql cachetest;
     
    Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
     
     
     
    connect "DSN=cachetest";
    Connection successful: DSN=cachetest;UID=oracle;DataStore=/tt/home/oracle/datastore/cachetest;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;AutoCreate=0;
    PermSize=200;OracleNetServiceName=Oracache;DDLReplicationLevel=3;
    ForceDisconnectEnabled=1;
    (Default setting AutoCommit=1)
    
    Command> SELECT * FROM oratt.readtab;
    < 1, Hi >
    < 3, Welcome >
    2 rows found.
    

TimesTen Cacheがoratt.readtab表とreadcacheキャッシュ・グループに対して正しく動作していることを確認しました。

oratt.writetab表に対する操作の実行

この例では、oratt.writetab表に対する操作を実行します。

  1. kubectl exec -itコマンドを使用して、TimesTenアクティブ・データベース(この例ではcachetest-0)を実行しているポッドのコンテナのシェルを起動します。

    % kubectl exec -it cachetest-0 -c tt -- /usr/bin/su - oracle
    
  2. TimesTenのttIsqlユーティリティを使用して、キャッシュ・マネージャ・ユーザー(この例ではcacheuser2)としてcachetestデータベースに接続します。TimesTenのoratt.writetab表に対してSELECT文を発行します。繰返しになりますが、writecacheキャッシュ・グループは動的キャッシュ・グループです。そのため、SELECT文を発行したときに、TimeTenキャッシュ表にデータが見つからない場合は、キャッシュされたOracle Database表から自動的にキャッシュ・インスタンスがロードされます。

    % ttIsql "DSN=cachetest;UID=cacheuser2;PWD=ttpwd;OraclePWD=oraclepwd";
     
    Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
     
     
     
    connect "DSN=cachetest;UID=cacheuser2;PWD=********;OraclePWD=********";
    Connection successful: DSN=cachetest;UID=cacheuser2;DataStore=/tt/home/oracle/datastore/cachetest;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;AutoCreate=0;
    PermSize=200;OracleNetServiceName=Oracache;DDLReplicationLevel=3;
    ForceDisconnectEnabled=1;
    (Default setting AutoCommit=1)
    
    Command> SELECT * FROM oratt.writetab WHERE pk=100;
    < 100, TimesTen >
    1 row found.
    
  3. ttIsqlを使用して、TimesTenのoratt.writetabキャッシュ表で、新しい行の挿入、既存の行の削除および既存の行の更新を実行して、その変更をコミットします。

    Command> INSERT INTO oratt.writetab VALUES (102,'Cache');
    1 row inserted.
    Command> DELETE FROM oratt.writetab WHERE pk=101;
    1 row deleted.
    Command> UPDATE oratt.writetab SET attr='Oracle' WHERE pk=100;
    1 row updated.
    Command> COMMIT;
    

    writecacheキャッシュ・グループ内のTimesTenのoratt.writetabキャッシュ表でコミットされた更新内容は、Oracle Databaseのoratt.writetab表に自動的に伝播されます。

  4. Oracle Databaseにアクセスできるシェルを作成し、SQL*Plusを使用して、スキーマ・ユーザー(この例ではoratt)としてOracleデータベースに接続します。その次に、Oracle Databaseのoratt.writetab表の内容を問い合せて、TimesTenデータベースからコミットされた更新がOracle Databaseのoratt.writetab表に伝播されたことを確認します。

    % sqlplus oratt/oraclepwd@orapcache;
     
    SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 23 21:57:42 2020
     
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing 
    options
    
    SQL> SELECT * FROM oratt.writetab ORDER BY pk;
     
            PK ATTR
    ---------- ----------------------------------------
           100 Oracle
           102 Cache
    

TimesTen Cacheがoratt.writetab表とwritecacheキャッシュ・グループに対して正しく動作していることを確認しました。

Oracle Databaseのキャッシュ・メタデータのクリーン・アップ

TimesTenデータベースに特定のタイプのキャッシュ・グループを作成したときに、TimesTenは、そのキャッシュ・グループに関するメタデータをOracle Databaseに格納します。その後、そのTimesTenデータベースを削除しても、TimesTenはOracle Database内のメタデータを自動的に削除することはありません。その結果、Oracle Databaseにメタデータが蓄積される可能性があります。詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』の自動リフレッシュ・キャッシュ・グループで使用されているOracle Databaseオブジェクトの削除に関する項を参照してください。

ただし、Kubernetes環境では、TimesTenClassicオブジェクトを最初に作成するときにcacheUserメタデータ・ファイルとcachegroups.sqlメタデータ・ファイルを指定すると、そのTimesTenClassicオブジェクトを削除した場合にOracle Databaseメタデータがオペレータによって自動的にクリーン・アップされます。

オペレータがOracle Databaseを自動的にクリーン・アップしないようにするには、TimesTenClassicオブジェクト定義のcacheCleanupフィールドをfalseに設定します。詳細は、表11-3「TimesTenClassicSpecSpec」cacheCleanupエントリを参照してください。また、cacheUserファイルとcachegroups.sqlファイルの詳細は、「サポートされているメタデータ・ファイル」を参照してください。