计划名称: DailyBackupPlan
说明: 每日数据库备份计划
所有者: sa 或指定账户
步骤3:设置计划任务
从左侧工具箱拖动"备份数据库任务"到设计区
双击任务进行配置:
USE msdb;
GO
-- 1. 创建每日备份计划
EXEC dbo.sp_add_job
@job_name = N'DailyDatabaseBackup',
@enabled = 1,
@description = N'每日自动备份数据库';
GO
-- 2. 添加作业步骤
EXEC sp_add_jobstep
@job_name = N'DailyDatabaseBackup',
@step_name = N'FullBackup',
@subsystem = N'TSQL',
@command = N'
-- 备份所有用户数据库
DECLARE @dbname NVARCHAR(100)
DECLARE @path NVARCHAR(500)
DECLARE @filename NVARCHAR(500)
DECLARE @datetime VARCHAR(20)
SET @datetime = CONVERT(VARCHAR(20), GETDATE(), 112) + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 108), '':'', '''')
SET @path = ''E:\SQLBackup\'' -- 修改为你的备份路径
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE name NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
AND state = 0 -- 只备份在线数据库
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @filename = @path + @dbname + ''_'' + @datetime + ''.bak''
BACKUP DATABASE @dbname
TO DISK = @filename
WITH COMPRESSION, -- 启用压缩
STATS = 10,
CHECKSUM;
FETCH NEXT FROM db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor',
@retry_attempts = 3,
@retry_interval = 5;
GO
-- 3. 创建计划
EXEC sp_add_schedule
@schedule_name = N'Daily_2AM',
@freq_type = 4, -- 每天
@freq_interval = 1,
@active_start_time = 020000; -- 凌晨2点
GO
-- 4. 将计划附加到作业
EXEC sp_attach_schedule
@job_name = N'DailyDatabaseBackup',
@schedule_name = N'Daily_2AM';
GO
-- 5. 启动作业
EXEC sp_add_jobserver
@job_name = N'DailyDatabaseBackup';
GO
目标: 磁盘
备份文件位置:
- 单个文件: D:\Backup\DBName.bak
- 多个文件: D:\Backup\DBName_01.bak, D:\Backup\DBName_02.bak
- 按数据库名称和日期: D:\Backup\$(ESCAPE_SQUOTE(DATE))_$(ESCAPE_SQUOTE(DBN)).bak
3. 备份选项配置
-- 推荐的备份选项
WITH
COMPRESSION, -- 压缩备份(SQL Server 2008+)
CHECKSUM, -- 验证页校验和
STATS = 10, -- 每完成10%显示进度
INIT, -- 覆盖现有文件
MAXTRANSFERSIZE = 4194304, -- 4MB传输大小
BUFFERCOUNT = 50 -- 缓冲区数量
USE msdb;
GO
-- 创建包含备份和清理的作业
EXEC dbo.sp_add_job
@job_name = N'DB_Maintenance_Full',
@enabled = 1,
@description = N'完整数据库维护:备份+清理旧文件';
GO
-- 步骤1:完整备份
EXEC sp_add_jobstep
@job_name = N'DB_Maintenance_Full',
@step_name = N'FullBackup',
@subsystem = N'TSQL',
@command = N'
DECLARE @BackupPath NVARCHAR(500) = N''E:\SQLBackup\Full\'';
-- 创建备份文件夹(如果不存在)
EXEC master.dbo.xp_create_subdir @BackupPath;
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = COALESCE(@SQL + CHAR(13) + CHAR(10), N'''') +
N''BACKUP DATABASE ['' + name + '']
TO DISK = N'''''' + @BackupPath + name + ''_'' +
REPLACE(CONVERT(VARCHAR(20), GETDATE(), 120), '':'', '''') + ''.bak''''
WITH COMPRESSION, CHECKSUM, STATS = 10;''
FROM sys.databases
WHERE name NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
AND state_desc = ''ONLINE'';
EXEC sp_executesql @SQL;',
@retry_attempts = 2;
GO
-- 步骤2:清理旧备份文件(保留7天)
EXEC sp_add_jobstep
@job_name = N'DB_Maintenance_Full',
@step_name = N'CleanupOldBackups',
@subsystem = N'TSQL',
@command = N'
DECLARE @BackupPath NVARCHAR(500) = N''E:\SQLBackup\Full\'';
DECLARE @RetentionDays INT = 7;
DECLARE @DeleteDate VARCHAR(10) = CONVERT(VARCHAR(10), DATEADD(DAY, -@RetentionDays, GETDATE()), 120);
-- 使用xp_delete_file扩展存储过程删除旧文件
EXEC master.dbo.xp_delete_file
0, -- 文件类型:0=备份文件
@BackupPath,
N''bak'', -- 文件扩展名
@DeleteDate,
1; -- 子目录:1=包含子目录',
@retry_attempts = 2;
GO
-- 步骤3:验证备份
EXEC sp_add_jobstep
@job_name = N'DB_Maintenance_Full',
@step_name = N'VerifyBackup',
@subsystem = N'TSQL',
@command = N'
-- 验证最新的备份文件
DECLARE @BackupPath NVARCHAR(500) = N''E:\SQLBackup\Full\'';
DECLARE @VerifySQL NVARCHAR(MAX);
SELECT @VerifySQL = COALESCE(@VerifySQL + CHAR(13) + CHAR(10), N'''') +
N''RESTORE VERIFYONLY FROM DISK = N'''''' + @BackupPath + name + ''_'' +
REPLACE(CONVERT(VARCHAR(20), GETDATE(), 120), '':'', '''') + ''.bak'''';''
FROM sys.databases
WHERE name NOT IN (''master'', ''model'', ''msdb'', ''tempdb'');
EXEC sp_executesql @VerifySQL;';
GO
-- 创建每日凌晨2点执行的计划
EXEC sp_add_schedule
@schedule_name = N'Daily_2AM_Schedule',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 020000,
@active_end_time = 235959;
GO
EXEC sp_attach_schedule
@job_name = N'DB_Maintenance_Full',
@schedule_name = N'Daily_2AM_Schedule';
GO
EXEC sp_add_jobserver
@job_name = N'DB_Maintenance_Full';
GO
-- 查看作业执行历史
SELECT
j.name AS JobName,
h.run_date,
h.run_time,
CASE h.run_status
WHEN 0 THEN '失败'
WHEN 1 THEN '成功'
WHEN 2 THEN '重试'
WHEN 3 THEN '取消'
WHEN 4 THEN '正在执行'
END AS Status,
h.message
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.name LIKE '%Backup%'
ORDER BY h.run_date DESC, h.run_time DESC;
-- 查看备份历史记录
SELECT
database_name,
backup_start_date,
backup_finish_date,
type, -- D=完整, I=差异, L=日志
backup_size / 1024 / 1024 AS BackupSizeMB,
physical_device_name
FROM msdb.dbo.backupset bs
INNER JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
ORDER BY backup_start_date DESC;
-- 监控备份目录磁盘空间
EXEC master.dbo.xp_fixeddrives;
备份策略:
存储管理:
验证机制:
安全配置:
性能优化:
SQL Server代理未运行:
# PowerShell启动服务
Start-Service SQLSERVERAGENT
权限不足:
磁盘空间不足:
备份失败:
-- 查看具体错误信息
SELECT * FROM msdb.dbo.sysjobhistory
WHERE run_status = 0
ORDER BY run_date DESC;
创建完整的维护解决方案:
-- 创建所有维护作业的主控程序
CREATE PROCEDURE dbo.SetupDatabaseMaintenance
AS
BEGIN
SET NOCOUNT ON;
-- 1. 检查并创建备份目录
DECLARE @BackupPath NVARCHAR(500) = 'E:\SQLBackup\';
IF NOT EXISTS (SELECT * FROM sys.dm_os_file_exists(@BackupPath))
BEGIN
EXEC master.dbo.xp_create_subdir @BackupPath;
EXEC master.dbo.xp_create_subdir @BackupPath + 'Full\';
EXEC master.dbo.xp_create_subdir @BackupPath + 'Diff\';
EXEC master.dbo.xp_create_subdir @BackupPath + 'Log\';
END
-- 2. 设置备份计划(调用前面创建的脚本)
-- ... 执行前面的创建脚本
END
GO
这样你就拥有了一个完整的SQL Server自动备份解决方案,可以根据实际需求调整备份频率、保留策略和存储位置。