SQLログとアクティブトランザクション
-
10-10-2019 - |
質問
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
これが私の質問と問題です:
- 私はそれを手に入れます..ロールバックコマンドが必要なトランザクションステートメントがあります
<if @@ trancount> 0 lollback> ..しかし、私はそれをする前に100のストアドプロシージャがあるので....
それまでの間...どうすればこの問題を根絶できますか?私は縮小しようとしました、そして私はDBをバックアップしようとしました...
ご覧のとおり、簡単なモードです...ログのみのファイルをバックアップする方法がわかりません...(それを行う方法が見つかりません)...
解決
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)をループするか、トリッピングの背景削除としてより頻繁にスケジュールすることができます。