我设置了一个多步骤 SQL 作业,基本上是生成事务日志,然后使用 robocopy 复制它们。Robocopy 步骤属于“PowerShell”类型,如下所示:
$src=(Invoke-Sqlcmd -Database 'msdb' -Query "select last_backup_file from log_shipping_monitor_primary where primary_database = 'Dummy'")['last_backup_file']
$command="robocopy"
$arguments=([System.IO.Path]::GetDirectoryName($src)) + " \\server\share " + ([System.IO.Path]::GetFileName($src)) + " /NP"
[System.Diagnostics.Process]::Start($command, $arguments)
此步骤的具体问题是,robocopy 永远不会退出,即使作业运行成功,进程仍保持活动状态。如果从 SQL PowerShell 控制台(或加载了 SQL 管理单元的非 SQL PowerShell 控制台)运行上述相同的代码,它将正确运行,不会留下任何孤立进程。
注意:您可能想知道为什么我通过 Process.Start() 运行 robocopy。这让我想到了第一个问题:当脚本如下所示时(我在上面的脚本之前尝试过),作业执行永远不会停止:
$src=(Invoke-Sqlcmd -Database 'msdb' -Query "select last_backup_file from log_shipping_monitor_primary where primary_database = 'Dummy'")['last_backup_file']
robocopy ([System.IO.Path]::GetDirectoryName($src)) \\server\share ([System.IO.Path]::GetFileName($src)) /NP
注(2):我读过修复 SQL 作业的 robocopy但此问题无关。
答案1
问题很简单,robocopy 需要这个参数:“/R:0”。
真的很奇怪,因为这表明不要重试该操作。但第一次操作成功了。而且,从 PowerShell 控制台来看,它再次正常工作。