状況によっては、マスター・レプリケーション・エージェントのTRANSMITTERスレッドやXLAアプリケーションのttXlaNextUpdate()コールなどのログ・リーダーが、アプリケーションによるデータ・ストアへの書込みの更新を処理しきれない場合があります。通常、レプリケーションおよびXLAリーダーは、メモリー内のログ・バッファから更新レコードを取得します。リーダーがアプリケーションの更新を処理しきれない場合、バックログがクリアできるようになるまで、ログ・ファイルがディスクに蓄積されることがあります。この場合、リーダーは、非常に遅いディスク上のログ・ファイルからトランザクションを読む必要があります。ログ・ファイルからの読取りを検出したら、ログ・リーダーが処理できる速度までアプリケーションの更新速度を下げてください。
アプリケーションでは、SYS.MONITOR表のエントリLOG_FS_READSを追跡することで、ログ・リーダーがメモリー内のログ・バッファではなく、ディスク上のログ・ファイルから更新レコードを取得しているかどうかを監視できます。たとえば、データ・ストアMASTERDSNのLOG_FS_READS値は、次のttIsqlコマンドで確認できます。
% 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
[Control]キーを押しながら[C]キーを押して終了するまで、スクリプトによって、更新されたステータスが15秒毎に表示されます。
例4.14の出力では、日付の後にサブスクライバ名、ホスト名などが表示されます。その後には、待機時間、速度に関する情報、およびこのサブスクライバに代わって保持されているログ・ファイルの数が表示されます。各値の具体的な意味は、『Oracle TimesTen Replication - TimesTen to TimesTen開発者および管理者ガイド』のコマンドラインからのttRepAdmin -receiver -listの説明を参照してください。ここでは、Last Msg SentとLogsの値です。Last Msg Sentの値は、最終メッセージがマスターによってサブスクライバに送信されてからの経過時間を示します。Logsの値は、ライターが使用する現在のログ挿入ポイント(Last written LSN)以降で、レプリケーション・ログ・リーダーより遅れているログ・ファイル数を示します。
例4.14で示すように、通常、Logsの値は1です。Logsの値が一定間隔で増えることは、待機時間が増え、ディスクからログが読み取れることを示します。
注意: | LogBuffSizeがLogFileSizeよりも大きい場合、Logsの値が増加しても、ログ・リーダーがログ・ファイルから読取りを行っているとはかぎりません。これは、データをファイル・システムに書き込む前に、未処理のデータが1ログ・ファイル分を超えることをログ・マネージャが許可しないためです。ログ・マネージャがデータを書き込んだ後は、ログ・リーダーから直接読み取れるように、データはログ・バッファ内に残ります。したがって、LogBuffSizeがLogFileSizeよりも大きい場合、Logsの値のみでは、ログ・リーダーがメモリーとディスクのどちらから読取りを行っているかを判断できない場合があります。 |
次のコマンドの出力について考えます。
ttRepAdmin -bookmark -connStr dsn=$DSN
『Oracle TimesTen Replication - TimesTen to TimesTen開発者および管理者ガイド』のコマンドラインからのttRepAdmin -bookmarkの説明で示すとおり、ログ・ファイル数とログ・マネージャによって設定されるブックマークの位置が表示されます。Replication hold LSNとlast written LSNとの差異は、サブスクライバに送信されていないトランザクション・ログのレコード数を示します。これらの値の差異が一定間隔で増加する場合は、レプリケーションの待機時間が増え、ログ・ファイルの読取りが発生する可能性があることを示します。
この例では、LogBuffSizeは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