将本地SQL Server数据库备份到Azure Blob存储时出现400错误请求
SQL Server备份到Azure Blob存储报400 Bad Request错误排查方案
错误详情
Msg 3271, Level 16, State 1, Line 8
A nonrecoverable I/O error occurred on file
"https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2016.bak:"
Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (400) Bad Request..
Msg 3013, Level 16, State 1, Line 8
BACKUP DATABASE is terminating abnormally.
已执行操作
- 创建凭据:
CREATE CREDENTIAL [testcred] WITH IDENTITY = 'mystorageaccount' ,SECRET = 'storage account key';
- 备份命令:
BACKUP DATABASE AdventureWorks2014 TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2016.bak' WITH CREDENTIAL = 'testcred' ,COMPRESSION ,STATS = 5; GO
已尝试的排查动作
- 切换通用用途存储v1/v2,错误未解决
- 替换为SAS令牌认证,同样报错
- 在SQL Server 2014 Express、2017 Express上测试,结果一致
排查与解决步骤
修正Blob URL格式
从错误信息可见目标URL末尾多了一个冒号:,这是典型的格式错误,会直接触发400请求错误。检查备份命令中的URL是否存在笔误,确保文件名和路径无多余符号,Blob名称不能包含\ / : * ? " < > |等非法字符。验证容器权限与账户凭据
- 若使用存储账户密钥:确认
IDENTITY参数是存储账户的完整名称(无拼写错误),密钥为存储账户的主/辅助密钥完整值,同时确保存储账户拥有Storage Blob Data Contributor权限。 - 若使用SAS令牌:确保令牌包含
w(写入)、c(创建)权限,sr设为b(Blob资源类型),令牌未过期且不包含开头的?符号。 - 容器访问级别:若使用专用容器,必须确保凭据拥有足够的写入权限,避免因权限不足导致的请求拒绝。
- 若使用存储账户密钥:确认
检查SQL Server版本兼容性
- SQL Server 2014 Express需至少升级至SP1 CU2版本才能支持备份到Azure Blob存储,确认已安装最新累积更新。
- SQL Server 2017 Express需安装最新补丁,修复已知的Azure存储兼容性问题。
网络连通性验证
- 在SQL Server所在服务器上,通过浏览器或
curl命令测试访问目标Blob容器的HTTPS端点(端口443),确认网络无防火墙、代理拦截。 - 检查服务器是否能正常解析
*.blob.core.windows.net域名,排除DNS解析问题。
- 在SQL Server所在服务器上,通过浏览器或
存储端功能验证
使用Azure存储资源管理器连接目标存储账户,手动上传测试文件至容器,确认存储账户和容器的写入功能正常,排除存储服务本身的问题。
内容的提问来源于stack exchange,提问作者ibexy
相关产品推荐
相关产品推荐

