| 類型 | 頻率 | 保留 | 文件命名 | 目的 |
|---|---|---|---|---|
| 全量備份 | 每週日 01:00 | 2 份輪換 (A/B) | test_full_A.bak / test_full_B.bak | 基線恢復點,雙副本防介質損壞 |
| 差異備份 | 每日 01:00 (除週日) | 2 份輪換 (A/B) 追加 | test_df_A.bak / test_df_B.bak | 縮短 RTO,僅需「最近全量 + 最新差異」 |
| 日誌備份 | 每小時 | 2 份輪換 (A/B) 追加 | test_log_A.bak / test_log_B.bak | RPO ≤ 1 小時,支持任意時間點恢復 |
恢復模式必須為 FULL:ALTER DATABASE Test SET RECOVERY FULL;
-- ========== 1. 全量備份作業 ==========
EXEC msdb.dbo.sp_add_job
@job_name = N'DB_Backup_Full',
@enabled = 1,
@description = N'每週日 01:00 全量備份雙副本',
@category_name = N'Database Maintenance';
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Full',
@step_name = N'Full_A',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [Test] TO DISK = N''E:\Backup\test_full_A.bak'' WITH INIT, COMPRESSION, CHECKSUM, STATS = 10;',
@on_success_action = 3, @on_fail_action = 3,
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Full',
@step_name = N'Full_B',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [Test] TO DISK = N''E:\Backup\test_full_B.bak'' WITH INIT, COMPRESSION, CHECKSUM, STATS = 10;',
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobschedule
@job_name = N'DB_Backup_Full',
@name = N'Weekly_Sunday_0100',
@freq_type = 8, -- Weekly
@freq_interval = 1, -- Sunday
@freq_recurrence_factor = 1,
@active_start_time = 10000; -- 01:00
GO
-- ========== 2. 差異備份作業 ==========
EXEC msdb.dbo.sp_add_job
@job_name = N'DB_Backup_Diff',
@enabled = 1,
@description = N'每日 01:00 差異備份雙副本 (追加)',
@category_name = N'Database Maintenance';
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Diff',
@step_name = N'Diff_A',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [Test] TO DISK = N''E:\Backup\test_df_A.bak'' WITH DIFFERENTIAL, NOINIT, CHECKSUM, STATS = 10;',
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Diff',
@step_name = N'Diff_B',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [Test] TO DISK = N''E:\Backup\test_df_B.bak'' WITH DIFFERENTIAL, NOINIT, CHECKSUM, STATS = 10;',
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobschedule
@job_name = N'DB_Backup_Diff',
@name = N'Daily_Except_Sunday_0100',
@freq_type = 4, -- Daily
@freq_interval = 1,
@freq_recurrence_factor = 1,
@active_start_time = 10000;
GO
-- 注意:需手工刪除週日排程或在步驟首行加判斷跳過
-- ========== 3. 事務日誌備份作業 ==========
EXEC msdb.dbo.sp_add_job
@job_name = N'DB_Backup_Log',
@enabled = 1,
@description = N'每小時事務日誌備份雙副本 (追加)',
@category_name = N'Database Maintenance';
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Log',
@step_name = N'Log_A',
@subsystem = N'TSQL',
@command = N'BACKUP LOG [Test] TO DISK = N''E:\Backup\test_log_A.bak'' WITH NOINIT, CHECKSUM, STATS = 10;',
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'DB_Backup_Log',
@step_name = N'Log_B',
@subsystem = N'TSQL',
@command = N'BACKUP LOG [Test] TO DISK = N''E:\Backup\test_log_B.bak'' WITH NOINIT, CHECKSUM, STATS = 10;',
@retry_attempts = 3, @retry_interval = 5;
GO
EXEC msdb.dbo.sp_add_jobschedule
@job_name = N'DB_Backup_Log',
@name = N'Hourly_Every_60min',
@freq_type = 4, -- Daily
@freq_interval = 1,
@freq_subday_type = 8, -- Hours
@freq_subday_interval = 1,
@active_start_time = 0,
@active_end_time = 235959;
GO
INIT:覆蓋文件 (全量備份雙副本各自獨立文件)。NOINIT:追加到文件尾 (差異/日誌雙副本各自形成備份集鏈)。COMPRESSION:SQL 2008+ 支持,2000 需第三方工具 (如 LiteSpeed/Red Gate) 或腳本壓縮。CHECKSUM:啟用頁面校驗和,防止寫入損壞頁。STATS = 10:每 10% 進度向錯誤日誌/作業歷史輸出進度,便於監控。RESTORE VERIFYONLY FROM DISK = '...' 抽樣驗證。RESTORE HEADERONLY 解析備份集 LSN 鏈,確保無斷點。