3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQL Serverトランザクションログファイルの縮小

Posted at

#はじめに
SQL Serverのトランサクションログが肥大化した場合の対応方法に関して記述しています。データー復旧モードが完全のデーターベースの場合、トランザクションログは、DBおよびトランサクションログの完全バックアップ時に切り捨てられます。
このため、バックアップをスケジュール化しておけば、DBのトランサクションログは、切り捨てられて適切な大きさに保たれるはずです。
 しかしながら、トランサクションログのファイルサイズが想定以上に大きくなってしまう問題が発生し、SSMS(SQL Server Management Studio)でもうまく縮小できない事象が発生しました。
 具体的には、1つのDBのトランサクションログファイルが、数百Gまで拡張してしまい、ストレージを圧迫する問題が発生していました。一時的に、ストレージを拡張して対処しましたが、そもそも、完全バックアップを取得しているため、このまま放置してもトランサクションログファイルが肥大化するのでは、どうしようもなくなるので対応を行っています。
 サーバー構成は、SQL Server 2016 AllwaysON 可用性構成のサーバーです。

#SSMSでの手順(失敗)
SSMS上のファイルの圧縮機能を利用してファイルの圧縮を試みます。操作は、SQLのプライマリー側で作業を行います。

キャプチャ.PNG
対象のデーターベースを選択して右クリック 「タスク」「圧縮」「File」を選択します。

キャプチャ1.PNG

 ファイルの種類で「ログ」を選択します。 「未使用の領域を解放する」(デフォルト)を選択します。
 「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)) となります。こちらのモードを利用する場合、ページ単位でデーターをファイルの前のほうの空きに移動します。この時にトランサクションログをとるようなので、すると、トランサクションログを小さくするのにトランサクションをとってしまうというわけのわからない状況になりそうなので、利用しませんでした。

上記コマンドを実行することで、トランサクションログファイルの縮小ができました。

 本操作をプライマリー側で実施することで、セカンダリ側のトランサクションログファイルの大きさも小さくなります。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?