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 数据库的数据安全与业务连续性。

相关推荐
数智化管理手记10 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
Xudde.10 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
翊谦11 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh11 小时前
JavaSE学习——迭代器
java·开发语言·学习
難釋懷11 小时前
OpenResty实现Redis查询
数据库·redis·openresty
421!12 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
别抢我的锅包肉12 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
Database_Cool_12 小时前
OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系
数据库·阿里云·ai
AI成长日志12 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
刘~浪地球12 小时前
Redis 从入门到精通(五):哈希操作详解
数据库·redis·哈希算法