备份与恢复

最后更新: 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 高可用架构