質問

SQL 2008がシミュレートされたSQL 2005 dBを実行しているWebサーバーがあり、テスト環境用のローカルSQL 2005 dBがあります。

これにより、2008サーバーのバックアップが2005サーバーに復元されないため、テスト用のバックアップ/復元データのスクリプトを使用します。

このSQLクエリを実行して、本番Web SQL Server(2008)のテーブルのサイズを縮小すると

 DELETE FROM TickersDay
 WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8)
 GO

私はこのメッセージを受け取ります:

 Msg 9002, Level 17, State 4, Line 3
 The transaction log for database 'VTNET' is full. To find out why space in the log
 cannot be reused, see the log_reuse_wait_desc column in sys.databases

時々スクリプトを公開するときに現れます。

このSQLコマンドを実行すると、次の結果が得られます。

 SELECT [name], recovery_model_desc, log_reuse_wait_desc
 FROM sys.databases

結果:

 [name]      recovery_model_desc       log_reuse_wait_desc

 VTNET  SIMPLE                     ACTIVE_TRANSACTION

これが私の質問と問題です:

  1. 私はそれを手に入れます..ロールバックコマンドが必要なトランザクションステートメントがあります

<if @@ trancount> 0 lollback> ..しかし、私はそれをする前に100のストアドプロシージャがあるので....

  1. それまでの間...どうすればこの問題を根絶できますか?私は縮小しようとしました、そして私はDBをバックアップしようとしました...

  2. ご覧のとおり、簡単なモードです...ログのみのファイルをバックアップする方法がわかりません...(それを行う方法が見つかりません)...

役に立ちましたか?

解決

SQLを取得するだけで、この問題を回避できるかもしれません いいえ 削除するために必要な日付のみでインデックスを使用してテーブル全体を処理する。インデックスフレンドリーになるように言い換えてください

DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

これを十分に(少なくとも毎日)実行する場合、フィールドでDatediffを使用した場合にテーブル全体を通過する代わりに、Tickersday([日付])のインデックスを介して1/9以下を処理する必要があります。

それがまだこれを引き起こした場合:

データベースのトランザクションログ「VTNET」がいっぱいです

ログサイズを増やす必要があります。なぜなら、ログサイズはオートグローに設定されておらず、この操作に十分な大きさではないと思うからです。それか、削除のバッチのバッチを検討し始める(日付にインデックスがあると仮定して、これは100行のみを効率的にターゲットにします)など

DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

@@ rowcount> 0)をループするか、トリッピングの背景削除としてより頻繁にスケジュールすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top