SQL Server 2016 SP1 + CU8 安装在 Windows Server 2016 标准版上。
有一段时间一切都很好,我能够创建数据库,直到由于某种我不知道的原因,我安装的卷上弹出了权限问题。
Msg 5123, Level 16, State 1, Line 1
CREATE FILE encountered operating system error 5(Access is denied.)
while attempting to open or create the physical file
'D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB\test.mdf'.
Msg 1802, Level 16, State 4, Line 1
CREATE DATABASE failed. Some file names listed could not be created.
Check related errors.
文件夹 D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB 实际上是作为文件夹安装在 D:\MSSQL13.MSSQLSERVER\MSSQL\Data 目录中的卷。
我用谷歌搜索了几个小时,每个链接都在喋喋不休地谈论所有权和 icacls 以及控制权,但这不是这里的问题。我想明确一点,在这个实例上运行 SQL Server 的服务帐户可以完全控制这个挂载的卷以及它上面的内容。
我验证了服务帐户的有效访问权限,它已明确授予完全控制权。
我的怀疑是,它与授予作为卷而不是磁盘安装的文件夹的权限有关。这是因为在我的测试中,我可以在 D:\ 的根目录中创建一个包含其文件的数据库,而不会出现任何问题。D:\ 也是使用相同类型存储的卷。
此外,我自己的用户拥有完全控制权,但是当我尝试创建文件时,我收到此警告。
奇怪的是,我可以毫无困难地向 UserDB 文件夹/卷添加一个文件夹。
如何使这个卷作为 MSSQL 帐户可写的 D:\ 驱动器中的文件夹安装?
由于权限问题,在卷的根目录创建 SQL Server 数据文件是有问题的。我总是建议在卷的根目录上创建一个文件夹,然后将数据文件放在该文件夹中(这也是微软的建议)。在驱动器的根目录设置和验证权限并不总是与在文件夹级别设置权限相同。
将卷安装为字母驱动器时,这意味着您的数据文件永远不会直接进入
D:\
,而是进入D:\SomeFolder\
. 在您的情况下,您使用的挂载点UserDb
是卷的根目录。我建议在您的挂载点内创建一个额外的文件夹:D:\...\Data\UserDb\SomeFolder\
. 然后,设置权限以确保 SQL Server 服务帐户对SomeFolder
目录具有完全控制权。请注意,来自 Microsoft的此指导仍然适用:
还有这个针对数据库文件的更明确的建议:
将文件直接放在挂载点的根目录中意味着您必须直接管理每个文件的权限以确保它们是正确的。在创建新数据库(从备份或模型)的情况下,这可能会出现问题。因此,最好不要将文件放在挂载点或驱动器的根目录中。你可以让它工作,但它不受支持,也不是一个好主意。
请注意,在为 AlwaysOn 数据库播种时,SQL Server 2016 将已安装的驱动器报告为没有足够的空间 - 但如果您继续,则可以正常工作!