レプリケーション環境でのログ・ファイルのサイズ増加の管理
概要:この文書では、トランザクション・ログのサイズを制御するためのオプションについて説明します。
レプリケート環境での現在のトランザクション・ログのサイズ増加を制御する方法は、多数あります。特に記述がないかぎり、ここで説明する方法は SQL Anywhere 5.5.0x、Adaptive Server Anywhere (SQL Anywhere) 6.0.x、7.0.x、8.0.x で使用できます。この制御によりログのサイズが小さくなるため、パフォーマンスも向上できます。バージョン 5.5.0x では、SQL Remote の実行ごとにトランザクション・ログ全体がスキャンされます。このため、特にバージョン 5.5.0x ではパフォーマンスが向上します。Adaptive Server Anywhere (SQL Anywhere) 6.0.2 以降では、SQL Remote を継続モードで実行すると、メッセージ・エージェントがログの最後で停止して、トランザクション・ログの不要なスキャンを回避します。ただし、バッチ・モードでは、必要であればすべてのログ (前および現在のトランザクション・ログの両方) がスキャンされます。以下では、トランザクション・ログのサイズを制御するためのオプションについて説明します。
オプション 1:-x スイッチを指定して dbremote を使用する
このスイッチを指定して dbremote を実行すると、送信メッセージのスキャン後に、現在のトランザクション・ログの名前変更と再開が実行されます。Adaptive Server Anywhere (SQL Anywhere) 7.0.x 以降では、トランザクション・ログのサイズを指定できます。トランザクション・ログのサイズは、名前変更や再開の前と同じまたはそれ以上にします。これよりも前のバージョンでは、dbremote を実行するごとにトランザクション・ログの名前変更と再開が実行されます。
次に例を示します。
dbremote -x 10m -c “uid=dba;pwd=sql;dbn=asademo;eng=test” c:\old_log_directory
このコマンドは、ログのサイズが 10M になると名前を変更します。古いログのあるディレクトリを必ず指定してください。
オプション 2:-r スイッチを指定して dbbackup を使用する
ログ・ファイルのサイズ増加を制御する別の方法として、-r スイッチを指定して dbbackup を実行するというものがあります。このスイッチは、チェックポイントを指定するもので、次の一連のイベントが発生します。
・現在使用中のトランザクション・ログ・ファイルが、コマンド・ラインで指定したディレクトリにコピー、保存されます。
・現在のトランザクション・ログは現在のディレクトリに残りますが、yymmddxx.log というフォーマットを使用して名前が変更されます。ここで、xx は 00 ~ 99 の数値、yymmdd は現在の年月日を示します。名前の変更後は、現在のトランザクション・ログではなくなります。
・トランザクションが含まれていない新しいトランザクション・ログ・ファイルが生成されます。このファイルは、名前が前のトランザクション・ログ・ファイルの名前になり、データベース・サーバで現在のトランザクション・ログとして使用されます。
Delete_old_logs オプションとオプション 1 または 2 を併用する
メッセージ・エージェントでは、その性質上、レプリケーション・システムで不要になるまで、すべてのトランザクション・ログが使用可能であることを保証する必要があります。不要になった時点で、トランザクション・ログを廃棄することができます。
すべてのリモート・データベースが、ログ・ファイルに含まれるメッセージを受信して適用した時点で、レプリケーション・システムではログが不要になります。リモート・データベースがメッセージ受信を確認すると、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;