創建/恢復 mdf/ldf 到非預設文件位置,拒絕訪問
預設文件夾是典型的 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA。但是伺服器上的 C: 驅動器幾乎已滿。
因此,在從另一台伺服器恢復 11gb 數據庫時,我決定在同一台伺服器上使用 L: 驅動器。
試圖恢復到 L:\SQL\Data(我創建的文件夾)。拒絕訪問。
稍後快速Google搜尋,我看到 SQL Server 服務是由 NT SERVICE\MSSQLSERVER 啟動的,所以我將 MSSQLSERVER 設置為 L:\SQL\Data 文件夾的所有者,並授予它對該文件夾的完全權限。
再次嘗試恢復。拒絕訪問。
嗯。嘗試在同一位置創建新數據庫。拒絕訪問。
在預設文件夾中創建新數據庫,分離,將 mdf/ldf 移動到 L:\SQL\Data,確保所有文件夾和文件權限和所有權都設置為 MSSQLSERVER,然後使用 CREATE DATABASE … FOR ATTACH 附加。以只讀模式創建的數據庫。
嘗試更改為讀/寫模式。拒絕訪問。
在 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL 中創建一個文件夾 datax 並為其提供適當的權限/所有權。在那裡創建一個新數據庫。有效!
移回一個文件夾並在 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER 中創建一個文件夾 data 並為其授予適當的權限/所有權。在那裡創建一個新數據庫。拒絕訪問。
創建一個文件夾 C:\temp\data 並為其授予適當的權限/所有權。拒絕訪問。
SQL Server 服務已重新啟動。伺服器已重新啟動。結果相同。
xp_cmsshell 的最後一點可能有點分散注意力……
所以…嘗試了 EXEC xp_cmdshell ‘md l:\data’; 返回的消息是:“在執行 xp_cmdshell 期間發生錯誤。對 ‘CreatePipe’ 的呼叫失敗,錯誤程式碼為:‘5’。”
更改了 L: 根目錄的權限,再次嘗試,結果相同。
EXEC xp_cmdshell ‘dir c:.’; 結果相同。
執行 xp_cmdshell ‘whoami /all’; 結果相同。
無論如何,底線是,我在這裡讀到的關於在恢復/創建數據庫時獲得“拒絕訪問”的所有內容都是因為文件夾權限。但最好我能說的是,這些都是正確的。我什至嘗試了繼承權限與顯式權限的一些差異。
我遇到的幾個連結表明,將數據/日誌文件放在我想要的任何地方沒有固有的限制,即在預設位置之外。
我沒有嘗試更改 SQL Server 服務的服務帳戶,因為我在此伺服器上沒有那種級別的自由。
此外,這來自本地電腦上和直接在伺服器上的 SSMS,並且始終在域管理員的上下文中連接。
我想我要做的第一件事是確保在正確的帳戶上設置了權限。執行:select servicename, service_account from sys.dm_server_services 獲取需要設置權限的賬號。
由於我從未設法處理 GUI 以正確設置文件/文件夾權限,因此我使用 ICALCS.EXE,下面的範例將文件權限設置為名為 B 的實例的虛擬服務帳戶:
icacls R:\SqlData\a\x.mdf /setowner MSSQL$A icacls R:\SqlData\a\x.mdf /grant MSSQL$A:F icacls R:\SqlData\a\x_log.ldf /setowner MSSQL$A icacls R:\SqlData\a\x_log.ldf /grant MSSQL$A:F