無期限のWAITFORを起動すると、ログファイルのサイズが増加しますか?


16

アプリの前回のリリースでは、Service Brokerキューに何かが到着したときに待機するように指示するコマンドを追加しました。

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

DBAは、追加以来、ログサイズが屋根を通過したことを教えてくれました。これは正しいですか?それとも私は他の場所を探すべきですか?

回答:


17

アクティブなオープントランザクションはログを固定し、切り捨てを防ぎ、最終的に成長を引き起こします。トランザクションを開始し、ログに書き込み、メッセージが最終的に目覚めることを期待して永遠に待機する場合、ログを固定して、それを成長させます。

最近、私は、ループとともに、アクティブ化された手順でWAITFORを避けることを推奨し始めました。RECIEVeを発行して完了すると、アクティベーションメカニズムがループし(実行されます)、WAITFORではなく、単なるRECEIVEになります。

RECEIVEのWAITFORフレーバーは、内部的にセーブポイントを作成します。これによりログ(少なくとも3つのログレコード)が生成され、待機中に実際にログが固定されます。長いWAITFORタイムアウト(またはさらに悪いことに無限)を設定することは、非常に悪い習慣です。


1
WAITFOR (...) TIMEOUT 3600000問題を解決しますか?たとえば、1時間ごとにリリースします。
AngryHacker

2
ログは1時間で大きく成長ます。WAITFOR(REC EIVE)は5秒間隔のようにするためのものです...
レムスRusanu

1
また、トランザクションが実際にアクティブである(ログが書き込まれている)理由も調査する必要があります。一般的なService Brokerパターンでは、RECEIVEの前に書き込みが発行されません。
レマスルサヌ

1
最後のコメントがわかりません。私が発行したため、トランザクションがアクティブであるWAITFOR (RECEIVE...あなたが拡大してもらえますか?おそらく、私は誤解した。
AngryHacker

8
begin transaction; waitfor(receive...)待機中にログレコードを生成しない(トランザクションを「アクティブ化しない」)ため、ログを固定しません。唯一のbegin transaction;[insert|update|delete];waitfor(receive...)「アクティブ」にトランザクションを引き起こす(ログレコードを生成する)ので、待っている間、実際にログを固定しますします。
レムスルサヌ

5

SQL Server 2008 R2では、WAITFOR(RECEIVE)を実行してからDBCC OPENTRANを実行すると、以前の更新がない場合でもトランザクションがアクティブとして表示されます。


2
正しい、WAITFORは内部的にセーブポイントを作成し、これによりログの書き込みがトリガーされ、ログが適切に固定されます。
レムスルサヌ

@RemusRusanuは、他の回答に関する以前のコメントと矛盾しいませんか?
ビンキ

@binkiは、SQL Server 2005に関するコメントです。これは2008 R2向けです。私の記憶が正しければ、この問題に関しては動作が異なります。
レムスルサヌ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.