如何每日自动从Azure存储恢复.bacpac备份至Azure SQL数据库?
实现自动从BACPAC恢复Azure SQL数据库的方案
一、整体实现流程
核心思路是通过Azure存储账户事件触发ADF/Synapse管道,在BACPAC文件上传完成后自动执行恢复操作,具体步骤如下:
- 配置存储账户事件订阅,当容器内新增
.bacpac文件时触发ADF/Synapse管道 - 管道中执行BACPAC导入逻辑,将文件恢复为Azure SQL数据库
1. 存储账户事件触发配置
- 进入目标存储账户的「事件」页面,创建新订阅
- 事件类型选择「Blob 创建完成」,添加筛选条件限定后缀为
.bacpac的文件 - 终点选择你的ADF/Synapse管道,配置触发参数(如传递Blob的URL和名称)
2. 管道核心操作实现
ADF/Synapse管道支持两种导入方式:
- 使用Azure SQL Database导入导出活动:可视化配置存储账户、目标数据库等参数,无需手写脚本
- 使用Execute SQL活动:执行T-SQL命令实现导入,灵活性更高
二、ADF/Synapse可用的T-SQL导入脚本
Azure SQL数据库不支持RESTORE DATABASE命令,替代方案是使用CREATE DATABASE ... FROM BACPAC完成导入,示例脚本如下:
CREATE DATABASE [TargetDBName] FROM BACPAC = 'https://yourstorageaccount.blob.core.windows.net/yourcontainer/yourfile.bacpac' WITH CREDENTIAL = 'StorageAccountCredential', -- 需提前创建存储账户凭据 EDITION = 'GeneralPurpose', -- 按需选择数据库版本(如Basic、Standard) SERVICE_OBJECTIVE = 'GP_Gen5_2', -- 按需选择服务目标(如S0、GP_Gen5_4) MAXSIZE = 1024 GB; -- 按需设置数据库最大容量
关键前置操作
需在Azure SQL服务器上提前创建存储账户凭据:
CREATE CREDENTIAL [StorageAccountCredential] WITH IDENTITY = 'yourstorageaccountname', SECRET = 'yourstorageaccountaccesskey';
额外说明
- 如果目标数据库已存在,需先删除/重命名,或使用
ALTER DATABASE ... IMPORT BACPAC命令(仅支持Azure SQL v12及以上版本) - 确保Azure SQL服务器的防火墙规则允许访问存储账户,或配置存储账户服务端点
三、弹性池的兼容性
完全可以使用弹性池,只需在T-SQL脚本中指定弹性池名称即可,示例:
CREATE DATABASE [TargetDBName] FROM BACPAC = 'https://yourstorageaccount.blob.core.windows.net/yourcontainer/yourfile.bacpac' WITH CREDENTIAL = 'StorageAccountCredential', EDITION = 'GeneralPurpose', SERVICE_OBJECTIVE = 'GP_Gen5_2', MAXSIZE = 1024 GB, ELASTIC_POOL_NAME = 'YourElasticPoolName'; -- 指定目标弹性池
执行完成后,目标数据库会自动加入指定的弹性池,后续可通过弹性池统一管理资源分配。
优化建议
- 在管道中添加文件完整性检查步骤(如验证文件哈希值),避免导入损坏的BACPAC文件
- 配置ADF/Synapse警报规则,在导入失败时触发通知
- 若备份文件名称带日期等规律标识,可使用管道参数动态获取文件名,提升灵活性
内容的提问来源于stack exchange,提问作者SOUser
相关产品推荐
相关产品推荐

