Oracle 19c入门学习教程,从入门到精通,Oracle 数据备份与恢复 — 语法知识点与使用方法详解(17)

Oracle 数据备份与恢复 --- 语法知识点与使用方法详解


一、环境准备(Oracle 安装与归档模式配置)

前提 :Oracle Database 已安装(参考第16章安装步骤)。
本章重点依赖 RMAN(Recovery Manager)工具,该工具随 Oracle 自动安装,无需额外安装。

1. 验证 RMAN 是否可用

bash 复制代码
# 在操作系统命令行执行(无需进入 SQL*Plus)
rman target /

若成功连接到目标数据库,说明 RMAN 可用。

2. 配置数据库为 ARCHIVELOG 模式(推荐用于生产环境)

sql 复制代码
-- 以 sysdba 身份登录
sqlplus / as sysdba

-- 查看当前模式
ARCHIVE LOG LIST;

-- 若为 NOARCHIVELOG,需切换(需重启)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

-- 设置归档日志路径(可选,默认在 $ORACLE_HOME/dbs)
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog' SCOPE=SPFILE;
-- 注意:Windows 路径如 'LOCATION=D:\oracle\arch'

⚠️ 重要 :只有处于 ARCHIVELOG 模式的数据库才能进行时间点恢复增量备份恢复


二、RMAN 基础知识

1. RMAN 的优点

  • 自动管理备份文件(无需手动命名)
  • 支持压缩、加密、并行备份
  • 与 Oracle 块级一致性检查集成
  • 支持完全/部分/不完全恢复
  • 自动删除过期备份(通过保留策略)

2. RMAN 核心组件

组件 说明
Target Database 要备份/恢复的数据库
Recovery Catalog(可选) 存储备份元数据的独立数据库(提高可靠性)
Media Management Layer(MML) 用于磁带备份的接口(如 NetBackup)

本章使用 无 Recovery Catalog 模式(默认,备份信息存于控制文件)。

3. RMAN 通道(Channels)

  • 通道是 RMAN 与存储设备之间的数据通路。
  • 默认自动分配通道(DEVICE TYPE DISK)。
  • 可手动配置并行通道提升速度。
rman 复制代码
RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
  BACKUP DATABASE;
  RELEASE CHANNEL c1;
  RELEASE CHANNEL c2;
}

三、RMAN 常用命令与语法

1. 连接到 RMAN

bash 复制代码
# 本地连接(操作系统认证)
rman target /

# 远程连接
rman target sys/password@orcl

2. 查看配置

rman 复制代码
SHOW ALL;  -- 显示所有 RMAN 配置

3. 配置保留策略(Retention Policy)

rman 复制代码
-- 保留最近7天的备份(默认是 REDUNDANCY 1)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

-- 或保留3份全备
CONFIGURE RETENTION POLICY TO REDUNDANCY 3;

4. 配置默认备份路径

rman 复制代码
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U.bak';
-- %U 是唯一文件名(如 01d5s8a9_1_1.bak)

四、使用 RMAN 备份

1. 全量备份(Full Backup)

📌 案例:备份整个数据库 + 归档日志
rman 复制代码
RUN {
  -- 备份数据文件、控制文件、SPFILE
  BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
  
  -- DELETE INPUT:备份后删除已备份的归档日志,节省空间
}

注释说明

  • PLUS ARCHIVELOG:在备份前后切换日志,确保包含所有归档。
  • 若未开启归档模式,此命令会失败。

2. 增量备份(Incremental Backup)

✅ 类型:
  • Level 0:物理全备(作为增量基准)
  • Level 1
    • Differential(默认):备份自上次 Level 0 或 Level 1 以来变化的块
    • Cumulative:备份自上次 Level 0 以来变化的块
📌 案例:Level 0 + Level 1 差异增量
rman 复制代码
-- 每周日做 Level 0
BACKUP INCREMENTAL LEVEL 0 DATABASE;

-- 周一至周六做 Level 1(差异)
BACKUP INCREMENTAL LEVEL 1 DATABASE;
📌 案例:Cumulative 增量
rman 复制代码
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;

💡 建议:Level 0 每周一次,Level 1 每天一次。


3. 备份控制文件和 SPFILE(关键!)

rman 复制代码
-- 自动包含在 DATABASE 备份中,但建议单独备份
BACKUP CURRENT CONTROLFILE;
BACKUP SPFILE;

或配置自动备份:

rman 复制代码
CONFIGURE CONTROLFILE AUTOBACKUP ON;
-- 默认路径:$ORACLE_HOME/dbs/c-<DBID>-<DATE>

五、使用 RMAN 恢复

1. 恢复 NOARCHIVELOG 模式数据库(仅支持完全恢复)

限制:只能恢复到最后一次全备状态,无法恢复之后的事务。

📌 案例:数据库崩溃后恢复
rman 复制代码
-- 步骤1:启动到 NOMOUNT
STARTUP FORCE NOMOUNT;

-- 步骤2:还原控制文件(如有)
RESTORE CONTROLFILE FROM '/backup/rman/c-1234567890-20260118.bak';
ALTER DATABASE MOUNT;

-- 步骤3:还原并恢复数据库
RESTORE DATABASE;
RECOVER DATABASE;  -- 实际无效(无归档),但 RMAN 允许执行

-- 步骤4:以 RESETLOGS 打开(必须)
ALTER DATABASE OPEN RESETLOGS;

⚠️ 注意RESETLOGS 会重置日志序列号,旧备份失效。


2. 恢复 ARCHIVELOG 模式数据库(完全恢复)

📌 案例:数据文件损坏,完全恢复
rman 复制代码
-- 假设 users01.dbf 损坏
STARTUP MOUNT;  -- 若实例未启动

-- 还原并恢复整个数据库
RESTORE DATABASE;
RECOVER DATABASE;  -- 应用所有归档日志到最新

ALTER DATABASE OPEN;  -- 无需 RESETLOGS

3. 部分恢复(Tablespace / Datafile 级别)

📌 案例:仅恢复 USERS 表空间
rman 复制代码
-- 数据库需处于 OPEN 状态(其他表空间可用)
SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';

RESTORE TABLESPACE users;
RECOVER TABLESPACE users;

SQL 'ALTER TABLESPACE users ONLINE';

4. 不完全恢复(Incomplete Recovery)

(1) 基于时间的恢复(Until Time)
rman 复制代码
RUN {
  SET UNTIL TIME "TO_DATE('2026-01-17 14:30:00', 'YYYY-MM-DD HH24:MI:SS')";
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}
(2) 基于 SCN 的恢复(Until SCN)
rman 复制代码
RUN {
  SET UNTIL SCN 1234567;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}
(3) 基于日志序列的恢复(Until Sequence)
rman 复制代码
RUN {
  SET UNTIL SEQUENCE 100 THREAD 1;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

🔒 关键 :所有不完全恢复后必须使用 OPEN RESETLOGS


六、综合性案例

场景:模拟生产事故并恢复到故障前10分钟

步骤1:准备环境(确保 ARCHIVELOG 模式)
sql 复制代码
-- 创建测试表
CREATE TABLE sales_log AS SELECT * FROM all_objects WHERE ROWNUM <= 1000;
步骤2:执行全量备份(Level 0)
rman 复制代码
BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
步骤3:模拟业务操作(记录时间)
sql 复制代码
-- 假设当前时间为 2026-01-18 15:00:00
INSERT INTO sales_log SELECT * FROM all_objects WHERE ROWNUM <= 500;
COMMIT;
-- 记录 SCN(可选)
SELECT current_scn FROM v$database;  -- 假设返回 2000000
步骤4:人为删除数据文件(模拟磁盘故障)
bash 复制代码
# 在 OS 层删除
rm $ORACLE_BASE/oradata/XE/users01.dbf
步骤5:使用 RMAN 恢复到故障前(基于时间)
rman 复制代码
-- 启动 RMAN
rman target /

-- 恢复到 14:55(故障前5分钟)
RUN {
  SET UNTIL TIME "TO_DATE('2026-01-18 14:55:00', 'YYYY-MM-DD HH24:MI:SS')";
  STARTUP FORCE MOUNT;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

-- 验证数据
-- sales_log 应只有初始1000行,新增500行丢失(符合预期)

场景2:误删表后基于 SCN 恢复

步骤1:记录删除前 SCN
sql 复制代码
-- 删除前查询 SCN
SELECT current_scn FROM v$database;  -- 假设 SCN = 2000100

DROP TABLE important_table;  -- 误操作!
步骤2:不完全恢复到 SCN 2000100
rman 复制代码
RUN {
  SET UNTIL SCN 2000100;
  SHUTDOWN IMMEDIATE;
  STARTUP MOUNT;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

✅ 结果:important_table 恢复存在。


七、常用维护命令

命令 作用
LIST BACKUP; 列出所有备份集
LIST EXPIRED BACKUP; 列出控制文件中有但物理不存在的备份
CROSSCHECK BACKUP; 同步物理文件与控制文件记录
DELETE OBSOLETE; 删除超过保留策略的备份
DELETE EXPIRED BACKUP; 清理控制文件中的无效记录

八、最佳实践总结

项目 建议
模式 生产库必须启用 ARCHIVELOG
备份频率 Level 0 每周,Level 1 每天,归档日志每小时备份
控制文件 启用 AUTOBACKUP,多路复用
验证备份 定期使用 RESTORE VALIDATE DATABASE 测试
保留策略 至少保留7天 + 2个全备周期
监控 使用 V$RMAN_BACKUP_JOB_DETAILS 查看历史任务

通过以上系统化的 RMAN 备份与恢复方案,可有效保障 Oracle 数据库的数据安全与业务连续性。

相关推荐
Prince-Peng6 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
虾说羊6 小时前
redis中的哨兵机制
数据库·redis·缓存
_F_y6 小时前
MySQL视图
数据库·mysql
lxl13076 小时前
学习C++(5)运算符重载+赋值运算符重载
学习
2301_790300966 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
九章-6 小时前
一库平替,融合致胜:国产数据库的“统型”范式革命
数据库·融合数据库
AutumnorLiuu7 小时前
C++并发编程学习(一)——线程基础
开发语言·c++·学习
CS创新实验室7 小时前
关于 Moltbot 的学习总结笔记
笔记·学习·clawdbot·molbot
2401_838472517 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
u0109272717 小时前
使用Python进行网络设备自动配置
jvm·数据库·python