备份与恢复
最后更新: 2026-04-15
作者: Oracle Team
页面目录
第十一章:备份与恢复
文档信息
- 适用版本:Oracle 12c / 18c / 19c / 21c
- 阅读时间:约 55 分钟
- 前置知识:第十章日志管理
11.1 RMAN 基础
11.1.1 RMAN 概述
┌─────────────────────────────────────────────────────────────────┐
│ RMAN 备份架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Target DB │ ────── │ RMAN │ │
│ │ (目标库) │ ←────→ │ (恢复目录) │ │
│ └─────────────┘ └─────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ControlFile│ │ SBT_TAPE │ │
│ │ (备份元数据) │ │ 或 磁盘 │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ RMAN 优势: │
│ • 增量备份(只备份变化块) │
│ • 压缩备份 │
│ • 加密备份 │
│ • 自动管理备份集 │
│ • 通道并行备份 │
│ │
└─────────────────────────────────────────────────────────────────┘
11.1.2 RMAN 连接
# 连接本地数据库
rman target /
# 连接带用户名密码
rman target sys/password@ORCL
# 连接恢复目录
rman target / catalog rman/rman@CATALOG
# 查看 RMAN 配置
rman target /
RMAN> SHOW ALL;
# RMAN 常用配置
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/ctrl_%F';
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 3;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
11.2 备份类型
11.2.1 备份分类
| 分类方式 | 类型 | 说明 |
|---|---|---|
| 备份集 | Backup Set | RMAN 默认,压缩存储 |
| 镜像副本 | Image Copy | 精确数据文件副本 |
| 完全备份 | Full Backup | 备份所有使用块 |
| 增量备份 | Incremental | 只备份变化块 |
| 差异增量 | Differential | 备份上次增量以来变化 |
| 累积增量 | Cumulative | 备份上次完全备份以来变化 |
11.2.2 完全备份
# 备份整个数据库
RMAN> BACKUP DATABASE;
# 备份数据库到指定路径
RMAN> BACKUP DATABASE FORMAT '/backup/db_%d_%s_%p.bak';
# 备份数据库包括归档
RMAN> BACKUP AS BACKUPSET DATABASE PLUS ARCHIVELOG;
# 备份表空间
RMAN> BACKUP TABLESPACE USERS;
# 备份数据文件
RMAN> BACKUP DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf';
# 备份控制文件
RMAN> BACKUP CURRENT CONTROLFILE;
# 备份 spfile
RMAN> BACKUP SPFILE;
# 镜像副本备份
RMAN> BACKUP AS COPY DATABASE;
11.2.3 增量备份
┌─────────────────────────────────────────────────────────────────┐
│ 增量备份策略 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 完全备份 (Level 0) │
│ ┌─────────────────────────────────────────┐ │
│ │ D0 备份所有块 │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 差异增量 (Differential) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ D1 │ │ D2 │ │ D3 │ 备份自上次增量备份以来变化 │
│ │ D0+ │ │ D1+ │ │ D2+ │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ 累积增量 (Cumulative) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ C1 │ │ C2 │ │ C3 │ 备份自上次完全备份以来变化 │
│ │ D0+ │ │ C1+ │ │ C2+ │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
# Level 0 完全备份
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;
# 差异增量备份 (Differential)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
# 累积增量备份 (Cumulative)
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;
# 备份策略示例(每周日完全,每天增量)
# 周日
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE TAG 'weekly_backup';
# 周一到周六(差异增量)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE TAG 'daily_incr';
# 差异增量合并
RMAN> BACKUP INCREMENTAL LEVEL 1 FROM TAG 'weekly_backup' DATABASE;
# 查看增量备份
RMAN> LIST BACKUP OF DATABASE BY BACKUP;
11.2.4 归档备份
# 备份所有归档
RMAN> BACKUP ARCHIVELOG ALL;
# 备份最近 24 小时的归档
RMAN> BACKUP ARCHIVELOG FROM TIME 'SYSDATE-1';
# 备份归档并删除已备份归档
RMAN> BACKUP ARCHIVELOG ALL DELETE ALL INPUT;
# 备份归档到指定位置
RMAN> BACKUP ARCHIVELOG ALL FORMAT '/backup/arch_%s.bak';
# 备份归档并限制
RMAN> BACKUP ARCHIVELOG ALL THREAD 1 DELETE ALL INPUT;
11.3 恢复操作
11.3.1 完全恢复
# 恢复整个数据库
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;
# 恢复表空间
RMAN> SQL 'ALTER TABLESPACE USERS OFFLINE';
RMAN> RESTORE TABLESPACE USERS;
RMAN> RECOVER TABLESPACE USERS;
RMAN> SQL 'ALTER TABLESPACE USERS ONLINE';
# 恢复数据文件
RMAN> SQL 'ALTER DATABASE DATAFILE 5 OFFLINE';
RMAN> RESTORE DATAFILE 5;
RMAN> RECOVER DATAFILE 5;
RMAN> SQL 'ALTER DATABASE DATAFILE 5 ONLINE';
11.3.2 增量恢复
# 应用增量备份恢复
RMAN> RECOVER DATABASE INCREMENTAL FROM TAG 'daily_incr';
# 从特定备份集恢复
RMAN> RECOVER DATABASE FROM BACKUPSET 'backup_tag_name';
11.3.3 归档恢复
# 恢复所有归档
RMAN> RESTORE ARCHIVELOG ALL;
# 恢复指定序列归档
RMAN> RESTORE ARCHIVELOG SEQUENCE BETWEEN 100 AND 200;
# 恢复最近归档
RMAN> RESTORE ARCHIVELOG FROM TIME 'SYSDATE-1';
# 应用归档恢复
RMAN> RECOVER DATABASE UNTIL TIME "TO_DATE('2024-01-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
11.4 RMAN 高级特性
11.4.1 备份优化与压缩
# 启用压缩
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;
# 压缩级别
RMAN> CONFIGURE COMPRESSION ALGORITHM 'HIGH';
# 加密备份
RMAN> BACKUP AS ENCRYPTED BACKUPSET DATABASE;
# 设置加密密码
RMAN> SET ENCRYPTION ON IDENTIFIED BY 'password' ONLY;
# 备份验证
RMAN> BACKUP VALIDATE DATABASE;
RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE;
# 检查损坏块
RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE SPFILE;
11.4.2 并行备份
# 分配多个通道
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
# 手动分配通道
RMAN> RUN {
ALLOCATE CHANNEL ch1 TYPE DISK;
ALLOCATE CHANNEL ch2 TYPE DISK;
ALLOCATE CHANNEL ch3 TYPE DISK;
BACKUP DATABASE;
}
# 并行备份表空间
RMAN> BACKUP TABLESPACE USERS, TEMP, SYSTEM;
11.4.3 备份维护
# 列出备份
RMAN> LIST BACKUP;
RMAN> LIST BACKUP OF DATABASE;
RMAN> LIST BACKUP OF TABLESPACE USERS;
RMAN> LIST BACKUP OF DATAFILE '/path/to/file.dbf';
RMAN> LIST BACKUP OF CONTROLFILE;
RMAN> LIST BACKUP OF SPFILE;
# 列出过期备份
RMAN> REPORT OBSOLETE;
# 删除过期备份
RMAN> DELETE OBSOLETE;
# 删除指定备份
RMAN> DELETE BACKUP;
RMAN> DELETE BACKUP TAG 'weekly_backup';
RMAN> DELETE BACKUP DEVICE TYPE DISK;
# 删除所有备份
RMAN> DELETE BACKUP ALL;
# 交叉检查
RMAN> CROSSCHECK BACKUP;
RMAN> CROSSCHECK BACKUP OF DATABASE;
RMAN> DELETE EXPIRED BACKUP;
11.5 数据泵 (Data Pump)
11.5.1 Export/Import
# 导出全库
expdp system/password@ORCL full=Y directory=EXPDP_DIR dumpfile=full_%date%.dmp logfile=full_%date%.log
# 导出指定模式
expdp hr/hr@ORCL schemas=HR directory=EXPDP_DIR dumpfile=hr_%date%.dmp
# 导出指定表
expdp hr/hr@ORCL tables=HR.EMPLOYEES,HR.DEPARTMENTS directory=EXPDP_DIR dumpfile=tables_%date%.dmp
# 导出满足条件的表
expdp hr/hr@ORCL tables=HR.EMPLOYEES query='WHERE department_id=50' directory=EXPDP_DIR dumpfile=emp_dept50.dmp
# 导入全库
impdp system/password@ORCL full=Y directory=EXPDP_DIR dumpfile=full.dmp logfile=import_full.log
# 导入模式
impdp hr/hr@ORCL schemas=HR directory=EXPDP_DIR dumpfile=hr.dmp
# 导入表
impdp hr/hr@ORCL tables=EMPLOYEES directory=EXPDP_DIR dumpfile=emp.dmp TABLE_EXISTS_ACTION=REPLACE
# 创建目录对象
sqlplus / as sysdba
CREATE DIRECTORY expdp_dir AS '/u01/backup';
GRANT READ, WRITE ON DIRECTORY expdp_dir TO hr;
11.5.2 Data Pump 选项
# 导出选项
# CONTENT: 导出内容 (ALL, DATA_ONLY, METADATA_ONLY)
expdp hr/hr schemas=HR CONTENT=METADATA_ONLY dumpfile=meta.dmp
# ESTIMATE: 估算导出大小 (BLOCKS, STATISTICS)
expdp hr/hr schemas=HR ESTIMATE=STATISTICS
# EXCLUDE: 排除对象
expdp hr/hr schemas=HR EXCLUDE=TABLE:"IN('EMPLOYEES')"
# INCLUDE: 只导出指定对象
expdp hr/hr schemas=HR INCLUDE=TABLE:"LIKE 'EMP%'"
# 导入选项
# TABLE_EXISTS_ACTION: 表已存在时操作 (SKIP, APPEND, REPLACE, TRUNCATE)
impdp hr/hr tables=EMPLOYEES TABLE_EXISTS_ACTION=REPLACE
# REMAP: 重映射
impdp hr/hr REMAP_SCHEMA=SCOTT:HR REMAP_TABLESPACE=USERS:USERS_TS
# REMAP_DATA: 数据转换
impdp hr/hr REMAP_DATA=HR.EMPLOYEES.EMPLOYEE_ID:HR.EMPID_SEQ.NEXTVAL
11.6 灾难恢复场景
11.6.1 丢失数据文件恢复
# 场景:某个数据文件丢失或损坏
# 1. 确定数据文件
RMAN> SELECT NAME, STATUS FROM V$DATAFILE;
# 2. 脱机数据文件
RMAN> SQL 'ALTER DATABASE DATAFILE ''/path/users01.dbf'' OFFLINE';
# 3. 恢复数据文件
RMAN> RESTORE DATAFILE '/path/users01.dbf';
# 4. 恢复数据
RMAN> RECOVER DATAFILE '/path/users01.dbf';
# 5. 联机数据文件
RMAN> SQL 'ALTER DATABASE DATAFILE ''/path/users01.dbf'' ONLINE';
11.6.2 丢失控制文件恢复
# 场景:控制文件损坏或丢失
# 1. 关闭数据库
RMAN> SHUTDOWN ABORT;
# 2. 恢复控制文件(如果有备份)
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
# 或者恢复特定备份
RMAN> RESTORE CONTROLFILE FROM '/backup/ctrl_c-1234567890-20240101-00.bak';
# 3. 打开数据库
RMAN> ALTER DATABASE MOUNT;
RMAN> ALTER DATABASE OPEN RESETLOGS;
11.6.3 丢失联机日志恢复
# 场景:联机日志文件丢失
# 1. 查看日志状态
RMAN> SELECT GROUP#, STATUS FROM V$LOG;
# 2. 如果是非当前日志且已归档,可清除
RMAN> SQL 'ALTER DATABASE CLEAR LOGFILE GROUP 3';
# 3. 如果是当前日志未归档,使用不完整恢复
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RECOVER DATABASE UNTIL CANCEL;
RMAN> ALTER DATABASE OPEN RESETLOGS;
11.6.4 基于时间恢复
# 场景:需要恢复到某个时间点
# 1. 启动到 mount
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
# 2. 执行时间点恢复
RMAN> RECOVER DATABASE UNTIL TIME "TO_DATE('2024-01-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
# 3. 以 resetlogs 方式打开
RMAN> ALTER DATABASE OPEN RESETLOGS;
# 或者恢复到 SCN
RMAN> RECOVER DATABASE UNTIL SCN 12345678;
11.7 备份策略设计
11.7.1 常见备份策略
┌─────────────────────────────────────────────────────────────────┐
│ 推荐备份策略 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 周计划: │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐│
│ │ 周日 │ 周一 │ 周二 │ 周三 │ 周四 │ 周五 │ 周六 ││
│ ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤│
│ │ L0 完整 │ L1 增量 │ L1 增量 │ L1 增量 │ L1 增量 │ L1 增量 │ L1 增量 ││
│ │ +Arch │ +Arch │ +Arch │ +Arch │ +Arch │ +Arch │ +Arch ││
│ └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘│
│ │
│ 保留策略: │
│ • 每日增量备份保留 7 天 │
│ • 每周完全备份保留 30 天 │
│ • 控制文件备份自动保留 │
│ • 归档日志 保留到备份完成 │
│ │
│ RMAN 配置: │
│ CONFIGURE RETENTION POLICY TO REDUNDANCY 3; -- 保留 3 份 │
│ CONFIGURE CONTROLFILE AUTOBACKUP ON; │
│ CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK │
│ TO '/backup/ctrl_%F'; │
│ │
└─────────────────────────────────────────────────────────────────┘
11.7.2 备份脚本示例
#!/bin/bash
# backup_inc.sh - 增量备份脚本
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
BACKUP_DIR=/backup/rman
DATE=$(date +%Y%m%d)
LOG_FILE=$BACKUP_DIR/logs/backup_${DATE}.log
# 创建日志目录
mkdir -p $BACKUP_DIR/logs
# 连接 RMAN 执行备份
$ORACLE_HOME/bin/rman target / msglog $LOG_FILE <<EOF
RUN {
CONFIGURE RETENTION POLICY TO REDUNDANCY 3;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
ALLOCATE CHANNEL ch1 TYPE DISK;
ALLOCATE CHANNEL ch2 TYPE DISK;
BACKUP
INCREMENTAL LEVEL 1
CUMULATIVE
FORMAT '$BACKUP_DIR/df_%d_%s_%p.bak'
DATABASE
TAG 'daily_backup';
BACKUP
FORMAT '$BACKUP_DIR/arch_%d_%s_%p.bak'
ARCHIVELOG ALL
DELETE ALL INPUT;
DELETE OBSOLETE;
CROSSCHECK BACKUP;
DELETE EXPIRED BACKUP;
}
EXIT;
EOF
# 检查备份结果
if [ $? -eq 0 ]; then
echo "Backup completed successfully at $(date)" >> $LOG_FILE
else
echo "Backup failed at $(date)" >> $LOG_FILE
# 发送告警(可集成邮件或钉钉)
fi
11.8 本章小结
✅ RMAN 基础:连接、配置、备份集与镜像副本
✅ 完全备份与增量备份:Level 0/1/Cumulative/Differential
✅ 恢复操作:数据库、表空间、数据文件恢复
✅ 高级特性:压缩、加密、并行、验证
✅ Data Pump:EXPDP/IMPDP 数据迁移
✅ 灾难恢复:时间点恢复、SCN 恢复、resetlogs 恢复
✅ 备份策略:设计合理的备份计划
📖 下章预告:DataGuard 高可用架构
下一步:学习 第十二章:DataGuard 高可用架构