Oracle 备份与高可用
Oracle 生产环境高可用和恢复能力非常成熟,常见关键词是 RMAN、归档日志、Data Guard、RAC。
RMAN
RMAN 是 Oracle 官方备份恢复工具。
rman target /
backup database plus archivelog;RMAN 能做:
- 全库备份。
- 增量备份。
- 归档日志备份。
- 块级恢复。
- 校验备份可用性。
归档日志
归档日志保存 redo log 切换后的历史日志,用于介质恢复和时间点恢复。
flowchart TD
A["Redo Log"] --> B["日志切换"]
B --> C["Archived Log"]
C --> D["恢复到指定时间点"]如果不开归档模式,恢复能力会弱很多。
Data Guard
Data Guard 用于主备复制和容灾。
sequenceDiagram
participant P as Primary
participant R as Redo
participant S as Standby
P->>R: 生成 redo
R->>S: 传输 redo
S->>S: 应用 redoStandby 可以用于容灾切换,某些模式下也可做只读查询。
RAC
RAC 是 Real Application Clusters,多实例访问同一个数据库存储,用于提升可用性和横向能力。但 RAC 复杂度高,对存储、网络和应用设计都有要求。
零基础先理解:备份不是复制一份文件
Oracle 是持续写入的数据库。业务提交时会修改数据块、产生 redo、推进 SCN。如果你直接在操作系统层复制数据文件,复制过程中不同文件可能处于不同时间点,恢复时就可能不一致。
Oracle 备份恢复真正要解决的是:
- 数据文件丢了能恢复。
- 磁盘坏了能恢复。
- 人误删数据能恢复到删除前。
- 主库机房故障能切到备库。
- 恢复后数据处在一致的 SCN。
所以要理解数据文件、控制文件、redo、归档日志、RMAN 和 SCN 的关系。
恢复为什么离不开 Redo 和归档日志
完整备份只是某个时间点附近的数据文件副本。备份完成后业务还在继续写,如果只恢复完整备份,会丢失备份后的提交。
flowchart TD
A["周日 00:00 全备"] --> B["周一到周三业务持续提交"]
B --> C["Redo不断生成"]
C --> D["日志切换生成归档日志"]
D --> E["周三 10:00 数据文件损坏"]
E --> F["还原周日全备"]
F --> G["应用归档日志和在线Redo"]
G --> H["恢复到故障前或指定时间点"]如果没有归档日志,数据库通常只能恢复到最后一次一致备份点,备份之后的数据可能丢失。
归档模式怎么理解
| 模式 | 含义 | 适用 |
|---|---|---|
| NOARCHIVELOG | redo 覆盖前不强制保存历史日志 | 测试库、可丢数据环境 |
| ARCHIVELOG | redo 切换后保存成归档日志 | 生产核心库 |
核心业务库通常必须使用归档模式,因为它支持介质恢复和时间点恢复。
查看:
archive log list;RMAN 备份类型
| 备份类型 | 作用 | 什么时候用 |
|---|---|---|
| 全库备份 | 备份所有关键数据文件 | 周期性基线 |
| 增量备份 | 只备份变化块 | 大库降低备份窗口 |
| 归档日志备份 | 保存恢复所需日志 | 支持时间点恢复 |
| 控制文件备份 | 保存数据库结构元信息 | 控制文件损坏恢复 |
| SPFILE 备份 | 保存启动参数 | 参数文件丢失恢复 |
典型命令:
rman target /
backup database plus archivelog;
backup current controlfile;时间点恢复流程
误删数据是商业系统高频事故。比如凌晨 10:05 误删资产表部分数据,想恢复到 10:04。
flowchart TD
A["确认误操作时间"] --> B["准备最近可用全备或增量备份"]
B --> C["还原数据文件"]
C --> D["应用归档日志"]
D --> E["recover database until time"]
E --> F["打开数据库或恢复到临时库导出数据"]生产上更常见的安全做法是恢复到临时库,把误删数据导出后再回灌,而不是直接把主库整体回退。因为整体回退会影响误操作之后的正常业务数据。
Data Guard 原理
Data Guard 的核心不是“定时复制表”,而是主库把 redo 传到备库,备库应用 redo,使备库不断追赶主库。
sequenceDiagram
participant App as 应用
participant Pri as 主库
participant Redo as Redo传输
participant Stb as 备库
App->>Pri: 提交事务
Pri->>Pri: 写Redo并提交
Pri->>Redo: 发送Redo
Redo->>Stb: 传输Redo
Stb->>Stb: 应用Redo恢复数据块关键概念:
| 概念 | 说明 |
|---|---|
| 主库 Primary | 承接业务写入 |
| 备库 Standby | 接收并应用 redo |
| 同步/异步 | 决定数据丢失风险和提交延迟 |
| Apply Lag | 备库应用落后时间 |
| Switchover | 计划内主备切换 |
| Failover | 主库故障后的故障切换 |
Data Guard 能解决机房级故障和数据库级容灾,但不能替代备份。因为误删数据也会生成 redo 并同步到备库。
RAC 解决什么,不解决什么
RAC 是多实例访问同一个数据库存储。它主要提升实例层高可用和一定的并发能力。
| 能力 | RAC 是否解决 | 说明 |
|---|---|---|
| 单实例宕机 | 能缓解 | 其他实例可继续服务 |
| 存储损坏 | 不能单独解决 | 共享存储仍是关键 |
| 误删数据 | 不能解决 | 误操作对所有实例可见 |
| SQL 写得慢 | 不能自动解决 | 可能因为跨实例块传输更复杂 |
| 横向扩展所有业务 | 不一定 | 热点块、序列、全局缓存会限制扩展 |
所以 RAC、Data Guard、RMAN 的角色不同:RAC 偏实例可用性,Data Guard 偏容灾,RMAN 偏备份恢复。
商业备份策略示例
核心资产库可以这样设计:
| 项目 | 策略 |
|---|---|
| 恢复目标 RPO | 核心交易 0 到数分钟,普通报表可更长 |
| 恢复时间 RTO | 核心系统分钟级到小时级 |
| 全备 | 每周一次 |
| 增量备份 | 每天一次 |
| 归档日志备份 | 每 15 到 30 分钟 |
| 备份保存 | 本地快速恢复 + 异地对象存储 |
| 恢复演练 | 每月至少抽样恢复 |
| 监控 | 归档空间、备份成功率、备库延迟 |
备份策略必须由 RPO/RTO 倒推,而不是“每天备份一下就行”。
常见坑
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 只备份不演练恢复 | 真故障时发现备份不可用 | 定期恢复演练 |
| 归档目录满 | 数据库可能挂起或无法继续归档 | 监控空间并备份清理 |
| Data Guard 当备份 | 误删会同步到备库 | RMAN 备份和容灾都要有 |
| 不备控制文件 | 恢复时缺少数据库结构信息 | 开启控制文件自动备份 |
| 直接主库回退 | 丢失误操作后的正常业务 | 优先恢复到临时库再回灌 |
面试标准回答
Oracle 备份恢复常用 RMAN,可以做全库备份、增量备份、归档日志备份和恢复。归档日志用于保存 redo 历史,是时间点恢复和介质恢复的重要基础。Data Guard 通过传输和应用 redo 实现主备容灾,RAC 是多个实例访问同一个数据库存储,提高可用性但复杂度更高。生产环境必须定期做恢复演练,而不是只配置备份任务。