DBREMOTEエラー:トランザクション・ログがありません
本書では、エラー”トランザクション・ログがありません”の解決方法について説明します。
エラー:“トランザクション・ログがありません”
原因:ログファイルが存在しない、またはログ・ディレクトリが指定されていない
状況:SQL Remote はメッセージの受信だけを実行し、メッセージの送信を実行しません。
解決策:最初に、メッセージが生成された理由を特定します。以下の診断手順を参照してください。
手順1
まず、名前が変更されたログ・ファイルがあるかどうかを確認します。ログ・ファイル名を変更できる方法はいくつかあります。名前変更が起こりうる方法の1 つは、-rスイッチを付けたdbbackupの使用によるものです。
また、ログ・ファイルは、-x スイッチを付けたdbremote の使用によって名前変更および再起動することもできます。ログファイルの名前が変更されている場合は、名前変更されたログ・ディレクトリがdbremote コマンド・ラインで指定されたかどうか(つまり、dbremote -c “uid=dba;pwd=sql” c:\old\logs になっているかどうか)を確認してください。
dbremoteコマンドとスイッチの正しい使い方については、Adaptive Server Anywhere (SQL Anywhere) ヘルプ・ファイルを参照してください。
手順2
手順1 の説明のようにユーザがログの名前を変更した場合は、失われたログ・ファイルを調べる必要があります。
まず、SQL Remote トランケーション・オフセットの値を確認します。これは、Dbremote がトランケーションの送信を開始する基準となるオフセットです。トランケーション・オフセットの値は、共に有効な2 つの方法で確認することができます。
1. データベースが動作していない場合は、DBLOG を実行します。
例:
C:\Files\SQLAny\REPSS>dblog sales.db
“sales.db” はログ・ファイル “sales.log”を使用しています。
“sales.db” はログ・ミラー・ファイルを使用していません。
トランザクション・ログの開始オフセットは 0000116339 です。
SQL Remote トランケーション・オフセットは0000127086 です。≪ この値を確認する2. データベースが動作している場合は、DBISQL を使用してデータベースに接続し、システム・テーブル
SYS.sysremoteusers 内のLOG_SENTの最小値を調べます。この操作は、次のクエリを使用して実行できます。
Select min(log_sent) from SYS.sysremoteusers
返される結果は、SQL Remote のトランケーション・オフセットを表します。
3. 次に、利用可能な各ログ・ファイルの開始オフセットと終了オフセットを調べる必要があります。
名前変更されたトランザクション・ログをDBTRAN ユーティリティで翻訳すると、各トランザクション・ログの開始オフセットと終了オフセットを確認できます。
例:
C:\Files\SQLAny\REPSS>dbtran sales.log nul -y
トランザクション・ログ “sales.log” はオフセット0000116339 で開始します。
トランザクション・ログはオフセット0000128158 で停止します。名前変更されたログ・ディレクトリ(つまり、c:\old\logs)内にある各ログの開始オフセットと終了オフセットを確認してください。
上記例で、別のログ・ファイルを翻訳した場合は、次のようになります。
C:\Files\SQLAny\REPSS>dbtran 01010100.log nul -y
トランザクション・ログ “sales.log” はオフセット0000101234 で開始します。
トランザクション・ログはオフセット 0000116339 で停止します。ヒント: Windows NT/2000 では、”for %i in (*.log) do dbtran -y %i NUL >> offsets.txt”というコマンドを使用して、特定のディレクトリ内にある各ログ・ファイルのオフセットをすべて確認することができます。このコマンドを実行すると、特定のディレクトリ内にある各ログ・ファイルの開始オフセットと終了オフセットがoffsets.txt ファイルに含められます。
この例では、ログの連続性が確認できます。上記レプリケーション・シナリオの場合は、ログが連続的であり、トランケーション・オフセットもこれらのログの開始値と終了値の範囲内にあるため、エラーは表示されません。
01010100.log は、オフセット0000101234 で始まり、0000116339 で終了します。Sales.log(現在のログ)は、オフセット0000116339 で始まり、0000128158 で終了します。このログは98010100.log がちょうど終了したところから始まることに注意してください。
ログ・ファイル間のギャップをチェックしてください。
ログとログの間には、ギャップや部分的な重複があってはなりません。
ギャップが存在し、SQL Remote のトランケーション・オフセットがこのギャップのオフセット値以下である場合や、トランケーション・オフセットがいずれかのログの最小開始オフセットよりも小さい場合は、Dbremote がエラー”トランザクション・ログがありません”をレポートします。
手順3: 可能な解決策
1. できるかぎり迅速にDbremote にメッセージを送信させることが重要である場合は、どのユーザがDbremoteに失われたメッセージをレポートさせているのかを確認することができます。
この操作は、次のクエリを使用して実行できます。
Select user_name, log_sent from SYS.sysremoteusers order by log_sent
DBTRANを使用して利用可能な最小ログ・オフセットを確認した後には、Dbremote によるメッセージ送信を妨げているユーザを確認することができます。log_sent がSQL Remote のトランケーション・ポイントより小さい全ユーザからremote を取り消すか、またはそれらのユーザを再抽出すると、Dbremote は他のすべてのユーザにメッセージを送信できるようになります。
統合データベースに対してDbremote を実行しているときにエラーが発生し、失ったトランザクション・ログが現在のログであった場合は、リモート・ユーザ宛の全メッセージをすぐに削除する必要があります。失われたログからトランザクションを含んだメッセージをリモート・ノードが受信する場合に、失われたログが見つからないときは、それらのサイトを再抽出しなければなりません。そのため、この削除を実行する必要があります。どのリモートも現在のログからメッセージを受信していない場合は、統合データベースのバックアップを使用して、現在のログ(欠落しているログ)までの全ログを適用してください。どのリモートもそのログからのメッセージを適用していないので、再抽出を行う必要はありません。統合データベースではデータの消失が生じますが、リモート・ノードではデータの消失は生じません。
2. もう1 つの可能な対処法は、REMOTE RESETコマンドによる方法です。この方法は、データの同期がとれているかどうかは気にせずに(または、同期がとれていることを認識した上で)、今すぐデータベースに複写を開始させたい場合にのみ使用してください。REMOTE RESETの使い方の詳細については、ヘルプ・ファイルを参照してください。
3. 見つかる見込みはほとんどありませんが、Windows 環境で実行している場合は、失われたトランザクション・ログがゴミ箱に入っていないかどうかを確認してください。場合によっては、失われたログをこの場所からリカバリすることができます。また、これらのファイルをきちんとテープにバックアップしてある場合は、失われたログをテープからリストアすることもできます。
上記の対処法に加えて、複写環境では、-x スイッチを付けたdbbackup を絶対に使用すべきでないことも重要な留意点になります。dbbackup には、-x スイッチではなく-r スイッチを使用してください。また、不要と思われる古いログ・ファイルを手動で削除している場合は、その習慣をやめて、代わりに”DELETE_OLD_LOGS”というデータベース・オプションをオンにしてください。このオプションをオンにすると、古いログは不要になったときに自動的に削除されます。