我认为我正在遵循Microsoft的文档将SQL数据库备份到Azure Blob存储;但是,无论尝试如何,我都会遇到相同的错误。
例如,以下代码创建SQL凭据并尝试备份数据库。
在运行它时,错误指出我不能使用WITH CREDENTIAL和SAS,但是Microsoft演示了直接在它们的文档中使用它们(https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/sql-server-backup-to-url?view=sql-server-2017#Examples)!
declare @databaseName varchar(50)
declare @destinationAzureStorageContainerPath varchar(256)
declare @destinationBlobPath varchar(256)
declare @timestampUtc as nvarchar(30)
select @timestampUtc = replace(convert(nvarchar(30), getutcdate(), 126), ':', '_');
set @databaseName = 'DWConfiguration'
set @destinationAzureStorageContainerPath = 'https://mystorageaccount.blob.core.windows.net/mystoragecontainer/'
SET @destinationBlobPath = @destinationAzureStorageContainerPath + @databaseName + '_' + @timestampUtc + '.BAK'
if not exists
(select * from sys.credentials
where name = 'https://mystorageaccount.blob.core.windows.net/mystoragecontainer/')
create CREDENTIAL [https://mystorageaccount.blob.core.windows.net/mystoragecontainer/]
with IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv... this is my token ...';
backup DATABASE @databaseName
to URL = @destinationBlobPath
with CREDENTIAL = 'https://mystorageaccount.blob.core.windows.net/mystoragecontainer/'
,COMPRESSION
,STATS = 5
错误:
3225级1州第28行的消息 使用WITH CREDENTIAL语法对包含共享访问签名的凭据无效。 Msg 3013,第16级,状态1,第28行 BACKUP DATABASE异常终止。
作为一种替代方法,我决定使用PowerShell。
Backup-SqlDatabase -ServerInstance "myserver" -Database "DWConfiguration" -BackupFile "https://mystorageaccount.blob.core.windows.net/mystoragecontainer/mydatabase_2019-01-04T20_01_03.127.bak" -SqlCredential "https://mystorageaccount.blob.core.windows.net/mystoragecontainer/"
如您所见,它会导致同样令人讨厌的错误!
Backup-SqlDatabase:System.Data.SqlClient.SqlError:使用WITH CREDENTIAL语法对凭据无效 包含共享访问签名。
在Blob本身上,我设置为“私人(无匿名访问)”。我只希望经过身份验证的请求能够访问Blob。这可能是问题吗?如果是这样,为什么WITH CREDENTIAL
不能解决这个问题?
如何简单地将SQL数据库的备份保存到我的Azure存储帐户中?
答案 0 :(得分:1)
我认为您在sql脚本中犯了一个错误。
您创建的凭据为“使用共享访问签名”,但是在备份时,您使用的“至使用存储帐户标识和访问密钥的URL”与之前创建的sas不匹配。
我在我旁边进行了测试,并且工作正常(创建凭据“使用共享访问签名”,并使用“使用共享访问签名的URL进行备份”。)
IF NOT EXISTS (SELECT * FROM sys.credentials
WHERE name = 'https://xxx.blob.core.windows.net/container')
CREATE CREDENTIAL [https://xxx.blob.core.windows.net/container]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=xxx';
BACKUP DATABASE MyTest
TO URL = 'https://xxx.blob.core.windows.net/container/123.bak'
GO
测试结果如下: