我已经设置了Ola Hallengren 的 SQL Server 维护解决方案在过去几年中,我在几台 SQL Express 服务器(2008 到 2012 R2)上都遇到了这个问题。最近,我开始在所有新服务器上遇到网络备份组件问题。我过去曾在几台服务器上使用过这个,所以我知道它可以工作,但现在我不知道是什么阻止了它工作。有趣的是,我不是 DBA,对 SQL 几乎一无所知,这就是我来这里的原因。
问题
大约一年半前,我在一台服务器上设置了一个维护计划。它每晚使用 UNC 路径(和其他几个命令)将数据备份到另一台本地服务器。脚本代码如下:
sqlcmd -E -S SERVER\INSTANCE -d master -Q "EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES', @Directory = '\\techstore1.domain.local\Backups', @BackupType = 'FULL', @Verify = 'Y', @CheckSum = 'Y', @CleanupTime = 14" -b
一段时间以来,它一直运行良好,但大约一个月前停止了工作。我将其设置为本地备份,然后添加了一个字符串以将其复制到远程位置,并在远程服务器上添加了一个脚本来清理旧备份。不是理想的。
我尝试以我自己和超级权限帐户的身份在命令行中运行它。这是我在所有情况下收到的错误:
Msg 50000, Level 16, State 1, Server SERVER\INSTANCE, Procedure DatabaseBackup, Line 384
The directory \\techstore1.domain.local\Backups does not exist.
Msg 50000, Level 16, State 1, Server SERVER\INSTANCE, Procedure DatabaseBackup, Line 611
The documentation is available at http://ola.hallengren.com/sql-server-backup.html.
我做了什么
显然,SQL 认为网络位置不存在,所以我尽我所能检查网络端的所有东西是否正常。我提取了脚本的新副本并重新创建了所有对象和作业。我已检查其他脚本(完整性检查、统计更新等)是否正常工作。我创建了一个脚本,它使用与备份脚本相同的凭据来运行本地备份到目标服务器的 xcopy,因此我拥有正确的共享/NTFS 凭据。该帐户是专门为 SQL 备份创建的域帐户 (AD)。我可以本地备份(使用该帐户),因此我有数据库权限。我可以使用 Windows 资源管理器以备份帐户身份导航到共享。我可以使用备份帐户使用 Windows 资源管理器手动将文件复制到远程位置。
我也在其他几个网络上遇到了同样的问题,这让我转向了 SF。我在 2008 R2 和 2012 域中,所有服务器都是域成员,没有任何相关错误。服务器是 2008 R2 和 2012 R2 标准机器。我觉得 SQL 方面一定发生了一些变化,我无法排除故障,因为这会发生在 3 个不同的网络和几台服务器上。我使用了超级基本命令 - 省略验证和清理 - 但出现了同样的错误。我也利用了 Ola 网站上的示例命令进行测试,结果相同。我已经在带有基本测试数据库的全新 SQL Server 上尝试过,没有成功。我在 Google 上使用了我的黑带好几天,结果非常令人失望(也许我不知道要寻找什么?)。
我希望得到什么
我非常希望有一种在 SQL 命令行中测试与网络共享连接的方法,或者一些可以帮助我实现这一目标的阅读材料。我不介意阅读;我是一名称职的系统管理员,只是在这个问题上不够深入。我已经阅读了 Ola 网站上的所有内容,而且我实际上是逐字逐句地使用示例命令(它们已经工作了几个月!?)。这个周末我会断断续续地研究这个问题,任何人能提供的帮助或指导都将不胜感激。
答案1
我在执行 Ola 脚本时遇到了类似的问题。它在某些服务器上可以工作,但在其他服务器上则不行。我会得到:
"Msg 50000, Level 16, State 1, Procedure DatabaseBackup, Line 395 XXX The directory does not exist."
就我的情况而言,问题在于尽管 SQL Agent 在具有足够权限的域帐户下运行,但 SQL Server 本身却没有。在某些情况下,它作为本地服务运行。
一旦我将 SQL 更改为以具有权限的域帐户身份运行,它就可以正常工作。
我希望这对其他人有用。
答案2
作业以谁的身份运行?它是以有权访问相关共享的域用户身份运行吗?还是以 SA 身份运行?如果以 SA 身份运行,则它以您的 SQL Server 代理帐户身份运行。确保运行作业的用户能够访问相关网络共享。
此外,具体的命令应该是SERVER\INSTANCE
,而不是SERVER\DATABASE
:
sqlcmd -E -S SERVER\INSTANCE -d master -Q "EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES', @Directory = '\\techstore1.domain.local\Backups', @BackupType = 'FULL', @Verify = 'Y', @CheckSum = 'Y', @CleanupTime = 14" -b
(我不思考这会导致您收到错误,但仍然如此。)
答案3
问题已解决。我创建了一个新的网络共享位置,并赋予其非常开放的权限(所有人:完全控制),备份可以运行到该位置。无论问题是什么,它都必须与目标上的 NTFS/Share 权限隔离。我不知道为什么我的几个客户都遇到了同样的问题,但这个修复对所有客户都有效。我基本上重新创建了所有备份位置,并再次共享它们。我们可能永远不知道一开始出了什么问题。
感谢花时间阅读并思考这个问题的每个人。
答案4
以下操作应可修复此问题。将 SQL Server 的用户和 SQL Server 代理设置为两个都将共享和文件夹设置为共享的更改和安全的修改。