如何将所有非系统SQL数据库备份至Azure Blob容器
批量备份非系统数据库到Azure Blob容器
要实现批量备份所有用户数据库并排除系统库,你可以通过**动态SQL结合系统视图sys.databases**遍历目标数据库,自动生成并执行备份命令。以下是修改后的完整脚本:
DECLARE @filename varchar(500) DECLARE @dbname varchar(500) DECLARE @url varchar(500) DECLARE @subfolder varchar(500) DECLARE @date nvarchar(256) DECLARE @backupCmd nvarchar(1000) -- 生成格式化日期字符串(规避特殊字符) SET @date = REPLACE(REPLACE(CONVERT(nvarchar(256), GETDATE(), 120),':','-'),' ', '-'); -- 设置Azure Blob容器基础URL SET @url = 'https://storageaccountname.blob.core.windows.net/sql-migration-data/' -- 声明游标遍历所有非系统数据库 DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') -- 排除系统数据库 AND state_desc = 'ONLINE' -- 仅备份在线数据库 AND is_read_only = 0; -- 可选:排除只读数据库,按需调整 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @dbname WHILE @@FETCH_STATUS = 0 BEGIN -- 按数据库名构建子文件夹路径 SET @subfolder = @dbname + '/' -- 拼接完整备份文件URL SET @filename = @url + @subfolder + @dbname + '_diff_' + @date + '.bak' -- 动态生成备份命令 SET @backupCmd = N'BACKUP DATABASE [' + @dbname + N'] TO URL = ''' + @filename + N''' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N''' + @dbname + N'-Differential Database Backup'', NOSKIP, NOREWIND, NOUNLOAD, STATS = 10' -- 执行备份命令 EXEC sp_executesql @backupCmd FETCH NEXT FROM db_cursor INTO @dbname END -- 关闭并释放游标 CLOSE db_cursor DEALLOCATE db_cursor GO
关键说明:
- 数据库筛选逻辑:通过
sys.databases视图精准排除系统库,同时仅选择在线、非只读的数据库,保证备份的有效性。 - 动态SQL执行:用
sp_executesql执行动态生成的备份命令,无需硬编码每个数据库名。 - 路径结构化:按数据库名创建独立子文件夹,让备份文件分类存储,便于后续查找和管理。
注意事项:
- 确保SQL Server实例已配置Azure Blob备份权限(需存储账户的SAS密钥或托管身份授权)。
- 差异备份依赖对应数据库的完整备份,执行前需确认目标数据库已有完整备份基础。
- 可根据需求调整备份参数(如改为完整备份、添加
COMPRESSION选项等)。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

