You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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令牌生成

原脚本存在两个核心问题:

  1. 未定义$AzureResourceGroupName、$FileShareName等必要变量,且未正确获取文件共享内的备份文件
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:26:26