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

如何通过脚本导出Azure SQL托管实例的TDE加密数据库至Azure存储

批量导出Azure SQL托管实例中TDE加密数据库到Azure存储的脚本方案

一、先解决PowerShell命令未识别的问题

你遇到的Start-AzSqlInstanceDatabaseExport命令未识别,是因为本地未安装或未更新最新版的Az.Sql模块,执行以下命令修复:

# 安装/更新Az.Sql模块
Install-Module -Name Az.Sql -Force -AllowClobber -Scope CurrentUser
# 导入模块
Import-Module Az.Sql

不过官方更推荐使用SQLPackage工具处理TDE加密数据库的导出,以下是具体批量实现方案。

二、SQLPackage批量导出脚本(推荐)

SQLPackage是微软官方的DAC工具,原生支持TDE加密数据库的导出,可通过脚本批量处理数百个数据库。

准备工作

  1. 确保SQLPackage.exe可用:该工具默认随SSMS或Visual Studio安装,若单独使用,可确认其路径(例如C:\Program Files\Microsoft SQL Server\160\DAC\bin\SqlPackage.exe),或添加到系统PATH中。
  2. 获取必要参数:
    • Azure SQL托管实例名称、资源组名称
    • Azure存储账户名称、Blob容器名称
    • 存储容器的SAS令牌(需具备写入权限,注意不要带开头的?)
    • 托管实例的管理员账号密码,或使用AD集成认证(需运行脚本的账号有数据库权限)

PowerShell批量导出脚本示例

# 配置核心参数
$instanceName = "你的托管实例名称"
$resourceGroupName = "你的资源组名称"
$storageAccountName = "你的存储账户名称"
$containerName = "你的Blob容器名称"
$sasToken = "你的存储容器SAS令牌"
$sqlPackagePath = "C:\Program Files\Microsoft SQL Server\160\DAC\bin\SqlPackage.exe" # 按实际路径调整

# 获取托管实例中所有用户数据库(排除系统库)
$databases = Get-AzSqlInstanceDatabase -ResourceGroupName $resourceGroupName -InstanceName $instanceName | 
             Where-Object { $_.Name -notin @('master', 'model', 'msdb', 'tempdb') }

# 循环导出每个数据库
foreach ($db in $databases) {
    $dbName = $db.Name
    # 构造BACPAC文件的存储URL
    $bacpacUrl = "https://$storageAccountName.blob.core.windows.net/$containerName/$dbName.bacpac?$sasToken"
    # 使用SQL账号认证的连接参数,若用AD集成则替换为/scs参数
    $exportArgs = @(
        "/a:Export",
        "/ssn:$instanceName.database.windows.net",
        "/sdn:$dbName",
        "/su:你的托管实例管理员账号",
        "/sp:你的管理员密码",
        "/tf:$bacpacUrl",
        "/p:Storage=File"
    )

    Write-Host "开始导出数据库: $dbName"
    # 执行导出命令
    & $sqlPackagePath $exportArgs
    # 检查导出是否成功
    if ($LASTEXITCODE -eq 0) {
        Write-Host "数据库 $dbName 导出成功`n"
    } else {
        Write-Host "数据库 $dbName 导出失败,退出码: $LASTEXITCODE`n"
    }
}

关键说明

  • 认证方式:若使用Azure AD集成认证,将上述脚本中的/su和/sp参数替换为/scs:"Server=tcp:$instanceName.database.windows.net,1433;Initial Catalog=$dbName;Authentication=Active Directory Integrated;Encrypt=True"即可。
  • 错误处理:可添加try-catch块捕获异常,或记录日志到文件,便于后续排查失败的数据库。
  • 资源负载:若数据库数量过多,可考虑添加延迟或并行处理(需评估托管实例的资源承受能力,避免影响业务)。

三、PowerShell Start-AzSqlInstanceDatabaseExport批量方案(备选)

若偏好使用Az模块命令,可参考以下批量脚本:

# 配置参数
$instanceName = "你的托管实例名称"
$resourceGroupName = "你的资源组名称"
$storageAccountName = "你的存储账户名称"
$containerName = "你的Blob容器名称"
$sasToken = "你的存储容器SAS令牌"
$adminLogin = "你的管理员账号"
$adminPassword = ConvertTo-SecureString "你的管理员密码" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($adminLogin, $adminPassword)

# 获取用户数据库列表
$databases = Get-AzSqlInstanceDatabase -ResourceGroupName $resourceGroupName -InstanceName $instanceName | 
             Where-Object { $_.Name -notin @('master', 'model', 'msdb', 'tempdb') }

# 循环导出
foreach ($db in $databases) {
    $bacpacUri = "https://$storageAccountName.blob.core.windows.net/$containerName/$($db.Name).bacpac?$sasToken"
    Write-Host "开始导出数据库: $($db.Name)"
    Start-AzSqlInstanceDatabaseExport -ResourceGroupName $resourceGroupName `
                                      -InstanceName $instanceName `
                                      -DatabaseName $db.Name `
                                      -StorageKeyType SharedAccessKey `
                                      -StorageKey $sasToken `
                                      -StorageUri $bacpacUri `
                                      -AdministratorLogin $credential.UserName `
                                      -AdministratorLoginPassword $credential.Password
    Write-Host "提交导出任务: $($db.Name)`n"
}

内容的提问来源于stack exchange,提问作者alper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:18:11