レプリケーション環境におけるログ・ファイル肥大化の管理

本書では、トランザクション・ログのサイズを制御する場合に使用できるいくつかのオプションについて説明します。

レプリケーション環境で現在のトランザクション・ログの肥大化を制御するために使用できる方法はいくつかあります。これらの各方法は、特に指示がないかぎり、SQL Anywhere 5.5.0x、Adaptive Server Anywhere (SQL Anywhere) 6.0.x、およびAdaptive Server Anywhere (SQL Anywhere) 7.0.x に適用されます。肥大化を制御してログ・サイズを小さくすれば、パフォーマンスの向上も実現できます。バージョン5.5.0x ではSQL Remote を実行するたびにトランザクション・ログ全体がスキャンされるため、これはバージョン5.5.0x を使用している場合に特に当てはまります。Adaptive Server Anywhere (SQL Anywhere) 6.0.2 以降では、継続モードでSQL Remote を実行すると、Message Agent はログの最後に移動して、トランザクション・ログの不要なスキャン処理を回避します。ただし、バッチ・モードで実行した場合は、すべてのログ(古いトランザクション・ログと現在のトランザクション・ログの両方)が必要に応じてスキャンされます。トランザクション・ログのサイズを制御する場合に使用できるオプションをいくつか次に示します。

オプション1:-x スイッチを付けたdbremote の使用

このスイッチをdbremote の実行時に使用することにより、現在のトランザクション・ログは、出力メッセージについてスキャンされた後に名前を変更されて再起動されます。Adaptive Server Anywhere (SQL Anywhere) 7.0.x 以降では、トランザクション・ログを名前変更して再起動する前に、そのトランザクション・ログが必ず特定のサイズ以上になるように指定できます。Adaptive Server Anywhere (SQL Anywhere) 7.0.x より古いバージョンでは、dbremote を実行するたびにトランザクション・ログが名前変更されて再起動されます。

たとえば、次のコマンドをAdaptive Server Anywhere (SQL Anywhere)7.0.2 以降で実行した場合は、サイズが10M に達するとログの名前が変更されます。古いログが存在するディレクトリを指定することを忘れないでください。

dbremote -x 10m -c “uid=dba;pwd=sql;dbn=asademo;eng=test” c:\old_log_directory

-x スイッチでサイズ指定ができるのはAdaptive Server Anywhere (SQL Anywhere)7.0.2 以降をご使用の場合です。Adaptive Server Anywhere (SQL Anywhere)7.0.1 もしくはそれ以前のバージョンをご使用の場合、サイズ指定はできません。

オプション2:-r スイッチを付けたdbbackup の使用

ログ・ファイルの肥大化を制御するもう1 つの方法は、-r スイッチを付けてdbbackup を使用する方法です。このスイッチを使用すると、チェックポイントが強制され、その後に次の一連のイベントが強制されます。

1) 現在機能しているトランザクション・ログ・ファイルがコピーされ、コマンド・ラインで指定したディレクトリに保存されます。

2) 現在のトランザクション・ログは現在のディレクトリに残りますが、yymmddxx.log という形式を使用して名前変更されます。xx は00~99 の数字、yymmdd は現在の年月日を表します。このファイルは、現在のトランザクション・ログではなくなります。

3) トランザクションを含んでいない新しいトランザクション・ログ・ファイルが生成されます。このファイルには、以前に現在のトランザクション・ログとみなされていたファイルの名前が付けられます。また、このファイルは、データベース・サーバによって現在のトランザクション・ログとして使用されます。

オプション1 または2 と共にDelete_old_logs オプションを使用

Message Agent の性質上、レプリケーション・システムが必要としなくなるまでは、すべてのトランザクション・ログが利用可能であることを保証する必要があります。これらのログは、レプリケーション・システムが必要としなくなった時点で廃棄できます。

ログ・ファイルに含まれているメッセージをすべてのリモート・データベースが受信して正常に適用すると、レプリケーション・システムはログを必要としなくなります。リモート・データベースは、メッセージを正常に受信したことを確認します。この確認によって、SYS.sysremoteuser テーブル内のリモート・ノードごとにconfirm_sent 値が設定されます。古いログそれぞれの開始オフセットおよび終了オフセットと共に次のクエリを使用すると、古いログを削除すべき時期を監視することができます。

select min(confirm_sent) from SYS.sysremoteuser

このクエリは、最小のconfirm_sent 値を返します。この値がいずれかの古いログの終了オフセットよりも大きい値の場合は、その古いログは自動的に削除されます(delete_old_logs オプションがON に設定されている場合)。最低/最小のconfirm_sent 値が古いトランザクション・ログの終了オフセットよりも大きくなると、各リモート・ノードはその古いトランザクション・ログでトランザクションの受信をすでに確認しているので、SQL Remote はそのログを必要としなくなります。delete_old_logs オプションがON に設定されている場合は、このログが削除されます。

前述のとおり、統合データベースとリモート・データベースでDELETE_OLD_LOGS データベース・オプションを使用すると、これらの不要なログをSQL Remote に自動的に削除させることができます。DELETE_OLD_LOGS データベース・オプションは、デフォルトでOFF に設定されています。このオプションをON に設定した場合は、不要になった古いトランザクション・ログをMessage Agent が自動的に削除します。ログは、すべてのサブスクライバがログ・ファイルに記録された変更内容を確認すると不要になります。

DELETE_OLD_LOGS オプションは、PUBLIC グループに対して、またはMessage Agent の接続文字列に含まれているユーザだけに対して設定できます。

次の文では、PUBLIC グループに対してDELETE_OLD_LOGS が設定されます。

SET OPTION PUBLIC.DELETE_OLD_LOGS = ‘ON';
SET PERMANENT;