web-dev-qa-db-ja.com

LOGファイルの初期サイズを小さくするにはどうすればよいですか?

SQL Server 2008r2データベースを継承しました。データファイルは1,000 MBの初期サイズで作成されましたが、トランザクションログの初期サイズは28,016 MBです。バックアップは実行されていません。

私はリカバリのニーズに合わせて完全バックアップとトランザクションバックアップを実装しました。その結果、トランザクションファイルは常に99.9%まで空になり、使用される30または40 MBを超えることはありません。ログをより適切なサイズ(200 mb程度)に縮小できるように、初期サイズを小さくしたいと思います。

200 MBの初期サイズでログファイルを再定義する方法を誰かが知っていますか?

5
Brent Brown

200 MBの初期サイズでログファイルを再定義する方法を誰かが知っていますか?

ALTER DATABASE [YOUR_DB_NAME] ... MODIFY FILE ... SIZEを使用する必要があります

ALTER DATABASE [your_db_name] 
SET RECOVERY SIMPLE;

CHECKPOINT;

-- shrink the log file to 200MB
DBCC SHRINKFILE (your_db_name_log,200);

--- define the initial size to 200MB as well.. CHANGE it as per your needs!
ALTER DATABASE [your_db_name]
MODIFY FILE (NAME=your_db_name_LOGICAL_log,SIZE=200MB,MAXSIZE=UNLIMITED,FILEGROWTH=100MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [your_db_name] 
SET RECOVERY FULL;
--- Take full backup to establish log chain
-- take log backups to help truncate the log file and keep it manageable

提案:

  • 200MBの初期サイズは非常に小さいです。システムのビジー度とログバックアップの頻度(DBが完全復旧の場合)に応じて、初期サイズと自動拡張を作成することを検討することをお勧めします より賢明
  • データファイルの自動拡張イベント(およびデータベースの作成とデータベースの復元)に役立つインスタントファイル初期化を有効にすることは常に良いアイデアです。詳細は データベースの最適化と自動拡張の設定 回答を参照してください。
6
Kin Shah

まず最初に注意してください 初期サイズ は実際には意味していません。はい、できますが、SSMS GUIを使用しないようにしてください。

ALTER DATABASE [db_name] 
SET RECOVERY SIMPLE;

sp_helpdb db_name --get logical log file name

CHECKPOINT;

DBCC SHRINKFILE (db_name_log,0);

ALTER DATABASE [db_name]
MODIFY FILE (name=db_name_log,SIZE=240MB,MAXSIZE=UNLIMITED,FILEGROWTH=500MB);--dummy values change accordingly

ALTER DATABASE [db_name] 
SET RECOVERY FULL;

この記事 を読み、与えられたクエリを使用して、自動拡張サイズの適切な値を計算できます。適切な初期サイズはスペースを事前に割り当て、あまり良いイベントではない頻繁な自動拡張を回避します

2
Shanky

ブレント、

あなたのアプローチは、データベースがどの回復モードにあるかに依存します。

これは、SQL Serverのバージョンの MSDN DBCC SHRINKFILE リファレンスです。

シンプルリカバリモードのデータベースの場合は、

    DBCC SHRINKFILE (N'<logical_file_name_of_the_log>'<Size In MB>)          

必要なのはこれだけです。初期サイズは、ファイルを縮小したサイズにリセットされるはずです。

完全復旧モードのデータベースの場合、バックアップとしてマークされていないトランザクションがある場合、縮小コマンドはファイルを縮小しないため、2つのオプションがあります。

1つ目は、トランザクションログのバックアップを行うことです。これにより、バックアップされたすべてのアイテムが再利用可能としてマークされます。その後、shrinkコマンドを実行できます。

2つ目は、リカバリモードをSIMPLEに変更してから、shrinkコマンドを実行し、完了したら、リカバリモードをFULLに戻します。 (このアプローチでは、最新の完全バックアップと差分のみにリカバリできます)。これを行う方法の詳細は、提供されているMSDNリンクで確認できます。

どちらのオプションも、ファイルの初期サイズを、縮小したサイズにリセットします。

ログファイルが縮小したら、定期的にトランザクションログのバックアップをセットアップして、ログファイルが再び大きくならないようにする必要があります。

すべてのリカバリモードとトランザクションログの圧縮オプションでは、データベースのユーザーがファイルの圧縮中にエラーが発生する可能性があります。 SQL Serverは、要求の処理が多すぎる場合にもコマンドを失敗させる可能性があります。可能な場合は、いくつかのダウンタイムをスケジュールし、コマンドを使用してデータベースをシングルユーザーモードにします

    use <database>
    Go
    alter database <database> set single_user with rollback immediate 
    Go
    DBCC SHRINKFILE (N'<logical_file_name_of_the_log>'<Size In MB>)
    Go
    alter database <database> set multi_user with rollback immediate
    Go

これにより、他のステートメントでブロックされずに縮小できます。

2
Aaron