SQL Server 即時檔案初始化
一.本文所涉及的內容(Contents)
二.背景(Contexts)
資料庫伺服器在為表分配初始值的時候很慢,分配初始值40GB的資料檔案,花了30多分鐘,一開始的時候一直認為是伺服器磁碟的寫入速度太慢造成的,後來經過北京-宋沄劍的提醒:即時檔案初始化(Instant File Initialization),設定這一選項之後,速度提升到了19秒,下面將描述這個優化的設定過程。
三.基礎知識(Rudimentary Knowledge)
就資料庫而言,以下幾種情況需要對檔案初始化:
1. 建立資料庫;
2. 向現有資料庫中新增檔案、日誌或資料;
3. 增大現有檔案的大小(包括自動增長操作);
4. 還原資料庫或檔案組;
執行上面的操作,作業系統需要用零來填充檔案進行初始化。在 SQL Server 中,可以在瞬間對資料檔案進行初始化。即時檔案初始化將回收已使用的磁碟空間而不使用零來填充該空間。而在向檔案中寫入新資料時,磁碟內容將被覆蓋。日誌檔案不能立即初始化。
即時檔案初始化功能僅在向 SQL Server (MSSQLSERVER) 服務帳戶授予了 SE_MANAGE_VOLUME_NAME 之後才可用。Windows Administrator 組的成員擁有此許可權,並可以通過將其他使用者新增到【執行卷維護任務】安全策略中來為其授予此許可權。
四.實現過程(Process)
首先執行gpedit.msc,按照Figure1的路徑,找到【執行卷維護任務】,如Figure2所示,預設的情況下它已經設定了Administrators組的;
(Figure1:gpedit.msc)
(Figure2:執行卷維護任務)
接著執行services.msc進入服務設定,檢視到SQL Server (MSSQLSERVER)的登陸使用者是【網路服務】(如Figure3所示),這就是造成初始化40GB檔案花費了30多分鐘的原因了,因為【網路服務】不具備SE_MANAGE_VOLUME_NAME的許可權(可檢視Administrators組成員);
(Figure3:SQL Server (MSSQLSERVER))
雙擊SQL Server (MSSQLSERVER)服務進入設定,在登陸的選項卡中可以看到帳號是:NT AUTHORITY\NETWORKSERVICE,如Figure4所示。
(Figure4:NT AUTHORITY\NETWORKSERVICE)
直接勾選【本地系統帳號】,在重啟SQL Server (MSSQLSERVER)時遇到了下圖的錯誤:
(Figure5:重啟服務報錯)
查看了相關的系統事件日誌,在SQL Server服務無法使用管理員身份啟動 中解決了(禁用掉SQL Server的協議Shared Memory),設定完之後重啟服務SQL Server (MSSQLSERVER)。
而另外一種思路就是把NT AUTHORITY\NETWORKSERVICE加入到Administrators組中,如Figure6所示。注意:這種方式一樣需要重啟SQL Server (MSSQLSERVER)服務。
(Figure6:Administrators組)
下面我們就來測試下建立40GB檔案的效能對比:
--測試即時檔案初始化 CREATE DATABASE [TestFileInit] ON PRIMARY ( NAME = N'TestFileInit', FILENAME = N'F:\DBBackup\TestFileInit.mdf' , SIZE = 41943040KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TestFileInit_log', FILENAME = N'F:\DBBackup\TestFileInit_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO
(Figure7:之前建立時間)
(Figure8:之後建立時間)
注意:禁用即時檔案初始化功能,要想讓這個禁用生效,一樣需要重啟SQL Server (MSSQLSERVER)服務。
五.疑問(Questions)
1. 在安裝SQL Server的時候,如何設定會使得SQL Server服務是以【網路服務】登陸的?
2. 禁用掉SQL Server的協議Shared Memory,這個協議是用來幹嘛的?有什麼作用?
3. 如果把NT AUTHORITY\NETWORKSERVICE加入到Windows組裡面有什麼不安全隱患嘛?
4. 當啟用 TDE 時,即時檔案初始化功能不可用。什麼是TDE?