トランザクション・ログ・ファイルからの読取りの有無を確認する

状況によっては、マスター・レプリケーション・エージェントのTRANSMITTERスレッドやXLAアプリケーションのttXlaNextUpdateコールなどのログ・リーダーが、アプリケーションによるデータベースへの書込みの更新を処理しきれない場合があります。通常、レプリケーションおよびXLAリーダーは、メモリー内のログ・バッファから更新レコードを取得します。リーダーがアプリケーションの更新を処理しきれない場合、バックログがクリアできるようになるまで、トランザクション・ログ・ファイルがファイル・システムに蓄積されることがあります。この場合、リーダーは、非常に遅いファイル・システム上のトランザクション・ログ・ファイルからトランザクションを読む必要があります。トランザクション・ログ・ファイルからの読取りを検出したら、ログ・リーダーが処理できる速度までアプリケーションの更新速度を下げてください。

アプリケーションでは、SYS.MONITOR表のエントリLOG_FS_READSを追跡することで、ログ・リーダーがメモリー内のログ・バッファではなく、ファイル・システム上のトランザクション・ログ・ファイルから更新レコードを取得していることを監視できます。たとえば、次のttIsqlコマンドを使用すると、データベースMASTERDSNLOG_FS_READSの値を確認することができます。

% ttIsql -v1 -e "select log_fs_reads from monitor; quit;" -connStr dsn=MASTERDSN

LOG_FS_READSカウンタが増加している場合、ログ・リーダーはトランザクション・ログ・ファイル内のバックログより遅れているか、バックログをクリアしています。

より完全にレプリケーション・プロセスを監視するには、次のような簡単なシェル・スクリプトを作成します。

!/bin/sh
trap exit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DSN=$1

while [ 1 ] ; do
   date
   ttRepAdmin -receiver -list -connStr dsn=$DSN
   echo -n "Log reads from disk: "
   ttIsql -v1 -e "select log_fs_reads from monitor; quit;" -connStr dsn=$DSN
   echo
   ttRepAdmin -bookmark -connStr dsn=$DSN
sleep 15
done

たとえば、上記スクリプトにmonitorLogという名前を付け、レプリケーション・スキームでMASTERDSNデータベースからSUBSCRIBER1DSNデータベースにレプリケートします。この場合は、次のように入力して、トランザクションのステータスを確認できます。

% monitorLog masterdsn

次のような出力が表示されます。

Mon Aug  2 10:44:40  2004
Peer name         Host name                 Port    State  Proto
----------------  ------------------------ ------  ------- -----
SUBSCRIBER1DSN    MYHOST                    Auto    Start   12

Last Msg Sent Last Msg Recv Latency TPS     RecordsPS Logs
------------- ------------- ------- ------- --------- ----
00:00:05      -               -1.00      -1        -1    1

Log reads from disk: < 0 >

Replication hold LSN ...... 10/2656136
Last written LSN .......... 10/4015824
Last LSN forced to disk ... 10/3970152

[Ctrl]キーを押しながら[C]キーを押して終了するまで、スクリプトによって、更新されたステータスが15秒毎に表示されます。

各値の具体的な意味は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』「ttRepAdminユーティリティによるサブスクライバ・ステータスの表示」に説明されています。ここで特に注目するのは、'Last Msg Sent'および'Logs'値です。Last Msg Sentの値は、最終メッセージがマスターによってサブスクライバに送信されてからの経過時間を示し、Logsの値は、ライターが使用する現在のログ挿入ポイント(Last written LSN)以降で、レプリケーション・ログ・リーダーより遅れているログ・ファイル数を示します。

通常、Logs値は1である必要があります。Logsの値が一定間隔で増えることは、待機時間が増え、ファイル・システムからログが読み取れることを示します。

ノート:

LogBufMBLogFileSizeよりも大きい場合、Logsの値が増加しても、ログ・リーダーがトランザクション・ログ・ファイルから読取りを行っているとはかぎりません。これは、データをファイル・システムに書き込む前に、未処理のデータが1ログ・ファイル分を超えることをログ・マネージャが許可しないためです。ログ・マネージャがデータを書き込んだ後は、ログ・リーダーから直接読み取れるように、データはログ・バッファ内に残ります。したがって、LogBufMBLogFileSizeよりも大きい場合、'Logs'の値のみでは、ログ・リーダーがメモリーとファイル・システムのどちらから読取りを行っているかを判断できない場合があります。

次のコマンドの出力では、トランザクション・ログ・ファイルの数、およびログ・マネージャによって設定されるブックマークの場所を表示しています。

ttRepAdmin -bookmark -connStr dsn=$DSN

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』「ttRepAdminユーティリティによるレプリケーションの監視」を参照してください。Replication hold LSNとlast written LSNとの差異は、サブスクライバに送信されていないトランザクション・ログのレコード数を示します。これらの値の差異が一定間隔で増加する場合は、レプリケーションの待機時間が増え、ログ・ファイルの読取りが発生する可能性があることを示します。

この例では、LogBufMBは16MB、LogFileSizeは8MBと想定しています。次の出力は、ログ・リーダーがログ・バッファの容量よりも約1.8MB遅れており、トランザクション・ログ・ファイル14および15からの読取りが必要なことを示しています。

Peer name         Host name                Port    State   Proto
----------------  ------------------------ ------  ------- -----
SUBSCRIBER1DSN    MYHOST                   Auto    Start   12

Last Msg Sent Last Msg Recv Latency TPS     RecordsPS Logs
------------- ------------- ------- ------- --------- ----
00:00:03      -               -1.00      -1        -1    4

Log reads from disk: <20>

Replication hold LSN ...... 14/7007464
Last written LSN .......... 17/465336
Last LSN forced to disk ... 17/456152