知识库✳

教程与手册

全部教程
  1. 01Oracle 函数手册
  2. 02性能优化手册
  3. 03Linux Shell
  4. 04Oracle 学习与演练
  5. 05网络基础学习
  6. 06数据治理与管理
返回个人网站
甲Oracle 学习教程从 SQL 到 PL/SQL 与运维
首页课程目录搜索演练场
知识库

已完成 0 / 22 章

模块一 · 入门与准备

  • 01Oracle 数据库体系结构
  • 02环境安装与连接方式
  • 03SQL*Plus 与常用工具

模块二 · SQL 查询基础

  • 04SELECT 查询基础
  • 05过滤与排序
  • 06单行函数
  • 07多表连接
  • 08分组聚合与 HAVING
  • 09子查询

模块三 · 数据与对象

  • 10DML 与事务控制
  • 11表与数据类型
  • 12约束
  • 13索引与执行计划
  • 14视图、序列与同义词

模块四 · PL/SQL 编程

  • 15PL/SQL 块与变量
  • 16流程控制与游标
  • 17存储过程与函数
  • 18触发器
  • 19异常处理

模块五 · 运维与进阶

  • 20用户与权限管理
  • 21表空间与存储管理
  • 22备份与恢复
❖

Oracle 学习教程

返回个人网站知识库

示例代码基于 Oracle AI Database 26ai / 23ai,查询示例使用官方 HR 示例方案。

以 Next.js 16 · Tailwind CSS v4 · HeroUI v3 装帧

22
  1. 首页
  2. 课程目录
  3. 备份与恢复

第 22 章◆高级◆建议 50 分钟◆模块五 · 运维与进阶

备份与恢复

逻辑备份与物理备份的区别、归档模式的意义,以及闪回技术的实用场景。

学完这一章,你应该能

  • 分清逻辑备份与物理备份的适用场景
  • 理解归档模式与非归档模式的差别
  • 会用数据泵做导入导出
  • 掌握几种闪回恢复手段

22.1两种备份路线

  • 逻辑备份:导出对象定义和数据(Data Pump),跨版本迁移、单表恢复方便
  • 物理备份:复制数据文件、控制文件、日志(RMAN),整库快速恢复的首选
  • RMAN 支持增量备份和块级校验,是生产环境的标准方案
  • 逻辑备份不能保证时间点一致性恢复,不能替代物理备份

22.2归档模式:能不能恢复到任意时间点

非归档模式下,重做日志被覆盖后就无法重放,只能恢复到上次全备的时间点。归档模式下,写满的重做日志会被保存下来,因此可以做到时间点恢复(PITR)。

查看与切换归档模式
-- 查看当前模式
SELECT log_mode, database_role, open_mode FROM v$database;

-- 切换为归档模式(需要 SYSDBA,且要先 MOUNT)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

-- 校验归档是否真的在写
ARCHIVE LOG LIST;

提示 开启归档模式后必须规划归档日志的存放和清理策略,否则磁盘被归档日志撑满是另一种生产事故。

22.3数据泵:日常最常用的工具

  • expdp/impdp 是服务端工具,文件生成在数据库服务器上,不是客户端
  • CONTENT=DATA_ONLY 只导数据,METADATA_ONLY 只导结构
  • REMAP_SCHEMA / REMAP_TABLESPACE 可以在导入时改 schema,适合开发库还原
  • REMAP_TABLE 可以在导入时改表名
导出与导入
-- 需要先建目录对象(操作系统路径必须真实存在)
CREATE OR REPLACE DIRECTORY dp_dir AS '/u01/dump';
GRANT READ, WRITE ON DIRECTORY dp_dir TO app_user;

-- 导出整库(在操作系统命令行执行)
-- expdp system/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=full_%U.dmp --       FULL=Y LOGFILE=exp_full.log PARALLEL=4

-- 只导出某张表
-- expdp hr/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=emp.dmp --       TABLES=employees LOGFILE=exp_emp.log CONTENT=DATA_ONLY

-- 导入
-- impdp hr/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=emp.dmp --       TABLES=employees TABLE_EXISTS_ACTION=APPEND LOGFILE=imp_emp.log

-- 查看正在运行的作业
SELECT job_name, operation, job_mode, state FROM dba_datapump_jobs;

只作示例阅读:建目录对象、数据库链接、物化视图。请在独立学习数据库中练习。

22.4闪回:误操作的救命稻草

  • 闪回查询依赖 UNDO 数据,受 UNDO_RETENTION 和表空间大小限制
  • 时间点越久远,需要的 UNDO 越多;窗口内没查到会报 ORA-01555
  • 闪回删除靠回收站,表被 PURGE 之后就救不回来了
  • 闪回数据库(FLASHBACK DATABASE)是重量级操作,需要先在 MOUNT 状态开启
四种常用闪回
-- 1) 闪回查询:看过去某个时间点的数据(不需要恢复)
SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE  employee_id = 100;

-- 2) 闪回版本查询:看某行被改过几次
SELECT versions_starttime, versions_operation, salary
FROM   employees VERSIONS BETWEEN TIMESTAMP
       (SYSTIMESTAMP - INTERVAL '30' MINUTE) AND SYSTIMESTAMP
WHERE  employee_id = 100;

-- 3) 闪回表:把整张表恢复到某时间点(会移动数据,需先启用行移动)
ALTER TABLE employees_demo ENABLE ROW MOVEMENT;
FLASHBACK TABLE employees_demo TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

-- 4) 闪回删除:从回收站捞回被 DROP 的表
SHOW recyclebin
FLASHBACK TABLE employees_demo TO BEFORE DROP;

闪回的前提是:数据在目标时间点已经存在,且对应的 UNDO 还没被覆盖。刚创建的库、或刚重建过的表,没有可用的过去快照,会报 ORA-01466(table definition has changed)或 ORA-08180(no snapshot found)。所以这几个例子要在库运行一段时间之后才看得到效果。

提示 闪回不是备份的替代品。UNDO 空间被覆盖后闪回就失效了,真正可靠的还是归档模式加 RMAN 备份。

练习

3 题 · 先自己写,再展开对照

参考答案

因为逻辑备份是导出对象定义和数据这一层面的操作,它无法提供
一致性的时间点恢复。

具体差别:
- 逻辑备份期间其他会话仍在改数据,导出结果可能跨越不同时间点,
  无法用它恢复到故障发生前那一秒
- 它不包含数据块级别的信息,无法做块级恢复、增量备份
- 大库的导出/导入耗时远长于物理恢复

物理备份(RMAN)复制数据文件、控制文件、归档日志,配合归档日志
可以做完整恢复和时间点恢复(PITR),这是生产环境的标准方案。

逻辑备份的价值在于:跨版本/跨平台迁移、单表或单 schema 恢复、
开发库还原——它是补充,不是替代。

自评要点

  • 逻辑备份无法保证时间点一致性恢复
  • 物理备份加归档日志才能做 PITR
  • 说清逻辑备份的真实用途

参考答案

归档模式下,写满的在线重做日志会被 ARCn 复制到归档目录保存下来,
于是从上次全备到现在的所有变更都有记录可重放,
可以做完整恢复与时间点恢复(PITR)。

非归档模式下,在线重做日志写满后被循环覆盖,一旦数据文件损坏,
只能恢复到上次全量备份的时间点,故障之后的所有事务全部丢失。

代价与义务:归档日志会持续占用磁盘,必须规划存放与清理(备份后删除)
策略,否则磁盘被归档日志撑满是另一种常见生产事故。

自评要点

  • 归档保存写满的重做日志
  • 非归档只能恢复到上次全备
  • 提醒归档日志本身也要管理

参考答案

最快的是闪回(FLASHBACK),不需要恢复整个数据库:

-- 先确认过去某个时间点的数据还在
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE department_id = 60;

-- 确认无误后,把整张表闪回到那个时间点
ALTER TABLE employees ENABLE ROW MOVEMENT;
-- 闪回表需要行移动
FLASHBACK TABLE employees
  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);

前提与限制:
- 依赖 UNDO 数据,受 UNDO_RETENTION 和 UNDO 表空间大小限制;
  时间点太久远或 UNDO 已被覆盖,会报 ORA-01555(snapshot too old)
- 闪回表会覆盖该表在此期间的所有变更,不仅仅是你要撤销的那条 DELETE
- 若表是被 DROP 而非 DELETE,可用 FLASHBACK TABLE ... TO BEFORE DROP
  从回收站找回(被 PURGE 就救不回来了)

闪回不是备份的替代品——UNDO 被覆盖它就失效了。可靠方案始终是
归档模式加 RMAN 备份。

自评要点

  • 优先想到闪回查询/闪回表,而不是整库恢复
  • 指出依赖 UNDO、受 UNDO_RETENTION 限制
  • 指出闪回表会覆盖期间的所有变更
  • 知道闪回不等于备份
← 上一章

表空间与存储管理