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」を参照してください。