备份到 Azure 存储 BLOB 时出现 SQLVDI 错误

SQLVDI error when backing up to Azure Storage BLOB

我是 运行 一个 SQL 2014 年的修补程序,正在尝试将数据库备份到我们的一个 Azure 存储 BLOB,使用:

BACKUP DATABASE [DB]
TO URL = N'https://storage.blob.core.windows.net/server-mssqlserver/DB.bak'
WITH CREDENTIAL = N'AzureCredential'
    ,NOFORMAT
    ,NOINIT
    ,NAME = N'DBA_DB-Full Database Backup'
    ,NOSKIP
    ,NOREWIND
    ,NOUNLOAD
    ,COMPRESSION
    ,STATS = 5
GO

但查询抛出以下错误:

Msg 3292, Level 16, State 9, Line 1
A failure occurred while attempting to execute Backup or Restore with a URL device specified. Consult the Windows Event Log for details.
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

检查服务器的事件日志显示实际错误为:

SQLVDI: Loc=IdentifySQLServer. Desc=MSSQLSERVER. ErrorCode=(5)Access is denied.
. Process=4668. Thread=6596. Client. Instance=MSSQLSERVER. VD=.

我已确保 SQL Server Agent 服务的帐户具有 Create global objects 策略,并且还确保 SQL VSS Writer 服务在 Local System 帐户下 运行。错误不断发生!

我可以做些什么来修复它,或者只记录一些比上面 "SQLVDI: Loc=IdentifySQLServer" 更详细的错误消息?

天哪,这就是其中之一 "no idea how I fixed it"。

在我去吃午饭之前,我可以通过 运行 提供的 T-SQL 可靠地生成有问题的错误,但是当我吃完午饭回来时,BACKUP 命令完成得很好!

我记得更改的主要内容是 在 Azure 端,我在其中创建了一个 SAS(共享访问签名)

对于 SQL 2014,这应该是不需要,因为它使用实际的 Azure 凭据来连接到存储。我实际上为 SQL Server 2016 的一个实例创建了 SAS,我想备份到同一个容器,并且 可能 已经为 [= 打开了容器的访问路径31=] Server 2014 也是!

非常感谢 Sean Gallardy for recommending ProcMon,它显示了比 "ErrorCode=(5)Access is denied" 消息多得多的错误日志信息。