SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server バックアップ実行時のバックアップファイルの初期サイズについて

leave a comment

SQL Server でバックアップを取得した際ですがバックアップ実行時にバックアップファイルの領域が事前に確保されます。

バックアップ圧縮の有無でこの領域確保の動作が変わってきますので、今回はこの内容についてまとめてみたいと思います。

詳細については以下の技術情報に記載されています。
INF: Space requirements for backup devices in SQL Server
SQL Server Compressed Backups Disk Space Needs

 

■非圧縮の場合の動作


非圧縮のバックアップを取得した場合、バックアップのサイズはデータベースの使用領域+α(リストアに必要となるログ分) がおおよそのサイズとなります。

そのため、sp_spaceused で取得した、使用済みのサイズと大体一致するようです。
今回は以下のデータベースのバックアップを取得してみます。
image

データベースで使用している領域は

11,244,840 + 1,644,640 = 12,889,480 KB

となります。

それではバックアップを非圧縮で取得してみます。

BACKUP DATABASE [TEST] TO  DISK = N’H:BackupTEST_BACKUP.bak’
WITH  FORMAT, INIT, STATS = 10
GO

バックアップの取得を開始すると、バックアップファイルのサイズは sp_spaceused と近い値が確保されます。
image

バックアップの実行ですが、事前にファイルの領域が確保され、その領域に対してバックアップを書き込むという動作になるようです。
そのため、0KB から徐々に増えていくという動作ではないようです。

取得が終わった時のサイズがこちらです。
image

非圧縮の場合は、sp_spaceused で予測したサイズの近似値となっていますね。

 

■圧縮の場合の動作


次に圧縮をしたバックアップを取得してみます。

BACKUP DATABASE [TEST] TO  DISK = N’H:BackupTEST_BACKUP.bak’
WITH  COMPRESSION, FORMAT, INIT, STATS = 10
GO

圧縮をしてバックアップを開始した直後のファイルサイズがこちらです。
image

バックアップが終了した時のファイルサイズがこちらになります。
image

圧縮をした場合、バックアップ後のファイルサイズの予想が難しいため、SQL Server が事前に確保した領域とは差が出ることがあるようです。
# 増えることも減ることもあったかと。

 

■事前に領域を確保しない動作にするためのトレースフラグ


バックアップ関連のトレースフラグとして、[3042] があり、このトレースフラグを設定してバックアップを取得することで事前の領域は確保せずにバックアップを取得するように動作を変更することができます。
# 非圧縮の場合も使えるようです。

DBCC TRACEON(3042)

BACKUP DATABASE [TEST] TO  DISK = N’H:BackupTEST_BACKUP.bak’
WITH  COMPRESSION, FORMAT, INIT, STATS = 10

DBCC TRACEOFF(3042)
GO

バックアップ取得時のファイルサイズは 0KB から始まり、
image

徐々に増えていきます。
image
image
image
image
image

トレースフラグを設定することでこのような動作に変更することができます。
ネットワーク越しにバックアップを取得する際に使用するケースがあるようですね。

今日、SQL Server のセミナーに参加させていただき、バックアップ圧縮のお話があり、書こうとしてすっかり忘れていたことを思い出し、良い機会でしたので軽くまとめてみました。

Share

Written by Masayuki.Ozawa

11月 9th, 2011 at 10:20 pm

Posted in SQL Server

Tagged with

Leave a Reply