添加凭据参数后SSMS中运行SQL Server从Azure Blob还原语句报错如何解决
问题原因
你参考的教程适用于本地SQL Server或Azure虚拟机部署的SQL Server,而你当前使用的是Azure SQL托管实例,二者的RESTORE语法规则存在差异:托管实例不支持在RESTORE语句中显式指定CREDENTIAL参数,会直接匹配与Blob容器路径同名的专用SAS凭据完成鉴权。
解决步骤
- 先删除你之前创建的自定义名称凭据
Credential_BLOB - 进入Azure存储账户对应容器的配置页,生成共享访问签名(SAS):
- 权限勾选「读取、列出」
- 过期时间设置为晚于你预计完成还原的时间
- 生成后复制SAS令牌,去掉开头的
?符号备用
- 执行以下语句创建托管实例专用凭据,注意凭据名称必须和容器的完整URL完全一致:
CREATE CREDENTIAL [https://<存储账户名>.blob.core.windows.net/<容器名>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<去掉?前缀的SAS令牌>';
- 去掉
WITH CREDENTIAL参数,直接执行还原语句即可:
RESTORE DATABASE Database_Name FROM URL = 'https://<存储账户名>.blob.core.windows.net/<容器名>/SampleDatabase.bak' -- 如有需要可补充其他参数,示例: -- MOVE '逻辑数据文件名' TO '/var/opt/mssql/data/你的库名.mdf', -- MOVE '逻辑日志文件名' TO '/var/opt/mssql/data/你的库名.ldf', REPLACE, STATS = 5;
注意事项
- 凭据名称必须和容器完整URL完全匹配,多余的斜杠、大小写不一致都会导致鉴权失败
- 请生成容器层级的SAS,不要使用存储账户层级的SAS,避免权限过大
- 如仍报错,优先检查SAS是否过期、存储账户防火墙是否放行了托管实例的出站访问权限
内容的提问来源于stack exchange,提问作者Richard Rodjues
相关产品推荐
相关产品推荐

