SQL Server でバックアップを取得した際ですがバックアップ実行時にバックアップファイルの領域が事前に確保されます。
バックアップ圧縮の有無でこの領域確保の動作が変わってきますので、今回はこの内容についてまとめてみたいと思います。
詳細については以下の技術情報に記載されています。
INF: Space requirements for backup devices in SQL Server
SQL Server Compressed Backups Disk Space Needs
■非圧縮の場合の動作
非圧縮のバックアップを取得した場合、バックアップのサイズはデータベースの使用領域+α(リストアに必要となるログ分) がおおよそのサイズとなります。
そのため、sp_spaceused で取得した、使用済みのサイズと大体一致するようです。
今回は以下のデータベースのバックアップを取得してみます。
データベースで使用している領域は
11,244,840 + 1,644,640 = 12,889,480 KB
となります。
それではバックアップを非圧縮で取得してみます。
BACKUP DATABASE [TEST] TO DISK = N’H:BackupTEST_BACKUP.bak’ |
バックアップの取得を開始すると、バックアップファイルのサイズは sp_spaceused と近い値が確保されます。
バックアップの実行ですが、事前にファイルの領域が確保され、その領域に対してバックアップを書き込むという動作になるようです。
そのため、0KB から徐々に増えていくという動作ではないようです。
非圧縮の場合は、sp_spaceused で予測したサイズの近似値となっていますね。
■圧縮の場合の動作
次に圧縮をしたバックアップを取得してみます。
BACKUP DATABASE [TEST] TO DISK = N’H:BackupTEST_BACKUP.bak’ |
圧縮をしてバックアップを開始した直後のファイルサイズがこちらです。
バックアップが終了した時のファイルサイズがこちらになります。
圧縮をした場合、バックアップ後のファイルサイズの予想が難しいため、SQL Server が事前に確保した領域とは差が出ることがあるようです。
# 増えることも減ることもあったかと。
■事前に領域を確保しない動作にするためのトレースフラグ
バックアップ関連のトレースフラグとして、[3042] があり、このトレースフラグを設定してバックアップを取得することで事前の領域は確保せずにバックアップを取得するように動作を変更することができます。
# 非圧縮の場合も使えるようです。
DBCC TRACEON(3042) BACKUP DATABASE [TEST] TO DISK = N’H:BackupTEST_BACKUP.bak’ DBCC TRACEOFF(3042) |
トレースフラグを設定することでこのような動作に変更することができます。
ネットワーク越しにバックアップを取得する際に使用するケースがあるようですね。
今日、SQL Server のセミナーに参加させていただき、バックアップ圧縮のお話があり、書こうとしてすっかり忘れていたことを思い出し、良い機会でしたので軽くまとめてみました。