はじめに Microsoft SQL Server 2005 では、データベース内のトランザクション ログ ファイルを圧縮して、未使用のページを削除できます。データベース エンジンはスペースを効率的に再利用します。ただし、トランザクション ログ ファイルが予期せず大きくなった場合は、トランザクション ログ ファイルを手動で縮小することが必要になる場合があります。
この記事では、DBCC SHRINKFILE ステートメントを使用して、完全復旧モデルで SQL Server 2005 データベース内のトランザクション ログ ファイルを手動で圧縮する方法について説明します。 SQL Server 2005 でトランザクション ログ ファイルを圧縮するために使用する方法は、SQL Server 2000 でトランザクション ログ ファイルを圧縮するために使用する方法とは異なる場合があります。 SQL Server 2000 でトランザクション ログ ファイルを圧縮する方法の詳細については、以下の記事番号をクリックして、Microsoft サポート技術情報の対応する記事を参照してください。
272318 ( http://support.microsoft.com/kb/272318/ ) INF: DBCC SHRINKFILE を使用した SQL Server 2000 のトランザクション ログの圧縮
先頭へ戻る
詳細 SQL Server 2005 では、圧縮操作 (DBCC SHRINKFILE) は、指定されたトランザクション ログ ファイルを必要なサイズまでただちに圧縮しようとします。完全復旧モデルでトランザクション ログ ファイルを手動で圧縮するには、まずトランザクション ログ ファイルをバックアップします。次に、DBCC SHRINKFILE ステートメントを使用して、トランザクション ログ ファイルを圧縮します。
一般に、SQL Server 2005 でのトランザクション ログ ファイルの圧縮は、SQL Server 2000 でのトランザクション ログ ファイルの圧縮よりも高速です。その理由は、SQL Server 2005 ログ マネージャーが物理ディスクの記憶順序に基づいて非アクティブな仮想ログ ファイルを作成または再利用するためです。したがって、トランザクション ログ ファイルの非アクティブな部分は通常、ファイルの最後にあります。
たとえば、トランザクション ログ ファイルには 100 個の仮想ログ ファイルが含まれる場合がありますが、使用される仮想ログ ファイルは 2 個だけです。 SQL Server 2000 は、トランザクション ログ ファイルの先頭で使用される最初の仮想ログ ファイルと、トランザクション ログ ファイルの途中で使用される 2 番目の仮想ログ ファイルを保存します。トランザクション ログ ファイルを 2 つの仮想ログ ファイルのみに縮小するために、SQL Server は 2 番目の仮想ログ ファイルの残りを仮想ログ エントリで埋めます。 SQL Server は、論理ログの先頭を、ログ マネージャーによって指定された次に使用可能な仮想ログ ファイルに移動します。ログ マネージャーは、トランザクション ログ ファイルの途中、最後のアクティブな仮想ログ ファイルの前に仮想ログ ファイルを作成する場合があります。この場合、トランザクション ログ ファイルを 2 つの仮想ログ ファイルに正常に圧縮するには、複数のログ バックアップ操作と複数の圧縮操作を使用する必要があります。最悪の場合、トランザクション ログ ファイルを 2 つの仮想ログ ファイルに正常に圧縮するには、50 回のログ バックアップ操作と 50 回の圧縮操作を使用する必要がある場合があります。
ただし、SQL Server 2005 では、DBCC SHRINKFILE ステートメントを実行することで、トランザクション ログ ファイルを 2 つの仮想ログ ファイルにすぐに縮小できます。これは、SQL Server 2005 ログ マネージャーが物理ディスクに保存されている順序で 2 つの仮想ログ ファイルを作成するためです。どちらの仮想ログ ファイルも、トランザクション ログ ファイルの先頭に配置されます。
SQL Server 2005 で空き領域がほとんどないトランザクション ログ ファイルを圧縮しようとすると、別のログ バックアップ操作を実行する必要があります。この追加のログ バックアップ操作により、トランザクション ログ ファイルが小さいサイズに切り詰められます。 SQL Server 2000 でトランザクション ログ ファイルを圧縮する場合は、上記の 3 つの手順を実行することに加えて、このログ バックアップ操作も実行する必要があります。詳細については、「はじめに」セクションに記載されている Microsoft サポート技術情報の記事を参照してください。 SQL Server 2005 で空き領域がほとんどないトランザクション ログ ファイルを圧縮するには、次の手順を実行します。 1. トランザクション ログ ファイルをバックアップして、アクティブな仮想ログ ファイルのほとんどが非アクティブになるようにします。したがって、非アクティブな仮想ログ ファイルは後の手順で削除できます。これを行うには、次の Transact-SQL ステートメントと同様の Transact-SQL ステートメントを実行します。バックアップ ログ <データベース名> TO DISK = '<バックアップファイル>'
注: このステートメントの <DatabaseName> は、バックアップするデータベースの名前のプレースホルダーです。このステートメントの <BackupFile> は、バックアップ ファイルへのフル パスのプレースホルダーです。
たとえば、次の Transact-SQL ステートメントを実行します。 TestDB のログを DISK='C:TestDB1.bak' にバックアップします
2. トランザクション ログ ファイルを圧縮します。これを行うには、次の Transact-SQL ステートメントと同様の Transact-SQL ステートメントを実行します。 DBCC SHRINKFILE (<ファイル名>、<ターゲットサイズ>) WITH NO_INFOMSGS
注: このステートメントの <FileName> は、トランザクション ログ ファイルの名前のプレースホルダーです。このステートメントの <TargetSize> は、トランザクション ログ ファイルのターゲット サイズのプレースホルダーです。ターゲットのサイズは適切でなければなりません。たとえば、トランザクション ログ ファイルを 2 つ未満の仮想ログ ファイルに縮小することはできません。
3. DBCC SHRINKFILE ステートメントによってトランザクション ログ ファイルがターゲット サイズまで縮小されない場合は、手順 1 で説明した BACKUP LOG ステートメントを実行して、さらに多くの仮想ログ ファイルを非アクティブにします。
4. 手順 2 で説明した DBCC SHRINKFILE ステートメントを実行します。これを実行すると、トランザクション ログ ファイルは目標サイズに近づくはずです。
要約すると、ログ マネージャーが次の仮想ログ ファイルを選択するために使用するアルゴリズムが SQL Server 2005 で変更されました。したがって、SQL Server 2005 でのトランザクション ログ ファイルの圧縮は、SQL Server 2000 でのトランザクション ログ ファイルの圧縮とは次の点で異なります。 SQL Server 2000 でのトランザクション ログ ファイルの圧縮 トランザクション ログ ファイルの圧縮は高速です。
? ログ ファイルに空き領域がない場合、SQL Server 2005 でのトランザクション ログ ファイルの圧縮は、SQL Server 2000 でのトランザクション ログ ファイルの圧縮と同じです。
? ログ ファイルの空き領域が非常に少ない場合、SQL Server 2005 でトランザクション ログ ファイルを圧縮するには、SQL Server 2000 でこの操作を実行するよりも 1 回多くのログ バックアップ操作が必要です。