#はじめに
SQL Serverのトランサクションログが肥大化した場合の対応方法に関して記述しています。データー復旧モードが完全のデーターベースの場合、トランザクションログは、DBおよびトランサクションログの完全バックアップ時に切り捨てられます。
このため、バックアップをスケジュール化しておけば、DBのトランサクションログは、切り捨てられて適切な大きさに保たれるはずです。
しかしながら、トランサクションログのファイルサイズが想定以上に大きくなってしまう問題が発生し、SSMS(SQL Server Management Studio)でもうまく縮小できない事象が発生しました。
具体的には、1つのDBのトランサクションログファイルが、数百Gまで拡張してしまい、ストレージを圧迫する問題が発生していました。一時的に、ストレージを拡張して対処しましたが、そもそも、完全バックアップを取得しているため、このまま放置してもトランサクションログファイルが肥大化するのでは、どうしようもなくなるので対応を行っています。
サーバー構成は、SQL Server 2016 AllwaysON 可用性構成のサーバーです。
#SSMSでの手順(失敗)
SSMS上のファイルの圧縮機能を利用してファイルの圧縮を試みます。操作は、SQLのプライマリー側で作業を行います。
対象のデーターベースを選択して右クリック 「タスク」「圧縮」「File」を選択します。
ファイルの種類で「ログ」を選択します。 「未使用の領域を解放する」(デフォルト)を選択します。
「OK」をクリックします。
本来これで、ファイルが解放されて、トランサクションログファイルが小さくなるはずです。しかしながら、ファイルサイスに変化がありませんでした。
#対応方法
SSMSで下記のコマンドを実行します。
SELECT name, size, size * 8 AS size_kb FROM sys.database_files WHERE type = 0
DBCC SHRINKFILE (N'PIFD_log' , 0, TRUNCATEONLY)
SELECT name, size, size * 8 AS size_kb FROM sys.database_files WHERE type = 0
有効なコマンドは、DBCC SHRINKFILE です。このコマンドは、2つの動作モードがあって、ファイルの最後の空き領域を解放する(今回のコマンド)機能と、ファイルの中身を移動して、ファイルの空きを作るモードの2つがあります。
後者のモードを利用する場合、DBCC SHRINKFILE (N'PIFD_log' , ターゲットサイズ(MB)) となります。こちらのモードを利用する場合、ページ単位でデーターをファイルの前のほうの空きに移動します。この時にトランサクションログをとるようなので、すると、トランサクションログを小さくするのにトランサクションをとってしまうというわけのわからない状況になりそうなので、利用しませんでした。
上記コマンドを実行することで、トランサクションログファイルの縮小ができました。
本操作をプライマリー側で実施することで、セカンダリ側のトランサクションログファイルの大きさも小さくなります。