◀常用的备份类型与恢复方案▶
我们知道SQL Server三种常用的备份类型:完整备份、差异备份、日志备份
如下,当我们对数据库进行以下备份计划(数据库必须进行首次非COPY_ONLY的完整备份,才能进行差异或日志备份)
在进行时间点恢复的时候,可以使用如下方式根据要求组合恢复:
- [Full-01] [Log-01] [Log-02]
- [Full-01] [Log-01] [Log-02] [Log-03] [Log-04] [Log-05] [Log-06]
- [Full-01] [Diff-01] [Log-03] [Log-04] [Log-05] [Log-06]
- [Full-01] [Diff-02] [Log-05] [Log-06]
也就是说,恢复的基准是完整备份,日志作为增量备份是独立的。从上面的备份恢复方案可以看出,差异备份(Diff)似乎就有点多余了。
差异备份仅捕获自该次完整备份后发生更改的数据,所以备份的时间相对较少,但必须保留最近的完整备份。对于频繁的完整备份,用差异备份替换可减少了备份的时间、大小。但是增加了备份文件的管理难度,以及恢复的复杂度。如果你的数据库数量少、并且不大,不推荐使用差异备份;如果你的数据库很大,推荐使用差异备份。
同样,如果你多年前已经进行了一次完整备份,如今你可以选择两种备份计划(推荐第一种):
- [完整备份] [日志备份]
- [完整备份COPY_ONLY] [日志备份]
既然日志备份是独立的,在恢复的时候(如恢复到Log-05),我们可以选择的恢复方案如下
- [Full-02] [Log-04] [Log-05]
- [Full-01] [Log-01] [Log-02] [Log-03] [Log-04] [Log-05]
这两种恢复方案的结果是一样的,即使完整备份与日志备份都使用 COPY_ONLY 也一样(COPY_ONLY 使日志无法截断重用)。如果你丢失了中间的一些完整备份,你可以使用较早的完整备份加后续的日志备份来恢复
◀AlwaysOn 可用性组备份设置▶
在 SQL Server AlwaysOn AG 中,备份要求如下:
- 在次要副本上执行 BACKUP DATABASE 时,仅支持数据库、文件或文件组的仅复制完整备份。仅复制备份不会影响日志链,也不会清除差异位图。
- 不支持在次要副本上执行差异备份。
- 当前不支持并发备份,例如,在辅助副本上执行完整数据库备份的同时在主副本上执行事务日志备份。
- BACKUP LOG 仅支持常规日志备份(次要副本上的日志备份不支持 COPY_ONLY 选项)。
- 对于在任何副本(主副本或辅助副本)上进行的日志备份之间,确保一致的日志链,而与其可用性模式(同步提交或异步提交无关)。
- 若要备份辅助数据库,辅助副本必须能够与主副本进行通信,并且状态必须为 SYNCHRONIZED 或 SYNCHRONIZING。
主备副本允许的备份类型:
备份类型 | 主副本 | 辅助副本 |
---|---|---|
完整备份(Full) | 是 | 是(仅COPY_ONLY) |
差异备份(Diff) | 是 | 否 |
日志备份(Log) | 是 | 是(非COPY_ONLY) |
AG备份选项与优先级的关系(3节点示例):
备份选项 | 备份优先级 | 备份说明 |
---|---|---|
首选辅助副本 | Primary = 20Secondary1 = 40Secondary2 = 10 | 首选优先级高的副本Secondary1执行备份;Secondary1关闭则在Secondary2备份;Secondary1与Secondary2关闭则在Primary备份;如果辅助副本优先级相同,则按顺序选择最早添加的副本; |
仅辅助副本 | Primary = 20Secondary1 = 40Secondary2 = 10 | 首选优先级高的副本Secondary1执行备份;Secondary1关闭则在Secondary2备份;Secondary1与Secondary2关闭将不会再备份;如果辅助副本优先级相同,则按顺序选择最早添加的副本; |
主副本 | 无论优先级如何设置,仅在主副本进行备份(主副本可进行差异备份) | |
任意副本 | Primary = 20Secondary1 = 40Secondary2 = 10 | 所有节点中首选优先级高的节点进行备份。如优先级高的副本Secondary1关闭,则在其他优先级高的副本Primary进行备份。 |
- 首选优先级高的副本Secondary1执行备份;
- Secondary1关闭则在Secondary2备份;
- Secondary1与Secondary2关闭则在Primary备份;
- 如果辅助副本优先级相同,则按顺序选择最早添加的副本;
仅辅助副本Primary = 20 Secondary1 = 40 Secondary2 = 10
- 首选优先级高的副本Secondary1执行备份;
- Secondary1关闭则在Secondary2备份;
- Secondary1与Secondary2关闭将不会再备份;
- 如果辅助副本优先级相同,则按顺序选择最早添加的副本;
主副本 无论优先级如何设置,仅在主副本进行备份(主副本可进行差异备份)任意副本Primary = 20 Secondary1 = 40 Secondary2 = 10所有节点中首选优先级高的节点进行备份。如优先级高的副本Secondary1关闭,则在其他优先级高的副本Primary进行备份。
判断当前实例的数据库是否是备份的首选副本,可用系统函数fn_hadr_backup_is_preferred_replica查看。
代码语言:javascript复制SELECT
[master].sys.fn_hadr_is_primary_replica( DB_NAME() ) AS [是否主副本],
[master].sys.fn_hadr_backup_is_preferred_replica( DB_NAME() ) AS [是否备份首选副本]
当然,fn_hadr_backup_is_preferred_replica 是考虑同步提交的情况。如果副本都是异步提交,优先级则被忽略,系统默认首选副本为主副本。如所有副本异步提交并且选择 “仅辅助副本”, 函数 fn_hadr_backup_is_preferred_replica 在主副本与辅助副本的结果都为0。只要备份首选项中含有主副本,那么主副本都为1。
◀AlwaysOn 可用性组备份恢复▶
在AlwaysOn AG 中,你知道各节点备份的关系吗?我这里有3个副本,将按由上至下的顺序进行备份。
Primary | Secondary-01 | Secondary-02 |
---|---|---|
Full-backup | ||
Log-backup-01 | ||
Log-backup-02 | ||
Log-backup-03 |
当我们需要恢复数据库的时候,我们可以将所有的日志用来一起恢复:
[Full-backup] [Log-backup-01] [Log-backup-02] [Log-backup-03]
上面的恢复中是正常的。也就是说,不管在哪个节点备份日志,日志链都是连接的。当在辅助副本进行日志备份的时候,它会通知主副本。主副本获取到一个备份锁,以防止多个副本同时进行备份。辅助副本备份完成后,会告知主副本并发送LSN信息。主副本更新自己的LSN并同步更新其他辅助副本的LSN信息。完成后,主副本释放备份锁,备份完成。这时可允许新的备份操作、也允许副本根据LSN截断日志。因此,一般只在一个节点上备份,如果该节点宕机,在其他点上启用的日志备份计划,尽量将备份保留在公共的共享位置来管理,以维护完整的日志顺序。