復元直後のアプリケーションでは、新しく作成されたデータベースに対して多くの(> 100,000,000)更新を実行します。したがって、LOGファイルは大幅に増加します。
どうすれば成長を止めることができますか?
注:リカバリモデルをシンプルに設定しても機能しません。
また、この質問は元々ここに投稿されました: https://stackoverflow.com/questions/4400057/how-to-stop-log-file-from-growing-in-sql-server-2008
回復モデルを単純で、縮小を実行するのに十分な長さに変更してから、回復モデルを元に戻すことはできますか?
何かのようなもの:
alter database <mydb> set recovery simple
go
checkpoint
go
alter database <mydb> set recovery full
go
backup database pubs to disk = 'c:\mydb.bak' with init
go
dbcc shrinkfile (N'mydb_log' , 1)
go
私はそれを http://sql-server-performance.com/Community/forums/p/28345/151682.aspx から借りたことを認めます
そのリンクは次のリンクにもリンクしています: http://madhuottapalam.blogspot.com/2008/05/faq-how-to-truncate-and-shrink.html
あなたがする必要があるでしょう:
私が提案したように stackoverflow :
あなたがする必要があるでしょう:
ログバックアップをより頻繁に実行する必要があります。たぶん、それらの更新が行われている間、5分ごとに。
夜間の差分バックアップは、以前に作成された圧倒的な量のログバックアップに依存せず、ポイントインタイムリカバリ機能に関心がない場合に役立つはずです。
ロギングを制御する唯一の実際の方法は、定期的なSQLバックアップを実行することです。単純なリカバリモデルに移行できない場合は、バックアップ戦略にトランザクションログバックアップの実行を含めて、チェックポイントを設定する必要があります。チェックポイントが設定されると、SQLサーバーはディスク領域の回復を開始できます。
簡単な答えは-あなたはしません。シンプルなリカバリーモデルは最高です。基本的に、データ書き込みシナリオ全体にはログファイルが必要です(更新をコミットするときにデータベースは書き込まれません)。
ログファイルのusingからSQLを停止することはできません。これが、SQLの動作方法です。ただし、SQLがファイルを頻繁に再利用するようにすることで、ファイルを小さく保つことができます。これを行う2つの方法:
シンプルモードへの切り替えが最も簡単です。これができない場合は、非常に頻繁に(10〜15分ごとに?)トランザクションログのバックアップを取ります。
これらの場合の両方では、ではないことを確認する必要がありますすべての更新を1つの巨大なバッチ(UPDATE GIANTTABLE ... with no WHERE clause
)で実行します。限られた数の行(たとえば100,000程度)のみを更新するには、UPDATE TOP
、WHILE
、またはカーソルを使用する必要がある場合があります。
頭に浮かんだことの1つは、それらの1億レコードを挿入/更新するために一括更新を利用できるということです。一括更新による最小限のロギングについては、 MSDNで説明 のこの情報を参照してください。