如何确保在 SQL Server 启动之前,Windows Server 系统启动时目录就存在?
我在 Azure VM 上的 Windows Server 2019 上运行 SQL Server 2017。我想将我的 tempdb 存储在本地 SSD D:\ 驱动器(“临时存储”)上(如建议的那样这里) 下的目录D:\SQL_Data_Root
。为了能够以在 VM 被释放并重新分配到不同的物理主机上时继续存在的方式执行此操作,我需要D:\SQL_Data_Root
在启动 SQL Server 之前让系统检查以确保目录存在,如果不存在则创建目录。
因此,我尝试创建一些东西,在系统启动时执行以下操作:
D:\SQL_Data_Root\
如果尚不存在则创建- 然后启动 SQL Server
这篇 Microsoft 文章建议通过将 SQL Server Windows 服务更改为手动启动来实现此目的,而不是使用系统启动时由 Windows 任务计划程序运行的 Powershell 脚本来启动它。我已经这样做了,方法是:
- 把他们那里的脚本拿来,修复网页上文本中的花括号,然后把它放在
C:\sysadmin\sql-startup.ps1
- 跑步
Set-ExecutionPolicy RemoteSigned
- 创建一个 Windows 任务计划程序任务,
powershell
使用参数运行程序-file 'C:\sysadmin\sql-startup.ps1'
,在系统启动时触发
这是我的脚本文本的精确副本:
$SQLService="SQL Server (MSSQLSERVER)"
$SQLAgentService="SQL Server Agent (MSSQLSERVER)"
$tempfolder="D:\SQL_Data_Root"
if (!(test-path -path $tempfolder)) {
New-Item -ItemType directory -Path $tempfolder
}
Start-Service $SQLService
# For some reason, the Agent won't start if you run it right away
Start-Sleep -Seconds 30
Start-Service $SQLAgentService
它不起作用。当我在客户操作系统级别重新启动计算机时(目录D:\SQL_Data_Root
已经存在),SQL Server 服务启动,但 SQL Server Agent 服务没有启动。当我在 Azure 门户级别停止并启动 VM 时,目录D:\SQL_Data_Root
没有创建,SQL Server 和 SQL Server Agent 服务都没有启动。
查看任务计划程序中任务的历史记录,我可以看到它正在运行,并且它似乎执行了我的代码,因为它运行需要 30 多秒的时间(因此看起来它正在达到并尊重这一点Start-Sleep
)。“上次运行结果”是0xFFFD0000
,我不知道如何解释。
我尝试过以我的用户帐户(具有本地管理员权限)和本地系统帐户运行任务,并启用“以最高权限运行”。似乎在这两种情况下都有相同的行为。
如果我从任务计划程序手动运行该任务,它似乎也不起作用。在这种情况下,它甚至似乎没有执行sleep
,因为它在一秒钟内就完成了。
我还尝试Start-Sleep -seconds 30
在脚本的开头放置另一个,以防它由于仍在出现的其他依赖项而失败,但这似乎没有影响。
我也尝试过这样做:
Start-Service $SQLService -PassThru | Format-List >> C:\sysadmin\sql-server-startup.log
日志文件没有出现。这让我认为某个地方存在权限问题。
因此我尝试创建一个新的本地用户,将其添加到管理员,授予其“作为服务登录”权限,并以该用户身份运行任务。仍然没有奏效:目录和日志文件都没有创建。
如果我只是登录到正在运行的系统并以管理员身份打开 PowerShell 提示符并运行powershell -file 'C:\sysadmin\sql-startup.ps1'
,它就会起作用:如果目录不存在,则会创建目录,并且 SQL Server 和 SQL Server Agent 服务都会启动。如果我只是从服务控制面板中手动启动它们,这些服务也会正常启动。
有人知道可能出了什么问题,以及如何让它工作吗?“在系统启动时创建目录”似乎并不是一件复杂的事情;这肯定是可行的吧?