SQL Server备份与恢复 #

一、备份概述 #

1.1 备份类型 #

text
SQL Server备份类型:
├── 完整备份(Full Backup)
│   └── 备份整个数据库
├── 差异备份(Differential Backup)
│   └── 备份自上次完整备份后的变化
├── 事务日志备份(Transaction Log Backup)
│   └── 备份事务日志
├── 尾日志备份(Tail-Log Backup)
│   └── 备份未备份的日志
└── 文件/文件组备份
    └── 备份特定文件或文件组

1.2 恢复模式 #

text
恢复模式:
├── SIMPLE(简单)
│   ├── 不支持日志备份
│   ├── 自动截断日志
│   └── 只能恢复到备份点
├── FULL(完整)
│   ├── 支持日志备份
│   ├── 可恢复到任意时间点
│   └── 需要定期备份日志
└── BULK_LOGGED(大容量日志)
    ├── 大容量操作最小日志
    └── 可恢复但有限制

1.3 设置恢复模式 #

sql
-- 查看恢复模式
SELECT name, recovery_model_desc 
FROM sys.databases;

-- 设置恢复模式
ALTER DATABASE mydb SET RECOVERY SIMPLE;
ALTER DATABASE mydb SET RECOVERY FULL;
ALTER DATABASE mydb SET RECOVERY BULK_LOGGED;

二、完整备份 #

2.1 创建完整备份 #

sql
-- 基本完整备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_full.bak';

-- 带选项的完整备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_full.bak'
WITH 
    FORMAT,              -- 格式化介质
    MEDIANAME = 'mydb_backup',
    NAME = 'mydb_full_backup',
    DESCRIPTION = 'Full backup of mydb',
    COMPRESSION,         -- 压缩备份
    STATS = 10;          -- 每10%显示进度

-- 备份到多个文件
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_full_1.bak',
   DISK = 'D:\Backup\mydb_full_2.bak'
WITH FORMAT;

2.2 查看备份信息 #

sql
-- 查看备份文件信息
RESTORE HEADERONLY FROM DISK = 'D:\Backup\mydb_full.bak';

-- 查看备份文件列表
RESTORE FILELISTONLY FROM DISK = 'D:\Backup\mydb_full.bak';

-- 查看备份标签
RESTORE LABELONLY FROM DISK = 'D:\Backup\mydb_full.bak';

-- 查看备份历史
SELECT 
    database_name,
    backup_start_date,
    backup_finish_date,
    type,
    backup_size
FROM msdb.dbo.backupset
ORDER BY backup_start_date DESC;

三、差异备份 #

3.1 创建差异备份 #

sql
-- 先创建完整备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_full.bak'
WITH FORMAT;

-- 创建差异备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_diff.bak'
WITH DIFFERENTIAL;

-- 带选项的差异备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_diff.bak'
WITH 
    DIFFERENTIAL,
    NAME = 'mydb_differential_backup',
    DESCRIPTION = 'Differential backup',
    COMPRESSION;

3.2 差异备份策略 #

text
差异备份策略:
完整备份(周日)
├── 差异备份(周一)
├── 差异备份(周二)
├── 差异备份(周三)
├── 差异备份(周四)
├── 差异备份(周五)
└── 差异备份(周六)

优点:恢复时只需完整备份+最新差异备份
缺点:差异备份会越来越大

四、事务日志备份 #

4.1 创建日志备份 #

sql
-- 数据库必须是FULL恢复模式
ALTER DATABASE mydb SET RECOVERY FULL;

-- 创建完整备份
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb_full.bak'
WITH FORMAT;

-- 创建日志备份
BACKUP LOG mydb
TO DISK = 'D:\Backup\mydb_log_1.trn';

-- 带选项的日志备份
BACKUP LOG mydb
TO DISK = 'D:\Backup\mydb_log_2.trn'
WITH 
    NAME = 'mydb_log_backup',
    DESCRIPTION = 'Transaction log backup',
    COMPRESSION;

4.2 日志备份策略 #

text
日志备份策略:
完整备份(周日)
├── 日志备份(周一每小时)
├── 日志备份(周二每小时)
├── ...
└── 日志备份(周六每小时)

优点:可恢复到任意时间点
缺点:需要管理多个日志文件

4.3 尾日志备份 #

sql
-- 数据库损坏时备份尾日志
BACKUP LOG mydb
TO DISK = 'D:\Backup\mydb_tail.trn'
WITH NORECOVERY, NO_TRUNCATE;

-- 正常尾日志备份
BACKUP LOG mydb
TO DISK = 'D:\Backup\mydb_tail.trn'
WITH NORECOVERY;

五、恢复数据库 #

5.1 完整恢复 #

sql
-- 恢复完整备份
RESTORE DATABASE mydb
FROM DISK = 'D:\Backup\mydb_full.bak'
WITH 
    MOVE 'mydb' TO 'D:\Data\mydb.mdf',
    MOVE 'mydb_log' TO 'D:\Log\mydb.ldf',
    REPLACE,           -- 替换现有数据库
    RECOVERY;          -- 恢复后可访问

-- 恢复到不同数据库名
RESTORE DATABASE mydb_new
FROM DISK = 'D:\Backup\mydb_full.bak'
WITH 
    MOVE 'mydb' TO 'D:\Data\mydb_new.mdf',
    MOVE 'mydb_log' TO 'D:\Log\mydb_new.ldf';

5.2 差异恢复 #

sql
-- 恢复完整备份(NORECOVERY)
RESTORE DATABASE mydb
FROM DISK = 'D:\Backup\mydb_full.bak'
WITH NORECOVERY;

-- 恢复差异备份
RESTORE DATABASE mydb
FROM DISK = 'D:\Backup\mydb_diff.bak'
WITH RECOVERY;

5.3 时间点恢复 #

sql
-- 恢复完整备份
RESTORE DATABASE mydb
FROM DISK = 'D:\Backup\mydb_full.bak'
WITH NORECOVERY;

-- 恢复日志到指定时间点
RESTORE LOG mydb
FROM DISK = 'D:\Backup\mydb_log_1.trn'
WITH NORECOVERY;

RESTORE LOG mydb
FROM DISK = 'D:\Backup\mydb_log_2.trn'
WITH 
    STOPAT = '2024-01-15 14:30:00',
    RECOVERY;

5.4 恢复到标记 #

sql
-- 在事务中设置标记
BEGIN TRANSACTION UpdateData WITH MARK 'BeforeUpdate';
-- 操作
COMMIT TRANSACTION;

-- 恢复到标记
RESTORE LOG mydb
FROM DISK = 'D:\Backup\mydb_log.trn'
WITH 
    STOPATMARK = 'BeforeUpdate',
    RECOVERY;

六、备份设备 #

6.1 创建备份设备 #

sql
-- 创建永久备份设备
EXEC sp_addumpdevice 'disk', 'mydb_backup', 'D:\Backup\mydb.bak';

-- 使用备份设备
BACKUP DATABASE mydb TO mydb_backup;

-- 查看备份设备
SELECT * FROM sys.backup_devices;

-- 删除备份设备
EXEC sp_dropdevice 'mydb_backup';

6.2 镜像备份 #

sql
-- 镜像备份到多个位置
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb.bak'
MIRROR TO DISK = 'E:\Backup\mydb.bak'
WITH FORMAT;

七、自动化备份 #

7.1 维护计划 #

text
SSMS创建维护计划:
1. 展开 Management → Maintenance Plans
2. 右键 → New Maintenance Plan
3. 添加备份任务
4. 设置计划
5. 配置通知

7.2 SQL Agent作业 #

sql
-- 创建作业
USE msdb;
GO

EXEC sp_add_job 
    @job_name = 'Daily Full Backup';

EXEC sp_add_jobstep
    @job_name = 'Daily Full Backup',
    @step_name = 'Backup mydb',
    @subsystem = 'TSQL',
    @command = 'BACKUP DATABASE mydb TO DISK = ''D:\Backup\mydb.bak'' WITH COMPRESSION';

EXEC sp_add_schedule
    @schedule_name = 'Daily at 2 AM',
    @freq_type = 4,  -- 每天
    @active_start_time = 20000;  -- 02:00:00

EXEC sp_attach_schedule
    @job_name = 'Daily Full Backup',
    @schedule_name = 'Daily at 2 AM';

EXEC sp_add_jobserver
    @job_name = 'Daily Full Backup';

八、备份压缩 #

8.1 启用压缩 #

sql
-- 服务器级别启用压缩
EXEC sp_configure 'backup compression default', 1;
RECONFIGURE;

-- 单次备份压缩
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb.bak'
WITH COMPRESSION;

-- 禁用压缩
BACKUP DATABASE mydb
TO DISK = 'D:\Backup\mydb.bak'
WITH NO_COMPRESSION;

8.2 压缩效果 #

text
压缩效果:
├── 通常可压缩50%-70%
├── 压缩会增加CPU使用
├── 减少I/O时间
└── 减少存储空间

九、最佳实践 #

9.1 备份策略 #

text
备份策略建议:
├── 生产环境使用FULL恢复模式
├── 定期完整备份(每天)
├── 频繁日志备份(每小时)
├── 定期测试恢复
├── 异地存储备份
├── 加密敏感备份
└── 监控备份状态

9.2 恢复策略 #

text
恢复策略建议:
├── 制定恢复计划
├── 定期测试恢复
├── 记录恢复步骤
├── 准备备用服务器
└── 监控恢复时间

十、总结 #

备份恢复要点:

类型 说明 适用场景
完整备份 备份整个数据库 基础备份
差异备份 备份变化 减少备份时间
日志备份 备份事务日志 时间点恢复
尾日志备份 备份未备份日志 灾难恢复

最佳实践:

  1. 选择合适的恢复模式
  2. 制定备份策略
  3. 定期测试恢复
  4. 异地存储备份
  5. 监控备份状态

下一步,让我们学习性能优化!

最后更新:2026-03-27