如何通过脚本导出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加密数据库的导出,可通过脚本批量处理数百个数据库。
准备工作
- 确保SQLPackage.exe可用:该工具默认随SSMS或Visual Studio安装,若单独使用,可确认其路径(例如
C:\Program Files\Microsoft SQL Server\160\DAC\bin\SqlPackage.exe),或添加到系统PATH中。 - 获取必要参数:
- 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
相关产品推荐
相关产品推荐

