TimesTenデータベースでの自動リフレッシュ処理の失敗による影響

キャッシュ・エージェントがTimesTenデータベースで実行されていない場合、TimesTenは変更ログ表の行を削除しません。この場合、キャッシュ・エージェントのタイムアウトを設定して、行が変更ログ表に蓄積されないようにできます。

変更ログ表は、自動リフレッシュを使用したキャッシュ・グループにキャッシュされるOracle Database表ごとに、Oracleキャッシュ管理ユーザーの表領域に作成されます。これらのキャッシュされたOracle Database表に対して更新処理が発行されるたびに、対応する変更ログ表に行が1つ挿入され、これにより、次回の増分自動リフレッシュ・サイクルにおいて、TimesTenキャッシュ表に適用する必要がある更新を常時監視できるようになります。TimesTenは、キャッシュ表に適用された変更ログ表の行を定期的に削除します。

1つのOracle Database表をTimesTenデータベース内の複数のキャッシュ・グループに、キャッシュすることはできません。ただし、1つのOracle Database表を複数のTimesTenデータベースにキャッシュすることはできます。これによって、1つのOracle Database表が複数のTimesTenキャッシュ表に対応することになります。Oracle Database表がキャッシュされる1つ以上のTimesTenデータベースでキャッシュ・エージェントが実行されていないために、キャッシュされたOracle Database表に対する更新が対応するすべてのキャッシュ表に自動的にリフレッシュされない場合、それぞれの変更ログ表の行はデフォルトでは削除されません。キャッシュ・エージェントが停止されたか、または起動されていなかったため、あるいはデータベースが破棄されたか、TimesTenインスタンスが停止しているために、キャッシュ・エージェントが特定のTimesTenデータベースで実行されない場合があります。この結果、変更ログ表に行が蓄積し、キャッシュ・エージェントが実行されているTimesTenデータベースのキャッシュ表に対する自動リフレッシュ処理のパフォーマンスが低下します。また、Oracleキャッシュ管理ユーザーの表領域が一杯になる場合もあります。

たとえば、単一のOracle Database表が複数のTimesTenデータベースによってキャッシュされ、そのTimesTenデータベースのいずれかがOracle Databaseに接続できない場合、切断されたTimesTen データベースの自動リフレッシュは実行されません。かわりに、(Oracle Databaseへの接続が確立されたら、切断されたTimesTenデータベースが追いつけるように)変更ログ表のレコードが蓄積されます。AgentTimeoutパラメータが0 (デフォルト)に設定されている場合、すべての変更ログ・レコードは、すべてのキャッシュ表に適用されるまで無期限に保持されます。他のTimesTenデータベースの変更ログ・レコードは、トランザクション・ログがローカルTimesTenデータベースにすでに適用されていても、パージされません。別の方法として、AgentTimeoutパラメータを設定し、保存された変更ログ・レコードをパージしてこのような変更ログ・レコードの蓄積を停止するまで待機する特定のタイムアウトを定義できます。

TimesTenデータベースでキャッシュ・エージェントが実行されておらず、キャッシュ・エージェント・タイムアウトを設定している場合、変更ログ表の行を削除するには、次の基準が満たされている必要があります。

  • Oracle Database表は、複数のTimesTenデータベース内の自動リフレッシュが有効になったキャッシュ・グループにキャッシュされています。

  • キャッシュ・エージェントは、TimesTenデータベースの少なくとも1つで実行されていますが、別のデータベースでは実行されていません。

  • 変更ログ表の行が、キャッシュ・エージェントが実行されているすべてのTimesTenデータベースのキャッシュ表に適用されています。

  • キャッシュ・エージェントが実行されていないデータベースで、エージェント・プロセスが停止したままとなり、その期間がキャッシュ・エージェント・タイムアウトを超えています。

キャッシュ・エージェントのタイムアウトを設定して行が変更ログ表に蓄積されないようにするには、Oracleデータベースのデータをキャッシュする任意のTimesTenデータベースから、TimesTenキャッシュ管理ユーザーとして、ttCacheConfig組込みプロシージャを使用してAgentTimeoutパラメータを設定します。AgentTimeout文字列をParamラメータに渡し、タイムアウト設定を数値文字列としてValueパラメータに渡します。キャッシュ・エージェント・タイムアウトの設定にはtblOwnerパラメータおよびtblNameパラメータを適用できないため、これらのパラメータには値を渡さないでください。

次の例では、キャッシュ・エージェント・タイムアウトを900秒(15分)に設定しています。

% ttIsql "DSN=cache1;UID=cacheadmin;PwdWallet=/wallets/cacheadminwallet"
Command> CALL ttCacheConfig('AgentTimeout',,,'900');

現在のキャッシュ・エージェント・タイムアウト設定を確認するには、AgentTimeout文字列のみをParamパラメータに渡してttCacheConfigをコールします。

Command> CALL ttCacheConfig('AgentTimeout');
< AgentTimeout, <NULL>, <NULL>, 900 >

デフォルトのキャッシュ・エージェント・タイムアウト設定は0であり、すべての変更ログ・レコードは、すべてのキャッシュ表に適用されるまで無期限に保持されます。キャッシュ・エージェント・タイムアウトを1から600秒のいずれかの値に設定すると、タイムアウトは600秒に設定されます。キャッシュ・エージェント・タイムアウトは、同じOracleデータベースからデータをキャッシュし、かつ同じOracleキャッシュ管理ユーザー名が設定されているすべてのTimesTenデータベースに適用されます。

適切なキャッシュ・エージェント・タイムアウト設定を決定するときは、TimesTenデータベースをメモリーにロードするために要する時間、キャッシュ・エージェント・プロセスを開始するための時間、ネットワーク停止の可能性がある期間および計画メンテナンス作業の所要見積時間を考慮してください。

各TimesTenデータベースおよびそのすべてのキャッシュ・グループには自動リフレッシュ・ステータスがあり、変更ログ表から削除された行がキャッシュ・グループのキャッシュ表に適用されたかどうかを判別できるようになっています。変更ログ表から行が削除されたものの、データベース上のキャッシュ・エージェントがキャッシュ・エージェント・タイムアウトを超える期間停止していたために、それがキャッシュ表に適用されなかった場合、そのキャッシュ表はキャッシュされたOracle Database表と同期化されなくなります。キャッシュされたOracle Database表に対する以後の更新は、付随するキャッシュ・グループがリカバリされるまで、キャッシュ表に自動的にはリフレッシュされません。

自動リフレッシュを使用したキャッシュ・グループの有効なステータスは、次のとおりです。

  • ok: 変更ログ表から削除されたすべての行がキャッシュ表に適用されました。増分自動リフレッシュ処理が引き続きキャッシュ・グループに対して実行されます。

  • disabledまたはdead: 変更ログ表から削除された行の一部がキャッシュ表に適用されなかったため、キャッシュ表はキャッシュされたOracle Database表と同期化されません。キャッシュ・グループに対する自動リフレッシュ処理は停止し、キャッシュ・グループがリカバリするまで再開されません。

  • recovering: キャッシュ・グループはリカバリ中です。リカバリが完了すると、キャッシュ表がキャッシュされたOracle Database表と同期化され、キャッシュ・グループの自動リフレッシュ・ステータスがokに設定され、増分自動リフレッシュ処理がキャッシュ・グループで再開されます。

TimesTenデータベースの有効な自動リフレッシュ・ステータスは、次のとおりです。

  • alive: 自動リフレッシュを使用したすべてのキャッシュ・グループの自動リフレッシュ・ステータスがOKに設定されています。

  • dead: 自動リフレッシュを使用したすべてのキャッシュ・グループの自動リフレッシュ・ステータスがdeadに設定されています。

  • recovering: 自動リフレッシュを使用したキャッシュ・グループの少なくとも1つに自動リフレッシュ・ステータスがrecoveringに設定されています。

TimesTenデータベース上のキャッシュ・エージェントがキャッシュ・エージェント・タイムアウトを超える期間停止していると、そのTimesTenデータベースの自動リフレッシュ・ステータスはdeadに設定されます。また、そのデータベース内の自動リフレッシュを使用したすべてのキャッシュ・グループの自動リフレッシュ・ステータスがdeadに設定されます。

キャッシュ・グループおよび付随するTimesTenデータベースの自動リフレッシュ・ステータスを確認するには、TimesTenキャッシュ管理ユーザーとしてttCacheDbCgStatus組込みプロシージャをコールします。キャッシュ・グループの所有者をcgOwnerパラメータに、キャッシュ・グループの名前をcgNameパラメータにそれぞれ渡します。

次の例では、データベースの自動リフレッシュ・ステータスはaliveとなっており、cacheadmin.customer_orders読取り専用キャッシュ・グループの自動リフレッシュ・ステータスはokとなっています:

% ttIsql "DSN=cache1;UID=cacheadmin;PwdWallet=/wallets/cacheadminwallet"
Command> CALL ttCacheDbCgStatus('cacheadmin','customer_orders');
< alive, ok >

データベースの自動リフレッシュ・ステータスのみを表示し、特定のキャッシュ・グループの自動リフレッシュ・ステータスは表示しないようにするには、パラメータを指定せずにttCacheDbCgStatusをコールします。

Command> CALL ttCacheDbCgStatus;
< dead, <NULL> >

キャッシュ・グループの自動リフレッシュ・ステータスがokである場合、そのキャッシュ表は自動リフレッシュ間隔に基づいて自動的にリフレッシュされます。データベースの自動リフレッシュ・ステータスがaliveである場合、そのデータベースの自動リフレッシュを使用したすべてのキャッシュ・グループの自動リフレッシュ・ステータスがokとなります。

キャッシュ・グループの自動リフレッシュ・ステータスがdisabledまたはdeadである場合、そのキャッシュ表はキャッシュされたOracle Database表に対する更新がコミットされても、自動的にリフレッシュされません。キャッシュ表をキャッシュされたOracle Database表と再同期化するには、キャッシュ・グループをリカバリする必要があります。「キャッシュ・グループの完全自動リフレッシュの無効化」を参照してください。

自動リフレッシュ・ステータスがdeadになっているキャッシュ・グループ用にリカバリ方法を構成できます。

Oracleデータベースのデータをキャッシュする任意のTimesTenデータベースから、TimesTenキャッシュ管理ユーザーとしてttCacheConfig組込みプロシージャをコールします。DeadDbRecovery文字列をParamパラメータに渡し、リカバリ方法を文字列としてValueパラメータに渡します。deadとなっているキャッシュ・グループのリカバリ方法の設定にはtblOwnerパラメータおよびtblNameパラメータを適用できないため、これらのパラメータには値を渡さないでください。

有効なリカバリ方法は次のとおりです。

  • Normal: キャッシュ・エージェントを起動すると、自動リフレッシュ・ステータスがdeadであるキャッシュ・グループに対して完全自動リフレッシュ処理が実行され、キャッシュ・グループがリカバリされます。これがデフォルトのリカバリ方法です。ただし、DisableFullAutorefreshキャッシュ構成パラメータを1に設定すると、DeadDbRecoveryキャッシュ構成パラメータが自動的にManualに変更されます。

  • Manual: 自動リフレッシュ・ステータスがdeadとなっている静的な各ャッシュ・グループをリカバリするには、キャッシュ・エージェントの起動後に、REFRESH CACHE GROUP文を発行する必要があります。

    自動リフレッシュ・ステータスがdeadとなっている各動的キャッシュ・グループをリカバリするには、キャッシュ・エージェントの起動後、REFRESH CACHE GROUP文またはUNLOAD CACHE GROUP文を発行する必要があります。

  • None: 自動リフレッシュ・ステータスがdeadとなっているキャッシュ・グループをリカバリするには、キャッシュ・エージェントの起動後、そのグループを削除してから再作成する必要があります。

次の例では、自動リフレッシュ・ステータスがdeadとなっているキャッシュ・グループのリカバリ方法をManualに設定しています。

% ttIsql "DSN=cache1;UID=cacheadmin;PwdWallet=/wallets/cacheadminwallet"
Command> CALL ttCacheConfig('DeadDbRecovery',,,'Manual');

deadとなっているキャッシュ・グループの現在のリカバリ方法を確認するには、DeadDbRecovery文字列のみParamパラメータに渡してttCacheConfigをコールします。

Command> CALL ttCacheConfig('DeadDbRecovery');
< DeadDbRecovery, <NULL>, <NULL>, manual >

このリカバリ方法は、同じOracleデータベースからデータをキャッシュし、かつ同じOracleキャッシュ管理ユーザー名が設定されているすべてのTimesTenデータベースで自動リフレッシュを使用したすべてのキャッシュ・グループに適用されます。

キャッシュ・グループがリカバリ・プロセスを開始すると、その自動リフレッシュ・ステータスがdeadからrecoveringに変更され、付随するTimesTenデータベースのステータスが現在deadである場合にはrecoveringに変更されます。

キャッシュ・グループのリカバリが完了すると、その自動リフレッシュ・ステータスがrecoveringからokに変更されます。すべてのキャッシュ・グループがリカバリされ、それらの自動リフレッシュ・ステータスがokであると、付随するTimesTenデータベースのステータスがrecoveringからaliveに変更されます。

リフレッシュする更新が少量で、かつキャッシュ表に多数の行が存在する場合、完全自動リフレッシュ処理には増分自動リフレッシュ処理よりも多くのシステム・リソースが必要となります。メンテナンス作業のためにTimesTenデータベースを停止する必要があり、その停止中、自動リフレッシュを使用したキャッシュ・グループにキャッシュされるOracle Database表に対して実行される更新の量が少ないと予測される場合は、一時的にキャッシュ・エージェント・タイムアウトを0に設定してみることをお薦めします。データベースが稼働状態に戻り、キャッシュ・エージェントが再起動すると、増分自動リフレッシュ処理が自動リフレッシュを使用したキャッシュ・グループのキャッシュ表で再開されます。付随するキャッシュ・グループの自動リフレッシュ・ステータスがokからdeadに変更されなかったため、完全自動リフレッシュ処理が回避されますので、付随するキャッシュ・グループのリカバリ・プロセスは必要ありません。データベースが稼働状態に戻り、キャッシュ・エージェントが起動された後、キャッシュ・エージェント・タイムアウトを元の値に戻します。

『Oracle TimesTen In-Memory Databaseリファレンス』「ttCacheConfig」を参照してください。