SE の雑記

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

リストア時のファイルの瞬時初期化について

leave a comment

SQL Server 2005 以降にはファイルの瞬時初期化 (Instant File Initialization) という機能があります。

データベース ファイルの初期化

SQL Server のデータベースはデータファイルとログファイルの 2 種類に分かれます。
これらのファイルは作成 / 拡張されたタイミングでファイル内を [0] で満たすことで初期化が行われます。
image

ファイルの瞬時初期化はこの [0] で満たすという初期化処理をファイルの作成 / 拡張時ではなくデータが書き込まれる際に行うというものになります。
# (使用している領域のみが初期化されることになります。
image

この瞬時初期化はデータファイル (.mdf / .ndf) ファイルが対象となり、ログファイル (.ldf) は対象になりません。
# ログファイルは必ず [0] を満たす初期化が行われます。

最終的にデータで使用する領域は初期化がおこわなれるのですが、その処理をどのタイミング (領域を確保したタイミング / 使用するタイミング) で行うかという違いがあります。

このファイルの瞬時初期化ですがリストア時にも有効な設定となります。

今回は、リストア時の瞬時初期化についてみていきたいと思います。
SQL Server におけるバックアップと復元のパフォーマンスの最適化

■ファイルの瞬時初期化の設定


ファイルの瞬時初期化を有効にするためには、SQL Server のサービス起動アカウントにローカルセキュリティポリシーで [ボリュームの保守タスクを実行] (SeManageVolumePrivilege) の権限を付与する必要があります。

ローカルセキュリティポリシー (secpol.msc) を起動して、[ローカル ポリシー] → [ボリュームの保守タスクを実行] を確認することで SQL Server のサービス起動アカウントが権限を保持しているかを確認することができます。
image

デフォルトの設定では、[Administrators] のみが権限を付与されている状態となっています。

そのため、SQL Server のサービスを

  • Administrator
  • Local System

で実行している場合には権限を付与しなくてもファイルの瞬時初期化が有効になっています。

SQL Server のセキュリティを考慮し強い権限を持つユーザーではなく、Users グループのユーザーで SQL Server のサービスを起動するということが良くあると思います。
その場合には、明示的に権限を付与する必要があります。

SQL Server のサービス起動ユーザーは [サービス] (services.msc) ではなく、必ず [SQL Server 構成マネージャー] から変更をします。
# これはサービスからユーザーを変更してしまうと、サービス起動ユーザーに適切な権限が付与されないためです。
image
# Denali CTP1 の SQL Server 構成マネージャーを使っているため英語版になっています。

ユーザーを変更したら、サービスを再起動すると設定したユーザーで SQL Server のサービスが起動されます。

サービスが起動してきたらユーザーに付与されている権限を確認してみます。
権限の確認には Sysinternals の [Process Explorer] が便利です。

ツールをダウンロードして起動したら、[sqlservr.exe] の [Properties] をクリックします。
# [winit.exe] → [services.exe] → [sqlservr.exe] という階層になっていると思います。
image

[Security] タブを見ると付与されている権限を確認することができます。
[ボリュームの保守タスクの実行] の権限の設定はまだしてませんので、[SeManageVolumePrivilege] は付与されていない状態です。
image

それでは、[ボリュームの保守タスクの実行] の権限を付与し、サービスの再起動を行ってから再度 Process Explorer で確認をしてみます。
imageimage

Process Explorer から、[SeManageVolumePrivilege] が付与されていることが確認できますね。
SQL Server でファイルの瞬時初期化を可能にするための準備が整いました。

 

■リストア時のファイルの瞬時初期化


ここからが本題のリストア時のファイルの瞬時初期化についてです。

RSS で SQL Server 関連の情報を眺めていたら、海外で以下の技術情報がありました。

Undocumented Trace Flags: Inside the Restore Process

リストア時の詳細な情報を出力するためのトレースフラグについて情報が公開されています。
ということでさっそく検証してみたいと思います。

まずは、[TEST] データベースを以下のクエリでリストアしてみます。

DROP DATABASE [TEST]
GO
EXEC  sp_cycle_errorlog
RESTORE DATABASE [TEST] FROM  DISK = N’H:SQL2008R2TEST.bak’
EXEC xp_readerrorlog

xp_readerrorlog を実行しているので、SQL Server のログの内容が結果に出力がされます。

2011-04-03 13:12:51.020 spid54       Starting up database ‘TEST’.
2011-04-03 13:12:51.040 spid54       The database ‘TEST’ is marked RESTORING and is in a state that does not allow recovery to be run.
2011-04-03 13:12:51.480 spid54       Starting up database ‘TEST’.
2011-04-03 13:12:51.810 バックアップ       Restore is complete on database ‘TEST’.  The database is now available.
2011-04-03 13:12:51.830 バックアップ       Database was restored: Database: TEST, creation date(time): 2011/04/03(12:45:39), first LSN: 34:16858:37, last LSN: 34:16874:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {‘H:SQL2008R2TEST.bak’}). Informational message. No user ac

それでは、クエリを以下のように変更してリストアをしてみます。

DROP DATABASE [TEST]
GO
DBCC TRACEON (3004) WITH NO_INFOMSGS
DBCC TRACEON (3605) WITH NO_INFOMSGS
GO
EXEC  sp_cycle_errorlog
RESTORE DATABASE [TEST] FROM  DISK = N’H:SQL2008R2TEST.bak’
EXEC xp_readerrorlog
DBCC TRACEOFF (3004) WITH NO_INFOMSGS
DBCC TRACEOFF (3605) WITH NO_INFOMSGS
GO

この時の SQL Server のログの内容が以下になります。

2011-04-03 13:15:36.750 spid55       RestoreDatabase: Database TEST
2011-04-03 13:15:36.750 spid55       Opening backup set
2011-04-03 13:15:36.770 spid55       Restore: Configuration section loaded
2011-04-03 13:15:36.770 spid55       Restore: Backup set is open
2011-04-03 13:15:36.770 spid55       Restore: Planning begins
2011-04-03 13:15:36.780 spid55       Restore: Planning complete
2011-04-03 13:15:36.780 spid55       Restore: BeginRestore (offline) on TEST
2011-04-03 13:15:36.780 spid55       Restore: Attached database TEST as DBID=5
2011-04-03 13:15:36.780 spid55       Restore: PreparingContainers
2011-04-03 13:15:36.800 spid55       Zeroing G:SQL2008R2TEST_log.ldf from page 1 to 12800 (0x2000 to 0x6400000)
2011-04-03 13:15:36.830 spid55       Restore: Containers are ready
2011-04-03 13:15:36.870 spid55       Restore: Restoring backup set
2011-04-03 13:15:36.870 spid55       Restore: Transferring data to TEST
2011-04-03 13:15:38.610 spid55       Zeroing completed on G:SQL2008R2TEST_log.ldf
2011-04-03 13:15:39.050 spid55       Restore: Waiting for log zero on TEST
2011-04-03 13:15:39.060 spid55       Restore: LogZero complete
2011-04-03 13:15:39.090 spid55       FileHandleCache: 0 files opened. CacheSize: 12
2011-04-03 13:15:39.090 spid55       Restore: Data transfer complete on TEST
2011-04-03 13:15:39.100 spid55       Restore: Backup set restored
2011-04-03 13:15:39.100 spid55       Starting up database ‘TEST’.
2011-04-03 13:15:39.120 spid55       The database ‘TEST’ is marked RESTORING and is in a state that does not allow recovery to be run.
2011-04-03 13:15:39.120 spid55       Restore-Redo begins on database TEST
2011-04-03 13:15:39.280 spid55       Rollforward complete on database TEST
2011-04-03 13:15:39.280 spid55       Restore: Done with fixups
2011-04-03 13:15:39.280 spid55       Restore: Transitioning database to ONLINE
2011-04-03 13:15:39.290 spid55       Restore: Restarting database for ONLINE
2011-04-03 13:15:39.310 spid55       Starting up database ‘TEST’.
2011-04-03 13:15:39.380 spid55       FixupLogTail(progress) zeroing G:SQL2008R2TEST_log.ldf from 0x83f400 to 0x840000.
2011-04-03 13:15:39.380 spid55       Zeroing G:SQL2008R2TEST_log.ldf from page 1056 to 1536 (0x840000 to 0xc00000)
2011-04-03 13:15:39.390 spid55       Zeroing completed on G:SQL2008R2TEST_log.ldf
2011-04-03 13:15:39.440 spid55       PostRestoreContainerFixups: running fixups on TEST
2011-04-03 13:15:39.440 spid55       PostRestoreContainerFixups: fixups complete
2011-04-03 13:15:39.490 spid55       PostRestoreReplicationFixup for TEST starts
2011-04-03 13:15:39.770 spid55       PostRestoreReplicationFixup for TEST complete
2011-04-03 13:15:39.790 spid55       Restore: Database is restarted
2011-04-03 13:15:39.790 バックアップ       Restore is complete on database ‘TEST’.  The database is now available.
2011-04-03 13:15:39.810 spid55       Resuming any halted fulltext crawls
2011-04-03 13:15:39.810 spid55       Restore: Writing history records
2011-04-03 13:15:39.810 バックアップ       Database was restored: Database: TEST, creation date(time): 2011/04/03(12:45:39), first LSN: 34:16858:37, last LSN: 34:16874:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {‘H:SQL2008R2TEST.bak’}). Informational message. No user ac
2011-04-03 13:15:39.820 spid55       Writing backup history records
2011-04-03 13:15:39.850 spid55       Restore: Done with MSDB maintenance

ログファイル (.ldf) のリストア処理で [zeroing] という文字が含まれるログが出力されています。
これが 0 で初期化している箇所になります。

データファイル (.mdf) ファイルについては [zeroing] というログは出力がされていません。
これは投稿の最初に書いたように [ファイルの瞬時初期化の対象はデータファイルのみ] となるためです。

ファイルの瞬時初期化を使用することができるデータファイルは 0 で満たすという処理が必要ではないため 0 による初期化は行われません。

ファイルの瞬時初期化が有効になっていない場合のログがこちらになります。

2011-04-03 13:27:53.550 spid51       RestoreDatabase: Database TEST
2011-04-03 13:27:53.560 spid51       Opening backup set
2011-04-03 13:27:53.610 spid51       Restore: Configuration section loaded
2011-04-03 13:27:53.610 spid51       Restore: Backup set is open
2011-04-03 13:27:53.610 spid51       Restore: Planning begins
2011-04-03 13:27:53.610 spid51       Restore: Planning complete
2011-04-03 13:27:53.610 spid51       Restore: BeginRestore (offline) on TEST
2011-04-03 13:27:53.610 spid51       Restore: Attached database TEST as DBID=5
2011-04-03 13:27:53.610 spid51       Restore: PreparingContainers
2011-04-03 13:27:53.650 spid51       Zeroing F:SQL2008R2TEST.mdf from page 1 to 12800 (0x2000 to 0x6400000)
2011-04-03 13:27:53.650 spid51       Zeroing G:SQL2008R2TEST_log.ldf from page 1 to 12800 (0x2000 to 0x6400000)
2011-04-03 13:27:55.090 spid51       Zeroing completed on G:SQL2008R2TEST_log.ldf
2011-04-03 13:27:55.090 spid51       Zeroing completed on F:SQL2008R2TEST.mdf
2011-04-03 13:27:55.090 spid51       Restore: Containers are ready
2011-04-03 13:27:55.090 spid51       Restore: Restoring backup set
2011-04-03 13:27:55.090 spid51       Restore: Transferring data to TEST
2011-04-03 13:27:56.480 spid51       Restore: Waiting for log zero on TEST
2011-04-03 13:27:56.500 spid51       Restore: LogZero complete
2011-04-03 13:27:56.540 spid51       FileHandleCache: 0 files opened. CacheSize: 12
2011-04-03 13:27:56.540 spid51       Restore: Data transfer complete on TEST
2011-04-03 13:27:56.550 spid51       Restore: Backup set restored
2011-04-03 13:27:56.560 spid51       Starting up database ‘TEST’.
2011-04-03 13:27:56.610 spid51       The database ‘TEST’ is marked RESTORING and is in a state that does not allow recovery to be run.
2011-04-03 13:27:56.610 spid51       Restore-Redo begins on database TEST
2011-04-03 13:27:56.860 spid51       Rollforward complete on database TEST
2011-04-03 13:27:56.870 spid51       Restore: Done with fixups
2011-04-03 13:27:56.870 spid51       Restore: Transitioning database to ONLINE
2011-04-03 13:27:56.870 spid51       Restore: Restarting database for ONLINE
2011-04-03 13:27:56.890 spid51       Starting up database ‘TEST’.
2011-04-03 13:27:56.960 spid51       FixupLogTail(progress) zeroing G:SQL2008R2TEST_log.ldf from 0x83f400 to 0x840000.
2011-04-03 13:27:56.960 spid51       Zeroing G:SQL2008R2TEST_log.ldf from page 1056 to 1536 (0x840000 to 0xc00000)
2011-04-03 13:27:56.980 spid51       Zeroing completed on G:SQL2008R2TEST_log.ldf
2011-04-03 13:27:57.090 spid51       PostRestoreContainerFixups: running fixups on TEST
2011-04-03 13:27:57.090 spid51       PostRestoreContainerFixups: fixups complete
2011-04-03 13:27:57.120 spid51       PostRestoreReplicationFixup for TEST starts
2011-04-03 13:27:57.500 spid51       PostRestoreReplicationFixup for TEST complete
2011-04-03 13:27:57.520 spid51       Restore: Database is restarted
2011-04-03 13:27:57.520 バックアップ       Restore is complete on database ‘TEST’.  The database is now available.
2011-04-03 13:27:57.530 spid51       Resuming any halted fulltext crawls
2011-04-03 13:27:57.530 spid51       Restore: Writing history records
2011-04-03 13:27:57.530 バックアップ       Database was restored: Database: TEST, creation date(time): 2011/04/03(12:45:39), first LSN: 34:16858:37, last LSN: 34:16874:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {‘H:SQL2008R2TEST.bak’}). Informational message. No user ac
2011-04-03 13:27:57.530 spid51       Writing backup history records
2011-04-03 13:27:57.940 spid51       Restore: Done with MSDB maintenance
2011-04-03 13:27:57.940 spid51       RestoreDatabase: Finished

瞬時初期化が有効でない場合はデータファイル (.mdf) に対しても 0 による初期化が行われているのが確認できますね。

今回はログから瞬時初期化の部分のみを確認しましたが、トレースフラグを設定することにより通常出力されるログと比較してかなり詳細な内容が出力されるようになるので、リストアの動作を理解するのにかなり役に立ちそうですね。

Written by masayuki.ozawa

4月 3rd, 2011 at 1:38 pm

Posted in SQL Server

Tagged with

Leave a Reply

*