如何使用PowerShell连接托管SQL数据库并从存储账户恢复备份
完整PowerShell脚本:连接Azure存储并恢复托管SQL数据库
已知参数
servername: demosql.nodesquare.com dbname: testdb sqlusername: adminuser sqlpassword: Abcd123456789 storageaccountname: teststorage01 fileshare: backupshare # 注:原参数中`fileshare`应为文件共享名称,而非备份文件名;备份文件为共享内的abc.bak backupfilename: abc.bak
一、修正Azure存储账户连接与备份文件SAS令牌生成
原脚本存在两个核心问题:
- 未定义
$AzureResourceGroupName、$FileShareName等必要变量,且未正确获取文件共享内的备份文件 - Azure SQL恢复备份需要SAS令牌完成授权,直接使用文件URL无法通过权限校验
修正后的存储操作脚本:
# 定义参数(补充实际资源组名称) $AzureResourceGroupName = "你的资源组名称" $StorageAccountName = "teststorage01" $FileShareName = "backupshare" $BackupFileName = "abc.bak" # 获取存储账户密钥并创建上下文 $storageKeys = Get-AzStorageAccountKey -ResourceGroupName $AzureResourceGroupName -AccountName $StorageAccountName $storageAccountKey = $storageKeys[0].Value $storageContext = New-AzStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $storageAccountKey # 定位目标备份文件 $backupFile = Get-AzStorageFile -ShareName $FileShareName -Path $BackupFileName -Context $storageContext if (-not $backupFile) { Write-Output "未找到指定的备份文件 $BackupFileName" exit 1 } # 生成SAS令牌(有效期1小时,可按需调整) $sasToken = New-AzStorageFileSASToken -ShareName $FileShareName -Path $BackupFileName -Context $storageContext -Permission r -ExpiryTime (Get-Date).AddHours(1) $backupFileWithSAS = "https://$StorageAccountName.file.core.windows.net/$FileShareName/$BackupFileName$sasToken"
二、连接Azure托管SQL并恢复备份
使用SqlServer模块执行恢复操作,首次运行需先安装该模块:
# 安装SqlServer模块(仅首次运行需执行) Install-Module -Name SqlServer -Force -AllowClobber # 定义SQL服务器参数 $SqlServerName = "demosql.nodesquare.com" $SqlDbName = "testdb" $SqlUsername = "adminuser" $SqlPassword = ConvertTo-SecureString "Abcd123456789" -AsPlainText -Force $SqlCredential = New-Object System.Management.Automation.PSCredential ($SqlUsername, $SqlPassword) # 执行数据库恢复命令 $restoreQuery = @" RESTORE DATABASE [$SqlDbName] FROM URL = '$backupFileWithSAS' WITH REPLACE, RECOVERY, STATS = 10 "@ Invoke-SqlCmd -ServerInstance $SqlServerName -Credential $SqlCredential -Query $restoreQuery
注意事项
- 需确保Azure SQL服务器已被允许访问存储账户:可在存储账户防火墙添加SQL服务器公网IP,或启用存储账户的「允许受信任的Microsoft服务访问」选项
- 若恢复时出现文件路径冲突,可在
RESTORE命令中添加MOVE子句指定新的物理文件路径,示例:RESTORE DATABASE [$SqlDbName] FROM URL = '$backupFileWithSAS' WITH REPLACE, RECOVERY, STATS = 10, MOVE 'testdb' TO '/var/opt/mssql/data/testdb.mdf', MOVE 'testdb_log' TO '/var/opt/mssql/data/testdb_log.ldf'
内容的提问来源于stack exchange,提问作者Sheikh Sadique
相关产品推荐
相关产品推荐

