問題
SQL Server 2005支持數據庫即時文件初始化(Instant File Initialization),這種即時文件初始化可以跳過清零數據的頁面,這樣做可以在執行一些操作,比如創建數據庫,增加文件到現有的數據庫中,手動、通過自動增長(autogrowth)或保存一個數據庫或文件組來增大現有數據庫文件時,減少時間。但是,我們如何確定SQL Server正在使用這個功能?
專家解答
在SQL Server以前的版本中,數據和日志文件一開始是通過在你執行之前提到的某項操作時,用零歸檔這些文件來初始化的。在災難備份和還原操作中,這是非常關鍵的,尤其是處理非常大的數據庫時。
對SQL Server而言,即時文件初始化已經引進了。而這所做的是,它跳過磁盤上的零數據,因此不重寫在磁盤上寫過的先前的數據。操作系統只分配磁盤空間,但是文件的內容實際上是原先在磁盤上寫的。這個功能對於運行在NTFS文件系統的Windows Server 2003或者Windows XP上的所有SQL Server 2005版本都適用。
即使它是可用的,你的實例也可能不能配置使用。要解決這個問題,你應該給你的SQL Server服務賬號或者SQLServerMSSQLUser$instancename這個本地組
SE_MANAGE_VOLUME_NAME的權限。SQLServerMSSQLUser$instancename這個本地組創建於你安裝SQL Server 2005並把SQL Server服務賬號加到這個數據庫中。要做到這些,服務賬號和本地組需要被授予“Perform Volume Maintenance Task”的本地安全權限。默認情況下,本地管理員組已經有這個許可,所以如果你的服務賬號已經是這個組的一員,那麼你沒必要去做什麼事情。
請注意,這只適用於數據文件而不適用於日志文件,所以如果你有大量的事務日志文件,而這些文件又作為你數據庫備份的一部分,那麼數據庫文件會即時創建而日志文件不會。日志文件在被寫回磁盤之前需要被清零。
注意事項
即使這個改進了autogrowth事件的文件增長性能,它不應作為正確排列你數據庫文件來達到最小化的替代方法。如果不能避免,使其自動增長。另外,當SQL Server服務在運行時,如果你把這個權限給服務賬號,那麼為了使這個功能生效你必須停止並重啟服務。你也可以通過運行gpupdate /force命令立即在安全策略中應用修改。
這樣做也有安全風險。存在這樣的可能性,那就是你會通過未授權的賬戶訪問磁盤上的非零數據。想像一個數據文件沒有在磁盤上清零的被刪除的數據庫!如果因為自由訪問控制列表(DACL)僅用於數據文件被SQL Server使用時而導致沒有自由訪問控制列表被定義在文件上,那麼任何用戶都可以訪問這些數據。如果披露已刪內容的可能性是受到關注的,那麼建議當自由訪問控制列表從SQL Server中分離時,在你的數據文件或備份上明確地使用受限制的自由訪問控制列表。
提示
配置你的SQL Server 2005實例來使用即時文件初始化。
在一個SQL Server 2005實例上,通過還原一個大型數據庫(任何大於100GB)來測試它。
在一個測試服務器上,不經過許可還原數據庫備份並且衡量還原的時間。
刪除這個還原的數據庫並停止SQL Server服務。
把“Perform Volume Maintenance Task”授權給SQL Server服務賬號並重啟服務。
再次還原數據庫備份並且衡量還原的時間。