You are on page 1of 354

Oracle9i 数据库管理基础 II

学生指南 • 第 2 册

D11297CN11
产品版 1.1
2002 年 3 月
D34486
作者 版权所有 © Oracle Corporation,2000,2001。保留所有权利。

Donna Keesling 本文档包含 Oracle 公司的专有权信息;根据许可证协议提供该文档,该许可证协议含


James Womack 有对使用和公开本文档的各种限制;本文档还受到版权法的保护。严禁对本文档所涉及
的软件进行逆向工程设计。如果将本文档交付给美国国防部下属的某个政府机构,则根
据 “受限制权利” 进行提供并且必须符合以下规定:
技术撰稿人和审稿人
Lance Ashdown 受限制权利说明

Tammy Bednar 对商用计算机软件的限制同样适用于政府的使用、复制或泄露行为,并且根据联邦法


Louise Beijer 律,本软件将被视为 “受限制权利” 软件,相关规定请参见 DFARS 252.227-7013《技
术数据和计算机软件中的权利》(1988 年 10 月)中的段落 (c)(1)(ii)。
Harald van Breederode
Howard Bradley 未经 Oracle 公司事先明确的书面许可,不得以任何形式或通过任何途径复制本文档或
Senad Dizdar 文档的任何部分。任何其它复制行为都被视为对版权法的触犯,违者可能须负民事和
(或)刑事责任。
Steven George
Joel Goodman 如果将本文档交付给美国国防部之外的某个政府机构,则根据 “受限制权利” 进行提供,
该权利在 FAR 52.227-14《数据权利-通则》(包括 1987 年 6 月的《附则》III)中有
Scott Gossett
所规定。
John Hibbard
Stefan Lindblad 本文档中的信息如有更改,恕不另行通知。如果您在此文档中发现任何问题,请书面
通知 Education Products, Oracle Corporation, 500 Oracle Parkway, Box SB-6,
Roman Niehoff Redwood Shores, CA 94065。Oracle 公司不保证此文档中没有错误。
Howard Ostrow
Oracle 和所有对 Oracle 产品的引用都是 Oracle 公司的商标或注册商标。
Radhanes Petronilla
Maria Jesus Senise Garcia 所有其它产品或公司名称仅用于标识,可能是其各自所有者的商标。
Peter Sharman
Ranbir Singh
Sergey Stetsenko
John Watson
Steven Wertheimer
Junichi Yamazaki

出版商
John B Dawson
目录

前言
1 联网概览
目标 1-2
网络环境的挑战 1-3
简单网络:两层 1-5
简单网络到复杂网络:N 层 1-6
复杂的网络 1-7
Oracle9i 联网解决方案 1-8
连接性:Oracle Net Services 1-9
连接性:使用 IIOP 和 HTTP 连接数据库 1-11
目录命名 1-12
目录服务:Oracle Internet Directory 1-14
可伸缩性:Oracle Shared Server 1-15
可伸缩性:连接管理器 (Connection Manager) 1-16
安全性:高级安全性 (Advanced Security) 1-18
高级安全性 (Advanced Security) 加密 1-19
安全性:Oracle Net Services 和防火墙 1-20
可访问性:异种服务 1-21
可访问性:外部过程 1-22
Oracle Net Configuration Assistant 1-23
Oracle Net Manager 1-24
小结 1-25
2 Oracle Net 体系结构
目标 2-2
Oracle Net 连接 2-3
客户机-服务器应用程序连接:无中间层 2-4
Web 客户机应用程序连接 2-6
Web 客户机应用程序连接:Web 服务器中间层 2-7
Web 客户机应用程序连接:Java 应用程序客户机 2-8
Web 客户机应用程序连接:Java 小程序客户机 2-9
Web 客户机应用程序连接:无中间层 2-10
连接概念与术语 2-12
Oracle Net 配置模型 2-14
Oracle Net 配置文件 2-15
小结 2-17
3 Oracle Net 服务器端基本配置
目标 3-2
监听程序进程 3-3
连接方法 3-4
衍生、继承和直接传送连接 3-5
重定向会话 3-7
服务配置和注册 3-9
iii
静态服务注册:listener.ora 文件 3-12
静态服务注册:创建监听程序 3-15
配置服务 3-16
事件记录与跟踪 3-17
动态服务注册:配置注册 3-18
动态服务注册:向监听程序注册信息 3-19
为 Oracle9i JVM 配置监听程序:IIOP 和 HTTP 3-20
“监听程序控制实用程序” (Listener Control Utility, LSNRCTL) 3-22
LSNRCTL 命令 3-23
LSNRCTL SET 和 SHOW 修改符 3-25
小结 3-27
练习 3 概览 3-28
4 命名方法配置
目标 4-2
命名方法概览 4-3
主机命名 4-4
主机命名:客户端 4-5
主机命名:服务器端 4-6
主机命名示例 4-7
命名方法配置 4-8
选择主机命名方法 4-9
本地命名 4-10
选择本地命名方法 4-11
配置本地网络服务名 4-12
处理网络服务名 4-13
指定 Oracle 数据库的版本 4-14
数据库服务名 4-15
网络协议 4-16
主机名和监听程序端口 4-17
测试连接 4-18
连接测试的结果 4-19
网络服务名 4-20
保存网络服务名 4-21
生成的文件:tnsnames.ora 4-22
生成的文件:sqlnet.ora 4-24
排除客户端故障 4-25
小结 4-27
练习 4 概览 4-28
5 Oracle Shared Server 的使用和配置
目标 5-2
服务器配置 5-3
专用服务器进程 5-4
Oracle Shared Server 5-5
Oracle Shared Server 的优点 5-7
iv
同时使用专用服务器和 Oracle Shared Server 5-8
连接 5-9
处理请求 5-10
SGA 和 PGA 5-12
配置 Oracle Shared Server 5-13
DISPATCHERS 5-14
MAX_DISPATCHERS 5-16
SHARED_SERVERS 5-18
MAX_SHARED_SERVERS 5-20
CIRCUITS 5-21
SHARED_SERVER_SESSIONS 5-22
相关参数 5-23
验证设置 5-25
动态视图 5-27
小结 5-28
练习 5 概览 5-29
6 备份和恢复概览
目标 6-2
备份和恢复问题 6-3
故障类别 6-4
语句故障的原因 6-6
语句故障的解决方法 6-7
用户进程故障的原因 6-8
用户进程故障的解决方法 6-9
可能的用户错误 6-10
用户错误的解决方法 6-11
例程故障的原因 6-12
从例程故障进行恢复 6-13
介质故障的原因 6-15
介质故障的解决方法 6-16
定义备份和恢复策略 6-17
业务要求 6-18
操作要求 6-19
技术方面的考虑因素 6-21
灾难恢复问题 6-23
小结 6-25
7 例程和介质恢复结构
目标 7-2
概览 7-3
大型共享池 7-6
数据库缓冲区高速缓存、DBWn 和数据文件 7-8
重做日志缓冲区、LGWR 和重做日志文件 7-10
v
多元备份的重做日志文件 7-13
Enterprise Manager 中的重做日志文件 7-15
检查点 7-16
检查点类型 7-17
CKPT 进程 7-18
多元备份的控制文件 7-19
Enterprise Manager 中的控制文件 7-21
ARCn 进程和归档日志文件 7-22
数据库同步 7-24
例程恢复的各个阶段 7-25
优化崩溃恢复和例程恢复的性能 7-27
优化例程恢复和崩溃恢复的持续时间 7-28
影响检查点的初始化参数 7-29
控制例程崩溃恢复时间 7-31
V$INSTANCE_RECOVERY 7-32
优化崩溃恢复和例程恢复的阶段 7-34
优化前滚阶段 7-35
优化回退阶段 7-36
快速启动按需回退 7-37
快速启动并行回退 7-38
控制快速启动并行回退 7-39
监视并行回退 7-40
小结 7-41
练习 7 概览 7-42
8 配置数据库归档模式
目标 8-2
重做日志历史记录 8-3
NOARCHIVELOG 模式 8-4
ARCHIVELOG 模式 8-6
更改归档模式 8-8
设置归档模式 8-10
自动和手动归档 8-11
启用自动归档 8-13
指定多个 ARCn 进程 8-14
停止或启动附加归档进程 8-15
在例程启动时启用自动归档 8-16
在例程启动后启用自动归档 8-17
禁用自动归档 8-18
手动归档联机重做日志文件 8-19
手动归档重做日志文件 8-21
指定归档日志目标 8-22
指定多个归档日志目标 8-23
LOG_ARCHIVE_DEST_n 选项 8-24
指定本地目标的最小数量 8-25
vi
控制归档到目标 8-27
指定文件名格式 8-28
获取归档日志信息 8-29
小结 8-32
9 Oracle Recovery Manager 概览和配置
目标 9-2
恢复管理器功能 9-3
恢复管理器组件 9-5
使用 “备份管理” 向导 9-7
RMAN 资料档案库:使用控制文件 9-8
分配通道 9-9
自动分配通道 9-11
使用 OEM 分配通道 9-12
手动分配通道 9-13
介质管理 9-15
使用 RMAN 的连接类型 9-17
不使用恢复目录进行连接 9-18
其它 RMAN 命令行参数 9-20
恢复管理器模式 9-21
RMAN 命令 9-23
作业命令示例 9-25
RMAN 配置设置 9-26
CONFIGURE 命令 9-27
SHOW 命令 9-29
LIST 命令操作 9-30
LIST 命令 9-31
REPORT 命令 9-32
REPORT NEED BACKUP 命令 9-33
恢复管理器程序包 9-34
使用 RMAN 的注意事项 9-35
小结 9-37
练习 9 概览 9-38
10 用户管理的备份
目标 10-2
术语 10-3
用户管理的备份和恢复 10-5
查询视图以获得数据库文件信息 10-6
获得数据库文件信息 10-8
备份方法 10-9
一致的整体数据库备份(关闭的数据库的备份) 10-10
进行一致的整体数据库备份的优点 10-11
进行一致的整体数据库备份 10-13
打开的数据库的备份 10-15
vii
进行打开的数据库的备份的优点 10-16
打开的数据库的备份的要求 10-17
打开的数据库的备份的选项 10-18
进行联机表空间的备份 10-19
结束联机表空间备份 10-20
备份状态信息 10-21
联机表空间备份过程中出现故障 10-23
结束联机备份 10-24
只读表空间备份 10-26
只读表空间备份问题 10-27
与记录和不记录选项相关的备份问题 10-28
手动备份控制文件 10-29
备份初始化参数文件 10-31
使用 DBVERIFY 实用程序验证备份 10-32
DBVERIFY 命令行界面 10-33
小结 10-35
练习 10 概览 10-36
11 RMAN 备份
RMAN 备份概念 11-3
恢复管理器备份 11-4
备份集 11-5
备份集的特性 11-6
备份片 11-7
备份片大小 11-8
BACKUP 命令 11-9
创建备份集 11-12
多元备份集 11-13
备份集的并行化 11-14
双重备份集 11-16
备份集的备份 11-17
归档重做日志文件的备份 11-18
归档重做日志的备份集 11-19
备份约束 11-20
映像副本 11-21
映像副本的特性 11-22
创建映像副本 11-23
映像副本示例 11-24
COPY 命令 11-25
映像复制并行性 11-26
复制整个数据库 11-27
制作增量备份 11-28
差异增量备份的示例 11-30
累积增量备份的示例 11-32

viii
在 NOARCHIVELOG 模式下进行备份 11-33
自动备份 RMAN 控制文件 11-34
备份和映像副本的标记 11-36
RMAN 动态视图 11-37
监视 RMAN 备份 11-38
其它 RMAN 问题 11-40
小结 11-42
练习 11 概览 11-43
12 用户管理的完全恢复
目标 12-2
介质恢复 12-3
恢复步骤 12-4
使用用户管理的过程而执行的还原和数据文件介质恢复 12-5
ARCHIVELOG 模式和 NOARCHIVELOG 模式 12-6
在 NOARCHIVELOG 模式下进行恢复 12-7
在 NOARCHIVELOG 模式下使用重做日志文件备份进行恢复 12-9
在 NOARCHIVELOG 模式下不使用重做日志文件备份进行恢复 12-10
在 ARCHIVELOG 模式下进行恢复 12-11
完全恢复 12-12
在 ARCHIVELOG 模式下进行完全恢复 12-13
确定需要恢复哪些文件 12-14
用户管理的恢复过程:RECOVER 命令 12-16
在恢复过程中使用归档重做日志文件 12-17
使用用户管理的过程将数据文件还原到新的位置 12-19
完全恢复方法 12-20
完全恢复关闭的数据库 12-22
关闭的数据库恢复示例 12-23
恢复打开的数据库(数据库最初是打开的) 12-25
打开的数据库恢复示例 12-26
恢复打开的数据库(数据库最初是关闭的) 12-28
打开的数据库恢复示例 12-29
在没有备份的情况下恢复数据文件 12-31
在没有备份的情况下重新创建丢失的数据文件 12-32
在没有备份的情况下进行恢复的示例 12-33
只读表空间恢复 12-35
只读表空间的恢复问题 12-36
丢失控制文件 12-37
恢复控制文件 12-38
小结 12-39
练习 12 概览 12-40
13 RMAN 完全恢复
目标 13-2
使用 RMAN 执行还原和数据文件介质恢复 13-3
ix
使用 RMAN 恢复 ARCHIVELOG 模式下的数据库 13-4
使用 “恢复向导” (Recovery Wizard) 13-5
使用 RMAN 将数据文件还原到新位置 13-6
还原到新位置 13-7
使用 RMAN 恢复表空间 13-8
表空间恢复 13-9
使用 RMAN 重新定位表空间 13-10
小结 13-12
练习 13-1 和 13-2 概览 13-13
14 RMAN 完全恢复
目标 14-2
不完全恢复概览 14-3
需要进行不完全恢复的情况 14-4
不完全恢复类型 14-5
不完全恢复原则 14-7
不完全恢复和警报日志 14-9
用户管理的不完全恢复的过程 14-10
RECOVER 命令概览 14-11
基于时间的恢复示例 14-12
UNTIL TIME 恢复 14-13
基于取消的恢复示例 14-15
恢复期间使用备份控制文件 14-18
当前重做日志文件丢失 14-21
小结 14-23
练习 14-1 和 14-2 概览 14-24
15 RMAN 不完全恢复
目标 15-2
使用 RMAN 进行数据库的不完全恢复 15-3
指定还原时间 15-4
使用 UNTIL TIME 进行 RMAN 不完全恢复的示例 15-5
使用 UNTIL SEQUENCE 进行 RMAN 不完全恢复的示例 15-7
小结 15-8
练习 15 概览 15-9
16 RMAN 维护
目标 16-2
交叉查对备份和副本 16-3
CROSSCHECK 命令 16-4
删除备份和副本 16-5
DELETE 命令 16-6
删除备份和副本 16-7
更改 RMAN 备份和副本的可用性 16-8
更改可用性状态 16-9
使备份或副本脱离保留策略 16-10
x
CHANGE … KEEP 命令 16-11
将归档重做日志文件和用户管理的备份列入目录 16-12
CATALOG 命令 16-13
不将 RMAN 记录列入目录 16-14
CHANGE … UNCATALOG 命令 16-15
小结 16-16
练习 16 概览 16-17
17 恢复目录的创建和维护
目标 17-2
概览 17-4
恢复目录内容 17-5
使用恢复目录的优点 17-7
创建恢复目录 17-8
使用恢复目录连接 17-11
恢复目录维护 17-12
目录维护 17-13
恢复目录的重新同步 17-14
使用 RESYNC CATALOG 进行重新同步 17-15
重置数据库复本 17-16
恢复目录报告 17-18
查看恢复目录 17-19
已存储的脚本 17-21
脚本示例 17-22
管理脚本 17-23
恢复目录备份 17-24
恢复恢复目录 17-25
小结 17-26
练习 17 概览 17-27
18 在数据库之间传输数据
目标 18-2
Oracle 导出和导入实用程序 18-3
Oracle 导出和导入实用程序概览 18-4
调用导出和导入实用程序的方法 18-6
导出模式 18-7
调用导出实用程序 18-9
使用导出向导 18-12
直接路径导出概念 18-13
直接路径导出功能 18-14
直接路径导出的限制 18-15
指定直接路径导出 18-16
使用导入实用程序进行恢复 18-17
导入模式 18-18
调用导入实用程序 18-19
使用导入向导 18-21
xi
作为 SYSDBA 调用导入实用程序 18-22
导入进程序列 18-23
全球化支持注意事项 18-24
小结 18-25
练习 18 概览 18-26
19 专题讨论
目标 19-2
专题讨论方法 19-4
专题讨论的方法步骤 19-6
业务要求 19-7
排除数据库故障 19-8
排除网络故障 19-10
启用跟踪 19-11
使用跟踪文件 19-12
小结 19-15
练习 19 19-17
附录 A:练习答案
附录 B:专题讨论中出现的情况
附录 C:全球支持公告板
附录 D:将数据加载到数据库中

xii
前言
前言 - 2
配置文件

课前须知
在开始本课程的学习之前,您应该具备以下条件:
• 了解 SQL 命令和基本的操作系统命令(Unix 或 NT)
前提条件
• Oracle 9i 数据库管理基础 I (D11321GC11)(课内)
本课程的组织结构
Oracle 9i 数据库管理基础 II 课程由教师讲解,同时还包括实际操作练习。通过联机演示和笔头练
习,还可强化对课程中介绍的概念和技能的理解。

前言 - 3
相关出版物

Oracle 出版物
书名 编号
Oracle9i Backup and Recovery Concepts A90133-02
Oracle9i Database Administrator's Guide A90117-01
Oracle9i Database Concepts A88856-02
Oracle9i Database Error Messages A90202-02
Oracle9i Database New Features A90120-02
Oracle9i Database Reference A90190-02
Oracle9i Database Utilities A90192-01
Oracle9i Enterprise Manager Administrator’s Guide A88767-02
Oracle9i Enterprise Manager Concepts Guide A88770-01
Oracle9i Enterprise Manager Configuration Guide A88769-01
Oracle9i Net Services Administrator’s Guide A90154-01
Oracle9i Net Services Reference Guide A90155-01
Oracle9i Recovery Manager Reference A90136-02
Oracle9i Recovery Manager User’s Guide A90135-01
Oracle9i SQL Reference A90125-01
Oracle9i User-Managed Backup and Recovery Guide A90134-01
其它出版物
• 系统发行公告牌
• 安装指南和用户指南
• read.me 文件
• International Oracle User’s Group (IOUG) 文章
• Oracle Magazine

前言 - 4
用户管理的完全恢复

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 描述介质恢复
• 在 NOARCHIVELOG 模式下执行恢复
• 在 ARCHIVELOG 模式下执行完全恢复
• 将数据文件还原到其它位置
• 使用归档重做日志文件重新定位和恢复表空间
• 描述对只读表空间的恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 12-2


介质恢复

• 用于恢复丢失的或损坏的当前数据文件或控制文件
• 要求显式调用
• 操作如下所示:
– 从备份还原文件
– 将重做数据从归档重做日志文件和联机重做日志应用到
还原的文件中

Copyright © Oracle Corporation, 2001. All rights reserved.

介质恢复
介质恢复用于恢复丢失的或损坏的当前数据文件或控制文件。它还可用于恢复数据文件脱
机时由于未使用 OFFLINE NORMAL 选项而丢失的那些更改。
还原文件
在还原文件时,其实是使用备份副本替代丢失的或损坏的文件。
文件恢复
在恢复文件时,将重做日志文件中记录的更改应用到所还原的文件中。

Oracle9i 数据库管理基础 II 12-3


恢复步骤
归档重
做日志

联机
重做日志

应用了重做 应用了还原
2 4
数据文件 1 数据文件 1 数据文件 1

数据文件 2 数据文件 2 数据文件 2

数据文件 3 数据文件 3 数据文件 3

还原的数据文件 包含已提交和未提交的 恢复的数据库


事务处理的数据库
1 5
3

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复步骤
1. 从备份还原损坏的或丢失的文件。
2. 根据需要应用归档重做日志文件和联机重做日志文件中的更改。此时将生成还原块。
这称为前滚或高速缓存恢复。
3. 数据库此时可能包含已提交的和未提交的更改。
4. 还原块用于回退任何未提交的更改。这称为回退或事务处理恢复。
5. 数据库现处于已恢复状态。

Oracle9i 数据库管理基础 II 12-4


使用用户管理的过程而执行的还原
和数据文件介质恢复

• 使用操作系统命令还原文件
• 使用 SQL*Plus RECOVER 命令恢复文件

Copyright © Oracle Corporation, 2001. All rights reserved.

使用用户管理的过程而执行的还原和数据文件介质恢复
在还原文件时,使用操作系统命令从备份中复制文件。可以还原数据文件、控制文件、归
档重做日志文件和服务器参数文件。
使用 SQL*Plus RECOVER 命令将重做日志文件应用到还原的文件中。可以执行自动恢复,
或者逐个查看日志文件以应用更改。

Oracle9i 数据库管理基础 II 12-5


ARCHIVELOG 模式和 NOARCHIVELOG
模式
例程
服务器
用户进程 SGA 共享池
进程
共享 SQL
PGA Java 池 大型共享池 和PL/SQL
重做日志 数据字典
数据缓冲区 缓冲区 高速缓存
服务器
用户进程
进程 SMON DBWn PMON CKPT LGWR ARCn
PGA

144 144 144


数据文件 1 控制文件 重做日志
文件1
参数文件 144 145
数据文件 2 重做日志
文件2
144
口令文件 数据文件 3
数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

比较 ARCHIVELOG 模式和 NOARCHIVELOG 模式


您为数据库选择的归档模式将影响到在出现介质故障时您所能做出的恢复选择。
在设置归档日志模式时,应该考虑以下因素:
• 下述情况中,NOARCHIVELOG 模式可能比较合适:
– 容许备份之间的数据损失(在开发、培训期间等)
– 重新应用事务处理(从批处理文件)的速度更快
– 数据极少更改(非 OLTP)
• 下述情况中,ARCHIVELOG 模式则更合适:
– 无法关闭数据库以执行关闭的数据库的备份
– 不允许数据损失
– 使用归档重做日志文件比重新应用事务处理 (OLTP) 更易于恢复
• 缺省情况下,数据库为 NOARCHIVELOG 模式。

Oracle9i 数据库管理基础 II 12-6


在 NOARCHIVELOG 模式下进行恢复

• 在 NOARCHIVELOG 模式下,必须还原以下数据库文件:
– 所有数据文件
– 控制文件

• 也可以还原以下文件:
– 重做日志文件
– 口令文件
– 参数文件

Copyright © Oracle Corporation, 2001. All rights reserved.

当数据库处于 NOARCHIVELOG 模式下时进行恢复


当处于 NOARCHIVELOG 模式的数据库发生介质故障时,需要使用一个有效的、关闭的
数据库的备份进行恢复。在 NOARCHIVELOG 模式下,即使只有一个数据文件被损坏或
丢失,也必须还原所有的 Oracle 数据库文件。确保还原以下所有文件:数据文件和控制
文件。如果您在备份数据文件和控制文件时还备份了联机重做日志文件,则还要还原这些
文件。切记,必须将所有的 Oracle 数据库文件进行同步,以打开该数据库。
仅当口令文件和参数文件被损坏或丢失时,才应该还原它们。
注:对于处于 NOARCHIVELOG 模式下的数据库,如果自上次备份以来没有覆盖任何重
做日志文件,则只需还原受影响的 Oracle 数据文件(如下所示)
• 方案
– 数据库有两个重做日志。
– 关闭的数据库的备份是在日志序列 144 时进行的。
– 当数据库在日志序列 145 时,数据文件 2 丢失。
• 结果
由于日志序列 144 尚未被覆盖,所以可手动还原和恢复数据文件 2。

Oracle9i 数据库管理基础 II 12-7


在 NOARCHIVELOG 模式下进行恢复

• 优点
– 易于操作,出错的风险小
– 恢复时间即为还原所有文件所花的时间

• 缺点
– 数据将丢失,必须手动重新应用
– 将整个数据库还原到上次备份时的状态(关闭的数据库的整
体备份)

Copyright © Oracle Corporation, 2001. All rights reserved.

在 NOARCHIVELOG 模式下进行恢复:优点和缺点
是否决定在 NOARCHIVELOG 模式下操作数据库,应考虑在恢复时的以下优缺点:
优点
• 易于操作,原因是只需从一个备份中还原所有的文件。唯一的风险在于操作本身:还
原错误的备份、覆盖备份、还原之前未关闭数据库或者备份无效。经过充分的培训和
测试,可最大限度地降低此类风险。
• 在给定的硬件和操作系统下,恢复时间只是还原所有文件所花的时间长度。
缺点
• 自上一次备份后用户输入的所有数据将丢失,必须手动重新应用。
• 即使只丢失了一个数据文件,也必须从上次执行的、关闭的数据库的整体备份中还原
整个数据库。

Oracle9i 数据库管理基础 II 12-8


在 NOARCHIVELOG 模式下使用重做
日志文件备份进行恢复
146 146 146 144 144 144
重做日志 数据文件 1 控制文件 重做日志
数据文件 1 控制文件 文件 1
文件 1
145 144 143
146 重做日志
参数文件 数据文件 2 重做日志 参数文件 数据文件 2
文件 2 文件 2
146 144
数据文件 3 数据文件 3
口令文件 口令文件 备份
数据库
从最新的备份进行还原

144 144 144


数据文件 1 控制文件 重做日志
文件 1
144 143
参数文件 数据文件 2 重做日志
文件 2
144
口令文件 数据文件 3
数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

在 NOARCHIVELOG 模式下进行用户管理的恢复
示例
磁盘 2 被损坏,结果丢失了数据文件 2。仅有 2 个联机重做日志文件。
上次备份是在日志序列 144 进行的,当前日志序列号为 146。
不能恢复该数据文件,因为重做日志 144 已被覆盖。如果尝试进行恢复,将会证实这一问
题。因此,必须关闭数据库并还原所有的 Oracle 文件。
SQL> SHUTDOWN ABORT
要还原文件,请:
UNIX: cp /BACKUP/* /databases/db01/ORADATA
Windows NT: copy d:\disk1\backup\*.* d:\disk1\data\
复制结束后,重新启动例程:
SQL> CONNECT / as sysdba
SQL> STARTUP
通知用户,他们需要重新输入自上一次备份以后输入的数据。

Oracle9i 数据库管理基础 II 12-9


在 NOARCHIVELOG 模式下不使用
重做日志文件备份进行恢复

1. 关闭例程。
2. 从数据库的最新而且完整的备份中还原数据文件
和控制文件。
3. 执行基于取消的恢复。
4. 使用 RESETLOGS 选项打开数据库。

Copyright © Oracle Corporation, 2001. All rights reserved.

不使用重做日志文件备份进行恢复
1. 如果数据库已打开,则按如下方式关闭它:
SQL> SHUTDOWN IMMEDIATE
2. 使用操作系统命令还原对数据库的最新而且完整的备份。必须还原所有的数据文件和
控制文件,而不仅仅是还原损坏的文件。以下示例还原了数据库的完整备份:
$ cp /db01/BACKUP/*.dbf /ORADATA/u*/* # restores datafiles
$ cp /db01/BACKUP/*.ctl /ORADATA/u*/* # restores control file
3. 因为您没有备份联机重做日志,所以不能使用数据文件和控制文件还原它们。因此,
Oracle 允许重置联机重做日志,您必须按如下方式仿效进行不完全恢复:
SQL> RECOVER DATABASE UNTIL CANCEL USING BACKUP
CONTROLFILE
SQL> CANCEL
4. 然后,使用 RESETLOGS 选项打开数据库,将当前的重做日志序列重置为 1(如下所
示):
SQL> ALTER DATABASE OPEN RESETLOGS;

Oracle9i 数据库管理基础 II 12-10


在 ARCHIVELOG 模式下进行恢复

• 完全恢复
– 使用重做数据或增量备份
– 将数据库更新到最近的时间点
– 应用所有的重做更改

• 不完全恢复
– 使用备份和重做日志生成数据库的除当前版本之外的
其它版本

Copyright © Oracle Corporation, 2001. All rights reserved.

在 ARCHIVELOG 模式下进行恢复
比较完全恢复和不完全恢复
在执行介质恢复时,您将还原的文件更新到当前时间,或者更新到由用户指定的、除当前
时间之外的时间。
在完全恢复中,使用重做日志文件或增量备份将还原文件更新到最近的时间点。将归档重
做日志文件和联机重做日志文件中包含的重做更改全部应用到这些文件中。可以对数据库、
表空间或数据文件执行完全恢复。
对于不完全恢复,其实就是将数据库恢复到当前时间以前的某一时刻。通常,您并不会应
用备份后生成的所有重做条目。

Oracle9i 数据库管理基础 II 12-11


完全恢复

• 确保要还原的数据文件处于脱机状态。
• 仅还原丢失的或损坏的数据文件。
• 不要还原控制文件、重做日志文件、口令文件
或参数文件。
• 恢复数据文件。

Copyright © Oracle Corporation, 2001. All rights reserved.

当数据库处于 ARCHIVELOG 模式下时进行完全恢复


当处于 ARCHIVELOG 模式的数据库发生介质故障时,需要使用以下内容将数据库完全恢
复到发生故障前那一刻的情形:
• 在将数据库设置为 ARCHIVELOG 模式后进行的有效备份(其中包含丢失的或损坏的
数据文件)
• 从您所使用的备份起至今的所有归档日志
• 包含尚未归档的事务处理的重做日志文件

Oracle9i 数据库管理基础 II 12-12


在 ARCHIVELOG 模式下进行完全恢复

• 优点
– 仅需还原丢失的文件
– 将所有数据恢复到发生故障前那一刻的情形
– 恢复时间即为还原所丢失的文件以及应用所有归档日志文件
所花的时间

• 缺点
– 必须有自您正用于还原的那个备份之后得到的所有归档日志
文件

Copyright © Oracle Corporation, 2001. All rights reserved.

在 ARCHIVELOG 模式下进行恢复:优点和缺点
优点
• 仅需还原丢失或损坏的文件。
• 已提交的数据不会丢失。通过还原上述文件并应用归档日志和重做日志,就可将数据
库恢复至当前的时间点。
• 恢复的总时间就等于还原文件并应用所有归档日志和重做日志所需的时间。
• 可以在数据库打开的情况下进行恢复(包含联机还原段的系统表空间文件和数据文件
除外)。
缺点
必须有自上次备份起到当前时间的所有归档重做日志文件。如果缺失一个文件,则无法执
行完全恢复,原因是必须依次应用所有的归档重做日志文件;即,先应用归档日志 144,
其次是 145,再次是 146,以此类推。

Oracle9i 数据库管理基础 II 12-13


确定需要恢复哪些文件

• 查看 V$RECOVER_FILE 以确定需要恢复哪些数据文件。
• 查看 V$ARCHIVED_LOG 以得到数据库的所有归档重做
日志文件的列表。
• 查看 V$RECOVERY_LOG 以得到进行恢复时所需的所有
归档重做日志文件的列表。

Copyright © Oracle Corporation, 2001. All rights reserved.

确定需要恢复哪些文件
确定需要恢复的数据文件
要确定需要恢复哪些数据文件以及需要从哪里开始恢复,请按如下方式使用
V$RECOVER_FILE 视图:
SQL> SELECT * FROM v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- ------ ------- ---------
2 OFFLINE 288772 02-MAR-01
ERROR 列返回两个可能的值,从而定义需要恢复该文件的原因:
• NULL(如果原因未知)
• OFFLINE NORMAL(如果不需要恢复)
CHANGE# 列返回 SCN(系统更改号),必须从 SCN 开始进行恢复。

Oracle9i 数据库管理基础 II 12-14


确定需要恢复哪些文件(续)
查找要应用的归档日志文件
要查找归档日志文件,可查看 V$ARCHIVED_LOG 以获得所有归档日志文件,或查看
V$RECOVERY_LOG 以获得恢复时所需的归档日志文件:
SQL> SELECT * FROM v$recovery_log;
THREAD# SEQUENCE# TIME ARCHIVE_NAME
------- --------- --------- -------
1 34 02-MAR-01 /…/ORADATA/ARCHIVE1/arch_34.arc
...
1 43 04-MAR-01 /…/ORADATA/ARCHIVE1/arch_43.arc
1 44 04-MAR-01 /…/ORADATA/ARCHIVE1/arch_44.arc
从上面的信息可以看出,要完全恢复数据文件 2,需要使用序列号为 34 之后的所有归档日
志。
注:V$RECOVERY_LOG 包含的信息仅对执行恢复的 Oracle 进程有用。
V$ARCHIVED_LOG 显示控制文件中的归档日志信息,其中包括归档日志名称。

Oracle9i 数据库管理基础 II 12-15


用户管理的恢复过程:
RECOVER 命令

• 恢复装载的数据库:
SQL> RECOVER DATABASE

SQL> RECOVER DATAFILE
2> ‘/ORADATA/u03/users01.dbf’

• 恢复打开的数据库:
SQL> RECOVER TABLESPACE users

SQL> RECOVER DATAFILE
2> ‘/ORADATA/u03/users01.dbf’

Copyright © Oracle Corporation, 2001. All rights reserved.

RECOVER 命令
要恢复数据库,可以发出以下命令之一:
• RECOVER [AUTOMATIC] DATABASE
此命令只能用于恢复关闭的数据库。
• RECOVER [AUTOMATIC] TABLESPACE <NUMBER> | <NAME>
此命令只能用于恢复打开的数据库。
• RECOVER [AUTOMATIC] DATAFILE <‘filename’> | <NAME>
此命令既可用于恢复打开的数据库,又可用于恢复关闭的数据库。
其中:AUTOMATIC 会自动应用归档日志文件和重做日志文件。

Oracle9i 数据库管理基础 II 12-16


在恢复过程中使用归档重做日志文件

• 要更改归档位置,请使用
ALTER SYSTEM ARCHIVE LOG. . . 命令。
• 要自动应用重做日志文件:
– 在开始介质恢复前,先发出 SET AUTORECOVERY ON 命令。
– 当提示输入一个归档日志文件时,请输入 auto。
– 使用 RECOVER AUTOMATIC. . . 命令。

Copyright © Oracle Corporation, 2001. All rights reserved.

在恢复过程中使用归档重做日志文件
在恢复过程中,Oracle 服务器可以手动或自动应用所需的归档重做日志文件和联机重做日
志文件,以重新构建数据文件。在应用重做日志文件之前,Oracle 服务器会建议您提供所
要应用的日志文件的名称。
将归档还原至不同的位置
如果归档重做日志文件不还原到 LOG_ARCHIVE_DEST 目录中,则需要采取以下方法之
一,在开始恢复之前或在恢复过程中通知 Oracle 服务器:
• 在恢复提示下指定位置和名称:
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
• 使用 ALTER SYSTEM ARCHIVE 命令:
SQL> ALTER SYSTEM ARCHIVE LOG START TO <new location>;
• 使用 RECOVER FROM <LOCATION> 命令:
SQL> RECOVER FROM ‘<new location>’ DATABASE

Oracle9i 数据库管理基础 II 12-17


在恢复过程中使用归档重做日志文件(续)
如何自动应用重做日志文件
可以使用以下方法自动应用重做日志文件:
• 在开始介质恢复前,先发出以下 SQL*Plus 语句:
SQL> SET AUTORECOVERY ON
• 当提示输入一个重做日志文件时,请输入 auto:
SQL> RECOVER datafile 4
ORA-00279: change 308810...03/22/01 17:00:14 needed for thread 1
ORA-00289: suggestion : /ORADATA/ARCHIVE1/arch_35.arc
ORA-00280: change 308810 for thread 1 is in sequence #35
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
Log applied.
...
• 使用 RECOVER 命令的 AUTOMATIC 选项:
SQL> RECOVER AUTOMATIC datafile 4
Media recovery complete.

Oracle9i 数据库管理基础 II 12-18


使用用户管理的过程将数据文件
还原到新的位置

• 使用操作系统命令将数据文件还原到新的位置。
• 使用 ALTER DATABASE RENAME FILE 命令将更改
记录到控制文件中。

Copyright © Oracle Corporation, 2001. All rights reserved.

用于将数据文件还原到新位置的、用户管理的过程
1. 使用操作系统命令将文件还原到新的位置。
注:在 UNIX 环境中,在发出 ALTER DATABASE RENAME 命令之前,文件必
须位于新位置。在 Windows NT 环境中,则不必如此。
2. 启动该例程并装载数据库。
3. 使用 ALTER DATABASE 命令来更新控制文件,将其更新为新的文件名或更新到
新的位置:
SQL> ALTER DATABASE RENAME FILE
2> ‘/ORADATA/u03/users01.dbf‘
3> to ‘/ORADATA/u04/users01.dbf‘;

Oracle9i 数据库管理基础 II 12-19


完全恢复方法

• 恢复关闭的数据库,用于:
– 系统数据文件
– 还原段数据文件
– 整个数据库

• 恢复打开的数据库,并且数据库最初是打开的
(用于恢复丢失的文件)
• 恢复打开的数据库,并且数据库最初是关闭的
(用于在发生硬件故障后进行恢复)
• 在没有数据文件备份的情况下恢复数据文件

Copyright © Oracle Corporation, 2001. All rights reserved.

完全恢复方法
执行完全恢复的方法有 4 种:
方法 1:恢复关闭的数据库
此方法适用于以下情况:
• 数据库不是全天候(每周 7 天、每天 24 小时)运行。
• 恢复的文件属于系统表空间或还原段表空间。
• 需要恢复整个数据库或大部分数据文件。
方法 2:恢复打开的数据库(数据库最初是打开的)
此恢复方法一般在以下情况下使用:
• 发生了文件损坏、文件意外丢失或介质故障,但未导致数据库关闭。
• 数据库全天候(每周 7 天、每天 24 小时)运行。必须最大限度地减少数据库的停机时
间。
• 恢复的文件不属于系统表空间或还原段表空间。

Oracle9i 数据库管理基础 II 12-20


完全恢复方法(续)
方法 3:恢复打开的数据库(数据库最初是关闭的)
此恢复方法一般在以下情况下使用:
• 某个介质故障或硬件故障导致系统关闭。
• 数据库全天候(每周 7 天、每天 24 小时)运行。必须最大限度地减少数据库的停机时
间。
• 还原的文件不属于系统表空间或还原段表空间。
方法 4:在没有备份的情况下恢复数据文件
此恢复方法一般在以下情况下使用:
• 介质故障或用户故障导致丢失了从未备份过的数据文件。
• 自该文件创建以来的所有归档日志都存在。
• 还原的文件不属于系统表空间或还原段表空间。
注:恢复过程中,磁盘中必须有 Oracle 服务器所需的所有归档日志文件。如果这些文件在
备份磁带中,则必须先还原这些文件。

Oracle9i 数据库管理基础 II 12-21


完全恢复关闭的数据库

恢复关闭的数据库,用于:
• 系统表空间数据文件
• 回退段数据文件
• 整个数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复关闭的数据库
在以下情况中,通常将此恢复方法与 RECOVER DATABASE 命令或 RECOVER DATAFILE
命令一起使用:
• 恢复的文件属于系统表空间或回退段表空间。
• 需要恢复整个数据库或大部分数据文件。
• 数据库不是全天候(每周 7 天、每天 24 小时)运行。

Oracle9i 数据库管理基础 II 12-22


关闭的数据库恢复示例

146 146 146


数据文件 1 控制文件 重做日志 1 关闭该例程
文件 1
2 还原数据文件 1
146 145
数据文件 2 重做日志
文件 2 (日志序列 144)
146
数据文件 3 144 146 146
3 重做日志
数据文件 1 控制文件
关闭的数据库 文件 1
146 3 145
数据文件 2 重做日志 144
146 146 146 文件 2
3
归档日志
数据文件 1 控制文件 重做日志 146
文件 1 文件
数据文件 3
146 145
数据文件 2 重做日志 装载的数据库
文件 2
146
数据文件 3 4 打开数据库
恢复的数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

关闭的数据库恢复示例
已确定 u01(数据文件 1 存储在其中)包含被损坏的块。通过查询 V$DATAFILE 和
V$TABLESPACE 视图,可以发现数据文件 1 是系统表空间所属的文件之一。请按照以下
步骤恢复数据库:
1. 如果例程尚未关闭,请按如下方式发出 SHUTDOWN 命令:
SQL> SHUTDOWN ABORT
2. 从备份(可用的最新备份)中还原该文件:
UNIX> host cp /BACKUP/system01.dbf /ORADATA/u01
Windows NT > host copy c:\backup\df1.dbf d:\data\
3. 以 “装载” 模式启动例程,并恢复该数据文件:
SQL> STARTUP MOUNT
SQL> RECOVER DATABASE
or SQL> RECOVER DATAFILE ‘/ORADATA/u01/system01.dbf‘
ORA-00279: change 148448 ...03/29/01 17:04:20 needed for thread
ORA-00289: suggestion : /ORADATA/ARCHIVE1/arch_144.arc
ORA-00280: change 148448 for thread 1 is in sequence #144
Log applied.
...
Media recovery complete.

Oracle9i 数据库管理基础 II 12-23


关闭的数据库恢复示例(续)
要将数据文件恢复到发生故障前的那一刻,应该应用所有需要的归档日志和重做日
志。
4. 恢复结束后,所有数据文件都将实现同步。打开数据库。
SQL> ALTER DATABASE OPEN;
此时,可通知用户数据库可以使用了,并告诉他们重新输入系统发生故障前未提交的
所有数据。
注:在使用此恢复方法进行恢复的期间,必须关闭数据库;在恢复进程中,整个数据库都
无法让用户进行访问。

Oracle9i 数据库管理基础 II 12-24


恢复打开的数据库(数据库最初是打开的)

此方法适用于以下情况:
• 数据库当前已打开
• 在恢复期间数据库将一直保持打开状态
• 介质故障不会影响 SYSTEM 表空间

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复打开的数据库
恢复打开的数据库(数据库最初是打开的)
此恢复方法一般在以下情况下使用:
• 未导致数据库关闭的文件损坏、文件意外丢失或介质故障。
• 数据库全天候(每周 7 天、每天 24 小时)运行。必须最大限度地减少数据库的停机时
间。
• 受到影响的文件不属于系统表空间或还原/回退段表空间。

Oracle9i 数据库管理基础 II 12-25


打开的数据库恢复示例
146 146 146
数据文件 1 控制文件 重做日志 1 将数据文件 2 脱机
文件 1
146 145 还原数据文件 2
数据文件 2 重做日志 2
文件 2 (日志序列 144)
146
数据文件 3 146 146 146
数据文件 1 控制文件 重做日志
打开的数据库 3 文件 1
144 145
数据文件 2 重做日志
146 146 146
3 文件 2 144
数据文件 1 控制文件 重做日志 146 3 归档日志
文件 1 数据文件 3 文件
146 145
数据文件 2 重做日志 打开的数据库
文件 2
146
数据文件 3 4 将数据文件 2 联机
恢复的数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

打开的数据库恢复示例
数据库当前已打开,并且已使用操作系统命令误删了数据文件 2。因为数据库当前已打
开,所以可以使用以下命令确定该数据文件属于哪个表空间:
SQL> SELECT file_id f#, file_name,
2> tablespace_name tablespace, status
3> FROM dba_data_files;
F# FILE_NAME TABLESPACE STATUS
--- ------------------------- ---------- ---------
1 /disk1/data/system01.dbf SYSTEM AVAILABLE
2 /disk2/data/df2.dbf USER_DATA AVAILABLE
3 /disk1/data/rbs01.dbf RBS AVAILABLE
...

Oracle9i 数据库管理基础 II 12-26


打开的数据库恢复示例(续)
1. 发出以下查询,以确定是否需要将数据文件 2 脱机:
SQL> SELECT d.file# f#, d.name, d.status, h.status
2> FROM v$datafile d, v$datafile_header h
3> WHERE d.file# = h.file#;
F# D.NAME D.STATUS H.STATUS
--- ------------------------- ---------- ---------
1 /disk1/data/system01.dbf SYSTEM ONLINE
2 /disk2/data/df2.dbf RECOVER OFFLINE
3 /disk1/data/rbs_01.dbf ONLINE ONLINE
...
在这种情况下,Oracle 服务器已将该文件脱机。
2. 因为该文件处于脱机状态,所以此时可从备份中还原该文件:
UNIX > host cp /disk1/backup/df2.dbf /disk2/data/
Windows NT > host copy c:\backup\df2.dbf d:\data\
3. 使用 RECOVER 命令将归档和重做日志应用到还原的数据文件中。
SQL> RECOVER DATAFILE ‘/disk2/backup/df2.dbf‘
or SQL> RECOVER TABLESPACE user_data
4. 恢复结束后,所有数据文件都将实现同步。将该数据文件联机:
SQL> ALTER DATABASE DATAFILE ‘/disk2/data/df2.dbf‘ ONLINE;
或 SQL> ALTER TABLESPACE user_data ONLINE;

• 有时 Oracle 服务器会检测到某个文件有问题并自动将该文件脱机。在进行恢复之前,
一定要查看警报日志以检查是否有任何错误,并检查文件的状态;可能需要恢复脱机
文件。
• 在将表空间脱机后,就会将其所有数据文件脱机,并且无法访问该表空间中包含的任
何数据。对于具有多个文件的表空间来说,如果将其中一个数据文件脱机,则只有该
数据文件中包含的数据无法进行访问,而表空间仍然可以使用。

Oracle9i 数据库管理基础 II 12-27


恢复打开的数据库(数据库最初是关闭的)

此方法适用于以下情况:
• 数据库当前已关闭
• 将在恢复期间打开数据库
• 介质故障不会影响 SYSTEM 表空间

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复打开的数据库
恢复打开的数据库(数据库最初是关闭的)
此恢复方法一般在以下情况下使用:
• 介质或硬件故障导致系统关闭。
• 数据库全天候(每周 7 天、每天 24 小时)运行。必须最大限度地减少数据库的停机时
间。
• 损坏的文件不属于系统表空间或还原段表空间。

Oracle9i 数据库管理基础 II 12-28


打开的数据库恢复示例
146 146 146 1 装载数据库
数据文件 1 控制文件 重做日志
文件 1 2 将数据文件 2 脱机
146 145
数据文件 2 重做日志 3
文件 2 打开数据库
146 4 还原数据文件 2
数据文件 3

关闭的数据库 146 146 146


数据文件 1 控制文件 重做日志
5 文件 1
146 146 146 144 145
数据文件 2 5 重做日志
数据文件 1 控制文件 重做日志
文件 2 144
文件 1
146 145 146 5 归档日志
重做日志 数据文件 3 文件
数据文件 2
文件 2 打开数据库
146
数据文件 3 6 将数据文件 2 联机
恢复的数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

打开的数据库恢复示例
您刚刚确定介质故障是由于某个磁盘控制器发生故障而引起的,该控制器只包含磁盘 2。
根据您对数据库的了解,您知道数据文件 2 不是系统数据文件或还原段数据文件,并且并
不会由于无法使用该文件而妨碍用户运行其月末报告。
1. 装载该数据库。由于数据文件 2 无法打开,因此无法打开该数据库。
SQL> STARTUP MOUNT
Database mounted.
2. 如果该数据文件未脱机,则无法打开数据库。因此,必须将该文件脱机。您已经
查询了 V$DATAFILE 并确定该文件处于联机状态。
必须发出以下命令:
SQL> ALTER DATABASE datafile ‘/disk2/data/df2.dbf‘ offline;
注:此时不能使用 ALTER TABLESPACE 命令,原因是数据库尚未打开。
3. 然后就可以打开数据库,使用户能够访问系统:
SQL> ALTER DATABASE OPEN;

Oracle9i 数据库管理基础 II 12-29


打开的数据库恢复示例(续)
4. 然后,还原该文件。因为无法将文件还原到损坏的磁盘 2 上,所以将它还原到磁盘
3 上:
UNIX > host cp /disk1/backup/df2.dbf /disk3/data/
Windows NT > host copy c:\backup\df2.dbf e:\data\
现在必须通知 Oracle 服务器新文件的位置:
SQL> ALTER DATABASE rename file ‘/disk2/data/df2.dbf‘
2> to ‘/disk3/data/df2.dbf‘;
如果数据库已打开并且需要恢复表空间,请发出以下查询,以确定该数据文件所属的
表空间的名称:
SQL> SELECT file_id f#, file_name,
2> tablespace_name tablespace, status
3> FROM dba_data_files;
F# FILE_NAME TABLESPACE STATUS
--- ------------------ --------- -------
1 /disk1/data/system_01.dbf SYSTEM AVAILABLE
2 /disk3/data/df2.dbf USER_DATA AVAILABLE
3 /disk1/data/rbs01.dbf RBS AVAILABLE
5. 使用 RECOVER 或 ALTER DATABASE RECOVER 命令开始将归档重做日志文件和联
机重做日志文件应用到还原的数据文件中。
SQL> RECOVER DATAFILE ‘/disk3/data/df2.dbf‘
或 SQL> RECOVER TABLESPACE user_data
6. 恢复结束后,所有数据文件都将实现同步。将该数据文件联机:
SQL> ALTER DATABASE datafile ‘/disk3/data/df2.dbf‘ online;
或 SQL> ALTER TABLESPACE user_data online;

Oracle9i 数据库管理基础 II 12-30


在没有备份的情况下恢复数据文件

• 从未备份过的数据文件丢失了
• 当文件属于 SYSTEM 表空间时不能使用
• 如果重新创建了控制文件,则不能使用

Copyright © Oracle Corporation, 2001. All rights reserved.

在没有备份的情况下恢复数据文件
此恢复方法一般在下列情况使用:
• 介质故障或用户故障导致丢失了从未备份过的数据文件
• 自该文件创建以来的所有归档日志都存在
• 受到影响的文件不属于系统表空间或还原段表空间

Oracle9i 数据库管理基础 II 12-31


在没有备份的情况下重新创建丢失的数据文件

• 当丢失的数据文件由于从未备份过而无法还原时使用。
• 对丢失的数据文件的说明仍保留在数据字典和控制文件
中。
• 重新创建该数据文件:
SQL> ALTER DATABASE CREATE DATAFILE ‘filename’;

• 使用另一个文件名重新创建该数据文件:
SQL> ALTER DATABASE CREATE DATAFILE ‘filename’
AS ‘new file name’;

Copyright © Oracle Corporation, 2001. All rights reserved.

在没有备份的情况下重新创建丢失的数据文件
• 如果定期备份中不包含新的表空间或数据文件,或者该数据文件的备份丢失了,则通
常使用该方法。
• 使用 ALTER DATABASE 命令,用相同的名称重新创建该数据文件:
SQL> ALTER DATABASE CREATE DATAFILE
2> ‘/ORADATA/u03/users01.dbf‘;
将使用数据字典中记录的原始文件名创建该文件。
• 使用以下版本重新创建该数据文件,但使用新的文件名或位置:
SQL> ALTER DATABASE CREATE DATAFILE
2> ‘/ORADATA/u03/users01.dbf‘
3> AS ‘/ORADATA/u04/users01.dbf‘;

Oracle9i 数据库管理基础 II 12-32


在没有备份的情况下进行恢复的示例
146 146 146
数据文件 1 控制文件 重做日志
文件 1 1 将数据文件或表空间脱机
146 145
数据文件 2 重做日志
文件 2 2 重新创建数据文件
146
数据文件 3 146 146 146
数据文件 1 控制文件 重做日志
146
数据文件 4 3 文件 1
打开的数据库 144 145
数据文件 2 3 重做日志
文件 2
146 146 146
重做日志 146
数据文件 1 控制文件 数据文件 3
文件 1
146 145 144
数据文件 2 重做日志 数据文件 4 3 归档日志
146 文件 2 文件
数据文件 3 打开的数据库

146 4 将数据文件或表空间
数据文件 4 联机
恢复的数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

在没有备份的情况下进行恢复的示例
数据文件 4(在磁盘 1 上)丢失了。在通过磁带还原该数据文件时,出现一个错误,指
明该文件以前没有进行备份。您找到两天前创建 TABLE_DATA 表空间的那个 DBA,结
果发现该表空间中包含重要的用户数据,但它从未被纳入备份策略中。由于数据文件 4
不是系统数据文件或回退段数据文件,并且您有过去两天的所有归档日志,因此,可以
按如下方式进行恢复:
1. 如果数据库已关闭,则装载该数据库、将该数据文件(无备份)脱机,然后打开数
据库。这将允许不需要 TABLE_DATA 表空间的用户对系统执行操作。如果数据库
已打开,则将该数据文件或表空间脱机。
注:如果数据库已打开,则必须包含 “立即” (IMMEDIATE) 选项,以避免数据库写
入器试图写入到一个并不存在的文件中:
SQL> ALTER TABLESPACE table_data OFFLINE IMMEDIATE;
Tablespace altered.

Oracle9i 数据库管理基础 II 12-33


在没有备份的情况下进行恢复的示例(续)
查询 V$RECOVER_FILE 确定恢复状态,以检查备份的状态:
SQL> SELECT * FROM v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- -------------- ------- ----
4 OFFLINE FILE NOT FOUND 0
2. 发出以下命令来重新创建该文件:
SQL> ALTER DATABASE create datafile ‘/disk2/DATA/df4.dbf’
2> as ‘/disk1/DATA/df4.dbf‘;
Database altered.
SQL> SELECT * FROM v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- ------------------ ---------- ------
4 OFFLINE 248621 01-DEC-97
3. 用 RECOVER 或 ALTER DATABASE RECOVER 命令,开始将归档重做日志文件和联机
重做日志文件应用到重新创建的数据文件中:
SQL> RECOVER TABLESPACE table_data;
要将数据文件恢复到发生故障前的那一刻,应该应用所有需要的归档日志和重做日
志。此时所有数据文件都将实现同步。
4. 恢复完成后,将该表空间联机:
SQL> ALTER TABLESPACE table_data ONLINE;
所有数据现已恢复。将文件包括在备份策略中,并通知用户可以再次使用表空间了。

Oracle9i 数据库管理基础 II 12-34


只读表空间恢复

情况 1 只读

情况 2 只读 读写

情况 3 读写 只读

备份 1 备份 2 恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复情况
情况 1:被恢复的表空间现在是只读的,并且在上次备份时也是只读的。在这种情况下,
只需从备份中还原表空间。无需应用任何重做信息。
情况 2:被恢复的表空间现在可读写,但在上次备份时则是只读的。在这种情况下,需要
从备份中还原表空间,并应用自表空间被设置为可读写状态以来的重做信息。
情况 3:被恢复的表空间现在是只读的,但在上次备份时是可读写的。因为您应该在将表
空间设置为只读状态后始终对它进行备份,所以不应该遇到这种情况。但是,如果确实出
现这种情况,则必须从备份中还原表空间,并将其恢复到被设置为只读状态前的那一刻。

Oracle9i 数据库管理基础 II 12-35


只读表空间的恢复问题

当出现以下情况时,必须为只读表空间考虑一些特殊事项:
• 重新创建控制文件
• 重命名数据文件
• 使用备份的控制文件

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复只读表空间
重新创建控制文件
如果您需要用 CREATE CONTROL FILE 命令重新创建控制文件,并且您的数据库有只读
表空间,则必须按照特殊的过程进行操作。发出 ALTER DATABASE BACKUP
CONTROLFILE TO TRACE 命令以获得这些过程的列表。
重命名数据文件
如果不能将只读数据表空间中的数据文件副本还原到正确的目标位置,则可以使用
ALTER DATABASE RENAME 命令将这些文件放到新的位置。
备份控制文件
带备份控制文件的只读表空间与脱机正常表空间的恢复过程实质上是相同的,只是您需要
在打开数据库后将表空间联机。

Oracle9i 数据库管理基础 II 12-36


丢失控制文件

如果出现以下情况,则可能需要创建控制文件:
• 所有控制文件由于某个故障而丢失
• 需要更改数据库的名称
• 需要更改控制文件中的当前设置

Copyright © Oracle Corporation, 2001. All rights reserved.

丢失控制文件
以下是三种可能需要您恢复或重新创建控制文件的情形:
• 所有控制文件由于某个故障而丢失。如果您已正确地多元备份了控制文件并将这些文
件分布到多个物理设备上,则很少会遇到这种问题。
• 您需要更改数据库的名称。如果数据库将成为分布式环境的一部分,并且其它数据库
具有相同的名称,则有必要更改数据库的名称。如果是出于恢复目的而还原数据库,
则可能也需要更改其名称。
• 您需要更改控制文件中的设置。控制文件中的很多设置是在文件创建之时确定下来的。
在创建了控制文件后,就不能动态地更改这些设置;若要更改这些设置,必须重新创
建控制文件。

Oracle9i 数据库管理基础 II 12-37


恢复控制文件

在丢失控制文件后进行恢复的方法:
• 使用当前的控制文件
• 创建新的控制文件
• 使用备份的控制文件

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复控制文件
有三种方法可以用于还原和恢复控制文件:
• 用当前副本还原丢失的文件。这种方法假定您没有丢失所有的控制文件。
• 使用 CREATE CONTROLFILE 命令创建一个新文件。要完成此项操作必须知道数据库
的所有文件。间或备份控制文件以进行跟踪有助于完成此过程。
• 使用 RECOVER DATABASE USING BACKUP CONTROLFILE 命令。如果丢失了所有
的控制文件,则需要使用此命令。
注:如果使用镜像的数据文件正确配置数据库,则丢失所有控制文件的可能性将降至最低。

Oracle9i 数据库管理基础 II 12-38


小结

在这一课中,您应该能够掌握:
• 确定需要使用哪种恢复类型
• 确定需要还原和恢复哪些文件
• 恢复 NOARCHIVELOG 模式下的数据库
• 恢复 ARCHIVELOG 模式下的数据库
• 如果原位置不可用,将数据文件还原到其它位置

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 12-39


练习 12 概览

这两个练习涉及以下主题:
• 当数据库处于 NOARCHIVELOG 模式时对数据库执行完
全恢复
• 当数据库处于 ARCHIVELOG 模式时对数据库执行完全
恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 12-40


练习 12-1 用户管理的完全恢复
完全恢复数据库:NOARCHIVELOG 模式
1. 关闭数据库并禁用自动归档。启动该例程并装载数据库。将数据库设置为
NOARCHIVELOG 模式,然后打开数据库。发出 ARCHIVE LOG LIST 命令以确认
其状态。
2. 关闭数据库,并使用操作系统命令执行关闭的数据库的完全备份(目的是将文件复制
到 $HOME/BACKUP/NOARCH 目录中)。启动该例程,装载并打开数据库。
3. 运行 $HOME/STUDENT/LABS/lab12_01_03.sql 脚本。此脚本在 HR 方案中新建
一个名为 EMPHIST 的表,并向该表中添加行。查询该表以获取该表中的行数。
4. 以 system/manager 身份进行连接,并执行
$HOME/STUDENT/LABS/lab12_01_04.sql 脚本以获取那些包含 EMPHIST 表的
数据文件的名称。
5. 运行 $HOME/STUDENT/LABS/lab12_01_05.sql 脚本以模拟出现故障时的情况。
6. 尝试重新启动该例程并打开数据库。结果怎样?
7. 关闭数据库,使用相应的操作系统命令将当前数据库替换为最新的备份(提示:从
NOARCH 目录复制到 ORADATA 目录)。
8. 启动例程,装载并打开数据库。
9. 以 hr/hr 身份连接到数据库,并对 EMPHIST 表执行查询。结果怎样?为什么?
10. 关于脱机备份和恢复 NOARCHIVELOG 模式下的数据库,您可以得出什么结论?

Oracle9i 数据库管理基础 II 12-41


练习 12-2 用户管理的完全恢复
完全恢复数据库:ARCHIVELOG 模式
1. 查询 V$DATABASE 视图以确定数据库的 ARCHIVELOG 模式。使用 ARCHIVE LOG
LIST 命令检查自动归档的状态。
2. 关闭该例程,并配置自动归档。装载数据库并使用 ALTER DATABASE 命令将数据库
设置为 ARCHIVELOG 模式。
3. 使用 ARCHIVE LOG LIST 命令验证您所做的更改。记下当前的日志序列号。
4. 执行关闭的数据库的备份。将该备份存储在 $HOME/BACKUP/UMAN 目录中。
5. 运行 $HOME/STUDENT/LABS/lab12_02_05.sql 脚本。此脚本在 HR 方案中新建
一个名为 EMPHIST 的表,并向该表中添加行。对 EMPHIST 表发出查询,以确定该
表中包含多少行。
6. 以 system/manager 身份进行连接,然后运行
$HOME/STUDENT/LABS/lab12_02_06.sql 脚本,并记下与那个包含 EMPHIST
表的表空间相关联的数据文件。
7. 运行 $HOME/STUDENT/LABS/lab12_02_07.sql 脚本以模拟出现硬件故障的情
况。
8. 尝试启动例程并打开数据库。结果怎样?
9. Oracle 服务器因发现介质故障而无法找到 USERS 表空间的文件。由于已经启用归
档,您此时可执行完全恢复。从在步骤 4 中制作的备份中还原 USERS 表空间的数据
文件。
10. 用 RECOVER DATABASE 命令恢复数据库。
11. 恢复完成后,打开数据库以便让所有用户可以使用。
12. 查询 DBA_TABLESPACES 视图,以查看表空间 USERS 是否联机。
13. 对 HR.EMPHIST 表执行查询。结果怎样?
14. 查询 V$LOG 视图并记下序列号。将这个值与步骤 3 中的值进行比较。关于完全恢
复,您可以得出什么结论?

Oracle9i 数据库管理基础 II 12-42


练习 12-3 用户管理的完全恢复
选择练习:恢复打开的数据库
1. 运行 $HOME/STUDENT/LABS/lab12_03_01.sql 脚本以模拟出现硬件故障的情
况。
2. 尝试重新启动该例程并打开数据库。结果怎样?
3. Oracle 服务器因发现介质故障而无法找到 USERS 表空间的文件。您此时可以执行一
次完全恢复。将 USERS 表空间的数据文件脱机。
4. 打开数据库以便让所有用户可以使用。
5. 将 USERS 表空间脱机,然后从备份中还原所有的数据文件。
6. 用 RECOVER TABLESPACE 命令恢复表空间。
7. 将 USERS 表空间重新联机。
8. 对 HR.EMPHIST 表执行查询。

Oracle9i 数据库管理基础 II 12-43


练习 12-4 用户管理的完全恢复
选择练习:在添加新的数据文件后进行恢复
1. 以用户 SYSTEM 的身份运行 $HOME/STUDENT/LABS/lab12_04_01.sql 脚本,目的
是执行以下操作:
– 用新的数据文件创建新的表空间
– 在新的表空间的 HR 方案中创建一个名为 NEW_EMP 的表
– 模拟丢失新数据文件的情况
2. 以 hr/hr 身份进行连接,并更新 NEW_EMP 表中的行(如下所示):结果怎样?
SQL> UPDATE new_emp
2> SET salary = salary * 1.1;
Oracle 服务器找不到 NEW_USERS 表空间的文件。
3. 在重新创建没有备份的文件后,可以执行完全恢复。可以将 NEW_USERS 表空间的数据文
件脱机,或者将该表空间脱机,这是因为该表空间中仅包含了一个数据文件。
注:必须包含 IMMEDIATE 选项,这样,数据库写入器就不会写入到一个不存在的文件中
了。
通过查询 V$RECOVER_FILE 来确认恢复状态。
4. 现在您必须重新创建文件。
5. 使用 RECOVER TABLESPACE 命令将重做日志应用到该数据文件中。
6. 恢复完成后,将该表空间联机。
7. 按如下方式再次更新 HR.NEW_EMP 表中的行:
SQL> UPDATE new_emp
2> SET salary = salary * 1.1;
8. 以 system/manager 身份进行连接,并删除 NEW_USERS 表空间及其关联的数据文件,
以便为以后的练习做好准备。

Oracle9i 数据库管理基础 II 12-44


练习 12-5 用户管理的完全恢复
选择练习:在联机备份过程中从故障中恢复
在本练习中,将模拟以下情形:在对 SAMPLE 表空间执行联机备份时数据库出现故障。需
要发出相应的命令来恢复和重新打开数据库。
1. 通过在 SQL*Plus 中发出相应的命令,从而开始对 SAMPLE 表空间进行联机备份。
2. 在 $HOME/BACKUP/UMAN 目录中,为属于 SAMPLE 表空间的文件制作操作系统备
份。
3. 在 SQL*Plus 中发出 SHUTDOWN ABORT 命令。
4. 启动该例程并装载数据库。
5. 查询 V$BACKUP 以确定联机备份中是否有任何文件。
6. 发出相应的命令来终止备份,并取消冻结数据文件头。查询 V$BACKUP 以检查数据
文件的状态。
7. 为用户打开数据库。

Oracle9i 数据库管理基础 II 12-45


Oracle9i 数据库管理基础 II 12-46
RMAN 完全恢复

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 描述 RMAN 在还原和恢复操作中的用法
• 在 ARCHIVELOG 模式下执行完全恢复
• 将数据文件还原到其它位置
• 使用归档重做日志文件重新定位和恢复表空间

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 13-2


使用 RMAN 执行还原和数据文件介质恢复

• 使用 RMAN RESTORE 命令从备份集或映像副本


还原文件
• 使用 RMAN RECOVER 命令恢复文件

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RMAN 执行还原和数据文件介质恢复
RMAN 自动执行还原文件的过程。发出 RESTORE 命令后,RMAN 将使用服务器会话还
原正确的备份和副本。RMAN 资料档案库用于选择最完整的可用备份集或映像副本来进
行还原。缺省情况下,如果某一文件已处于正确位置且其文件头包含有正确的信息,则
RMAN 将不还原该文件。而在 Oracle9i 以前的版本中,将始终还原该文件。
发出 RMAN RECOVER 命令后,RMAN 将应用联机重做日志文件和归档重做日志文件中
的更改,或使用增量备份来恢复已还原的文件。
使用 RMAN 可以在以下级别执行恢复:
• 数据库
• 表空间
• 数据文件
在完全恢复过程中,归档重做日志文件和联机重做日志文件中的所有重做条目都将用于恢
复数据库。损坏的文件将从备份进行还原,而日志文件则用于将数据文件更新到当前时间
点。

Oracle9i 数据库管理基础 II 13-3


使用 RMAN 恢复 ARCHIVELOG
模式下的数据库

rman target /
RMAN> STARTUP MOUNT
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RMAN 还原 ARCHIVELOG 模式下的数据库


在该示例中,使用 RMAN 来还原并恢复整个数据库。
该示例假定:
• 磁盘上有使用 RMAN 生成的完全备份。
• 当前控制文件未损坏,无需还原。
• 所有数据文件都已损坏或丢失。

Oracle9i 数据库管理基础 II 13-4


使用 “恢复向导” (Recovery Wizard)

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


您可使用 “恢复向导” (Recovery Wizard) 还原和恢复数据库。如果已连接至 Management
Server,则可通过 “Oracle Enterprise Manager 控制台” (Oracle Enterprise Manager Console)
来访问该向导。在 “恢复选项” (Recovery Selection) 页上,指定数据库、表空间或数据文
件。数据库的状态决定了哪些选项可用。该向导将引导您完成指定,然后通过 Oracle
Enterprise Manager 提交恢复作业。

Oracle9i 数据库管理基础 II 13-5


使用 RMAN 将数据文件还原到新位置

• 使用 SET NEWNAME 命令可将数据文件还原到新位置。

SET NEWNAME FOR DATAFILE 1 to


‘/<newdir>/system01.dbf’;

• 使用 SWITCH 命令可在控制文件中记录更改。
SWITCH DATAFILE ALL;

Copyright © Oracle Corporation, 2001. All rights reserved.

将数据文件还原到新位置
如果遇到介质故障,如磁盘驱动器丢失,则可能需要将数据文件还原到新位置。
示例
1. 连接到 RMAN。
rman target
2. 装载数据库。
RMAN> STARTUP MOUNT
3. 使用 RMAN 将数据文件还原到新位置并在控制文件中记录更改。
run{
set newname for datafile 1 to ‘/<newdir>/system01.dbf’;
restore database;
switch datafile all;
recover database;
alter database open; }

Oracle9i 数据库管理基础 II 13-6


还原到新位置

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


您可使用 “恢复向导” (Recovery Wizard) 还原和恢复数据库。通过使用 “重命名” (Rename)
页,可将选定数据文件还原到新位置。将数据文件还原到新位置后,它们将被当作数据文
件副本。因此,切换操作将自动执行。

Oracle9i 数据库管理基础 II 13-7


使用 RMAN 恢复表空间

使用下面的 RMAN 命令还原和恢复表空间:


• RESTORE TABLESPACE
• RECOVER TABLESPACE
run{
sql “alter tablespace users offline immediate”;
restore tablespace users;
recover tablespace users;
sql “alter tablespace users online”;
}

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RMAN 恢复表空间
如果已确定需要还原和恢复 USERS 表空间,则可发出下面的 RMAN 命令:
run{
sql “alter tablespace users offline immediate”;
restore tablespace users;
recover tablespace users;
sql “alter tablespace users online”;
}

Oracle9i 数据库管理基础 II 13-8


表空间恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


您可使用 “恢复向导” (Recovery Wizard) 还原和恢复数据库。在 “恢复选项” (Recovery
Selection) 页上,指定表空间恢复。通过 “表空间” (Tablespaces) 页,可选择要恢复的表空
间。您可从 “可用表空间” (Available Tablespaces) 窗口中显示的表空间列表中进行选择。

Oracle9i 数据库管理基础 II 13-9


使用 RMAN 重新定位表空间

• 使用 SET NEWNAME 命令还原文件。


• 使用 SWITCH 命令在控制文件中记录新名称。
• 使用 RECOVER TABLESPACE 命令恢复表空间的
数据文件。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RMAN 重新定位表空间
如果由于磁盘故障而无法访问某一数据文件,则需要将其还原到一个新位置或切换到现有
的映像副本。
如果由于某个驱动器的磁盘空间不足,或需要重新组织数据库来提高性能,因而您需要重
新定位表空间,上述过程也非常有用。
示例
您注意到,u03 已经损坏,但数据库仍然打开。有时用户会抱怨无法访问编号为 3 的数据
文件中的信息。
按照以下过程操作可将该数据文件还原到一个新位置:
1. 使用以下命令检查 u03 上数据文件的位置和大小:
SQL> SELECT file#, name, bytes FROM v$datafile;
FILE# NAME BYTES
----- ------------------------ ----------
1 /ORADATA/u01/system01.dbf 120586240
2 /ORADATA/u02/undotbs.dbf 31457280
3 /ORADATA/u03/users01.dbf 5242880
...
确定 u04 上是否有足够的空间来容纳数据文件 3。

Oracle9i 数据库管理基础 II 13-10


使用 RMAN 重新定位表空间(续)
2. 确保文件(如果需要,则为表空间)处于脱机状态,以便可以使用 RESTORE 命令成
功还原。
3. 因为文件已复制到一个新位置(使用 SET NEWNAME 命令),所以必须使用 SWITCH
命令通知 Oracle 服务器新的文件位置,以使该文件成为当前文件。
4. 使用 RECOVER 命令开始将增量备份、累积备份、归档重做日志文件和联机重做日志
的组合应用于已还原的文件,以便使数据库同步。
5. 完成恢复后,使数据文件联机。通知用户数据库可以使用,需要重新输入系统发生故
障前未提交的所有数据。
可以使用以下命令:
RUN{
SQL “alter tablespace users offline immediate”;
SET NEWNAME FOR datafile ‘/ORADATA/u03/users01.dbf’
to ‘/ORADATA/u04/users01.dbf’; #Specify where to restore the file
RESTORE (tablespace users); #Restore the datafile
SWITCH datafile 3;#Update the control file and recovery catalog
RECOVER TABLESPACE users; #Recover the tablespace
SQL “alter tablespace tbs1 online”;}

Oracle9i 数据库管理基础 II 13-11


小结

在这一课中,您应该能够掌握:
• 恢复 ARCHIVELOG 模式下的数据库
• 如果原位置不可用,将数据文件还原到其它位置

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 13-12


练习 13-1 和 13-2 概览

这两个练习涉及以下主题:
• 使用 RMAN 恢复表空间
• 使用 RMAN 恢复重新定位的数据文件

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 13-13


练习 13-1 RMAN 完全恢复
使用 RMAN 恢复表空间
1. 使用 RMAN 连接到目标数据库,并按以下格式配置控制文件自动备份:
$HOME/BACKUP/RMAN/%F.bck
2. 创建以下格式的完整数据库备份:
$HOME/BACKUP/RMAN/df_%d_%s_%p.bus
3. 在 SQL*Plus 中,以 sysdba 用户身份连接,然后运行
$HOME/STUDENT/LABS/lab13_01_03.sql script。
4. 调用 SQL*Plus,以 sysdba 用户身份连接并启动例程。
5. 使用 RMAN 连接到目标数据库,还原并恢复 USERS 表空间。
6. 完成恢复后打开数据库。

Oracle9i 数据库管理基础 II 13-14


练习 13-2 RMAN 完全恢复
使用 RMAN 将数据文件恢复到新位置
1. 在 SQL*Plus 中,以 sysdba 用户身份连接,然后运行
$HOME/STUDENT/LABS/breakdb.sql 脚本。
2. 您已确定 u03 ($HOME/ORADATA/u03) 已损坏。必须将 USERS 表空间的数据文件
重新定位到另一位置。
$HOME/ORADATA/u04 具有足够的空间。使用 RMAN,建立一个 RUN 块以将数据文
件从 u03 重新定位到 u04,然后恢复 USERS 表空间。
3. 恢复已重新定位的数据文件。

Oracle9i 数据库管理基础 II 13-15


Oracle9i 数据库管理基础 II 13-16
用户管理的不完全恢复

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 说明不完全恢复的各个步骤
• 执行不完全数据库恢复
• 确定当前联机重做日志文件的丢失情况

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 14-2


不完全恢复概览

例程
用户 服务器 SGA
共享池
进程 进程
共享 SQL
PGA 锁 大型共享池 和 PL/SQL
重做日志 数据字典
数据缓冲区
缓冲区 高速缓存
用户 服务器
进程 进程 SMON DBWn PMON CKPT LGWR ARCn
PGA

1 1 1
数据文件 1 控制文件 重做日志
文件 1
参数文件 1 0 归档日
数据文件 2 重做日志 志文件
文件 2
1
数据文件 3
口令文件
数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

不完全恢复
不完全恢复能够重建数据库,使之恢复到以前的某个时间点(发生故障之前)。
注:该情况会导致进行恢复操作后提交的事务处理中丢失数据。如果需要,这些数据将需
要手动重新输入。只在绝对必要的情况下执行这种恢复操作。不完全恢复操作可能比较困
难而且耗费时间较长。
要执行不完全恢复,需要:
• 恢复时间点之前制作的所有数据文件的有效脱机或联机备份
• 截止到指定的恢复时间之前,备份中生成的所有归档日志
通常在完全恢复操作失败的情况下进行不完全恢复。

Oracle9i 数据库管理基础 II 14-3


需要进行不完全
恢复的情况

• 因归档日志丢失而导致完全恢复失败。
• 所有未归档的重做日志文件和数据文件均丢失。
• 用户错误
– 某个重要的表被删除。
– 在表中提交了无效数据。

• 当前控制文件丢失,必须使用备份控制文件才能
打开数据库。

Copyright © Oracle Corporation, 2001. All rights reserved.

需要进行不完全恢复的常见情况
• 丢失归档:由于归档日志损坏或丢失,完全恢复操作失败。数据库只能恢复到应用归
档日志之前的过去的某一时间的状态。
• 丢失重做日志:未镜像重做日志,并且重做日志在归档之前丢失,数据文件也丢失。
恢复无法继续到丢失的重做日志之后。
• 用户错误:用户错误地删除了某个表,提交了用错误的 WHERE 子句更新的数据等等。
• 丢失控制文件:您未镜像控制文件,不知道数据库的结构,但您有旧的二进制副本的
备份。

Oracle9i 数据库管理基础 II 14-4


不完全恢复的类型

• 不完全恢复有三种类型:
– 基于时间的恢复
– 基于取消的恢复
– 基于更改的恢复

• 在下面的情况下,可能需要使用还原的控制文件进行
恢复:
– 控制文件丢失
– 执行不完全恢复,使数据库恢复到某一时间点,而这一
时间点的数据库结构与当前数据库结构不同

Copyright © Oracle Corporation, 2001. All rights reserved.

不完全恢复的类型
基于时间的恢复
截止指定时间点之前的所有更改提交后,该恢复方法终止。在以下情况下使用此方法:
• 对数据作出了不必要的更改,或者删除了重要的表,并且知道错误发生的大概时间。
如果您立即得到通知,恢复时间最短、数据损失最少。精心测试过的程序、安全性和
过程应当可以避免此类恢复。
• 知道未镜像的联机重做日志损坏的大概时间。镜像日志可以避免此类恢复。
基于取消的恢复
在恢复提示符下输入 CANCEL(而不是日志文件名),即可终止该恢复方法。在以下情况
下使用此方法:
• 当前重做日志文件或组被破坏,并且不可用于恢复。镜像可以避免此类恢复。
• 进行恢复所需的归档重做日志文件丢失。经常备份并将归档存放在多个目标位置可以
避免此类恢复。

Oracle9i 数据库管理基础 II 14-5


不完全恢复类型(续)
基于更改的恢复
截止指定系统更改编号 (SCN) 之前所做的所有更改提交之后,该恢复方法即终止。在分布
式环境中恢复数据库时,使用这种方法。本课程不对这种方法进行详细说明。
使用备份控制文件恢复
指定的恢复方法(基于取消、基于时间或基于更改的恢复)已完成或控制文件已恢复时,
该恢复方法终止。必须在 RECOVER DATABASE 命令中指定恢复将使用控制文件的旧副本。
在以下情况下使用这种方法:
• 所有控制文件都已丢失,并且无法重新创建,但存在控制文件的二进制备份。镜像控制
文件(至不同磁盘)并保留 CREATE CONTROLFILE 语句的当前文本版本将减少使用
该方法的几率。
• 将某个结构与当前数据库不同的数据库还原到先前的某个时间点。

Oracle9i 数据库管理基础 II 14-6


不完全恢复原则

• 请认真按照所有步骤进行操作。
• 恢复前后均应执行整体数据库备份。
• 始终要验证恢复是否成功。
• 备份并删除归档日志。

Copyright © Oracle Corporation, 2001. All rights reserved.

不完全恢复原则
• 认真按照所有恢复步骤进行操作很重要,因为不完全恢复的大多数问题都是由恢复过
程中的 DBA 错误造成的。
• 事务活动只能前滚至期望的时间,而不能回退至期望的时间。这就是对要及时恢复的
数据库必须还原所有数据文件的原因。如果没能还原所有数据文件,将无法打开(非
同步)数据库。
• 开始不完全恢复之前应执行整体关闭数据库备份(包括控制文件和重做日志)。这样
做的好处有:
– 允许从错误中恢复。如果恢复失败(例如,恢复超出了期望的恢复点),重做
日志和控制文件将无法用于下一次恢复,除非存在这些文件的备份。
– 如果恢复失败,可以节省时间。在这种情况下,您可以从新备份中还原数据文
件,而不是从需要应用归档的上一次备份中还原。
注:如果不执行整体备份,至少应归档当前重做日志 (ALTER SYSTEM
ARCHIVE LOG CURRENT) 并备份控制文件 (ALTER DATABASE BACKUP
CONTROLFILE TO <LOCATION>)。
• 恢复成功后,执行关闭的数据库的整体备份。如果需要进行恢复才能完成下一次排定
的备份,则建议使用这种方法。

Oracle9i 数据库管理基础 II 14-7


不完全恢复原则(续)
• 在允许用户访问系统之前一定要验证故障是否已经修复,以防止恢复失败而需要再次进
行恢复。
• 从系统中备份(以后删除)归档日志,以避免混合不同数据库复本中的归档。
请看以下示例:
– 日志序列号为 144 的数据库包含从 arch_120.rdo 到 arch_143.rdo 的归档日
志。
– 执行不完全恢复后,将创建新的数据库复本,并将数据库的日志序列号设置为 0。
– 归档日志 arch_120.rdo 到 arch_143.rdo 现在是旧数据库复本的一部分。
– 日志切换 120 次后,归档日志 arch_120.rdo 将被覆盖,并通过所有其它归档
(包括旧的归档日志 arch_121.rdo 至 arch_143.rdo)备份。
– 此后,如果恢复需要 arch_124.rdo,您需要确保从该备份还原的归档日志属于
正确的数据库复本,否则将出现错误。

Oracle9i 数据库管理基础 II 14-8


不完全恢复和警报日志

• 在恢复前后均应检查警报日志
• 包含错误信息、提示和 SCN

Copyright © Oracle Corporation, 2001. All rights reserved.

警报日志
恢复过程中,进度信息存储在警报日志中。恢复前后,都应检查该文件。下面是一个
alert.log 文件示例:
$ vi /disk1/BDUMP/alert_DB00.log
...
Media Recovery Log
ORA-279 ... RECOVER database until time ‘2001...
Wed Mar 07 11:55:13 2001
RECOVER DATABASE CONTINUE DEFAULT
Media Recovery Log /disk1/archive/arch_34.rdo
Incomplete recovery done UNTIL CHANGE 309121
Media Recovery Complete
Completed: RECOVER DATABASE CONTINUE DEFAULT
Wed Mar 07 11:55:13 2001
alter database open resetlogs
...
Oracle9i 数据库管理基础 II 14-9
用户管理的不完全恢复的过程

1. 关闭数据库,然后备份数据库。
2. 还原所有数据文件。不要还原控制文件、重做日志、
口令文件或参数文件。
3. 装载数据库。
4. 将数据文件恢复到故障前的某一点。
5. 使用 RESETLOGS 打开数据库。
6. 执行关闭数据库备份。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用用户管理的过程的不完全恢复步骤
出现故障而要求进行不完全恢复时,必须拥有下列文件才能进行恢复:
• 包含所有数据文件的有效脱机或联机备份。
• 从上次还原的备份到发生故障之前的所有归档重做日志。
请按照下列步骤进行恢复:
1. 对现有数据库执行关闭的数据库的完全备份。关闭数据库,从备份还原所有数据
文件(包括系统表空间文件)。
2. 还原所有数据文件,以及时恢复数据库。
3. 将数据库置于装载模式并确保数据文件处于联机状态。
4. 恢复数据库。
5. 使用 RESETLOGS 选项打开数据库并验证恢复。
6. 对数据库执行关闭的数据库的整体备份。

Oracle9i 数据库管理基础 II 14-10


RECOVER 命令概览

• 恢复发出取消命令之前的数据库:
RECOVER DATABASE until cancel

• 恢复某一时间之前的数据库:
RECOVER DATABASE
until time ‘2001-03-04:14:22:03’

• 使用备份控制文件恢复:
RECOVER DATABASE
until time ‘2001-03-04:14:22:03’
using backup controlfile

Copyright © Oracle Corporation, 2001. All rights reserved.

用于不完全恢复的 RECOVER 命令
以下命令用于执行不完全恢复:
RECOVER [AUTOMATIC] DATABASE <Option>
其中:
automatic:自动应用归档和重做日志文件。
option: until time ‘YYYY-MM-DD:HH:MI:SS’
until cancel
until scn <integer>
using backup control file
注:要在恢复过程中自动应用重做日志文件,可以使用 SQL*Plus 命令 SET
AUTORECOVERY ON,在恢复提示符后输入 AUTO,或者使用 SQL 命令 RECOVER
AUTOMATIC。

Oracle9i 数据库管理基础 II 14-11


基于时间的恢复示例

情况:
• 当前时间是 2001 年 3 月 9 日夜间 12:00。
• EMPLOYEES 表已被删除。
• 删除该表的时间大约是上午 11:45。
• 由于大多数员工当前都在开会,数据库的活动很少。
• 该表必须进行恢复。

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 14-12


UNTIL TIME 恢复
1 关闭并备份
146 146 146
数据文件 1 控制文件 重做日志
文件 1 2 还原所有数据文件
146 145
数据文件 EMP
2 重做日志 3 装载数据库
文件 2
146 144 146 146
数据文件 3 数据文件 1 控制文件 重做日志
数据库 文件 1
144 145
数据文件 EMP
2 重做日志
1 1 1 文件 2
数据文件 1 控制文件 重做日志 144 144
文件 1 数据文件 3
4 归档日
1 0 志文件
数据文件EMP
2 重做日志 恢复的数据库
文件 2
1 5 使用 Resetlogs 打开
数据文件 3

恢复的数据库 6 备份数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 UNTIL TIME 进行不完全恢复


关闭数据库并开始恢复。由于知道故障发生的大概时间,并且数据库结构从上午 11:44 之
后并未更改,因此,可以使用 UNTIL TIME 方法:
1. 如果数据库已打开,使用 NORMAL 或 IMMEDIATE 或 TRANSACTIONAL 选项关闭数
据库。
2. 从备份还原所有数据文件(尽可能使用最新备份)。可能需要还原归档日志。如果
有足够的可用空间,还原到 LOG_ARCHIVE_DEST 位置,或使用 ALTER SYSTEM
ARCHIVE LOG START TO <LOCATION> 或 SET LOGSOURCE <LOCATION> 更
改位置。
3. 装载数据库。

Oracle9i 数据库管理基础 II 14-13


使用 UNTIL TIME 进行不完全恢复(续)
4. 恢复数据库:
SQL> recover database until time ‘2001-03-09:11:44:00’
ORA-00279: change 148448 …02/29/98 17:04:20 needed for thread ORA-
00289: suggestion : /disk1/archive/arch_6 .rdo
ORA-00280: change 148448 for thread 1 is in sequence #6 Log
applied.
...
Media recovery complete.
5. 要将数据文件与控制文件和重做日志同步,应使用 RESETLOGS 选项打开数据库:
SQL> alter database open resetlogs;
SQL> archive log list
...
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
6. 执行关闭的数据库的整体备份之前,查询 EMPLOYEES 表以确保该表存在。
恢复成功并且备份完成后,通知用户该数据库可以使用,而恢复时间(上午 11:44)后输
入的所有数据将需要重新输入。

Oracle9i 数据库管理基础 II 14-14


基于取消的恢复示例

情况:
• 当前时间是 2001 年 3 月 9 日夜间 12:00。
• 某人尝试修复损坏的块时删除了 EMPLOYEES 表。
• 日志文件都位于同一磁盘上。
• 删除该表的时间大约是上午 11:45。
• 员工当前正在开会。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 UNTIL CANCEL 进行不完全恢复


您担心是磁盘错误导致 EMPLOYEES 表中的块损坏。由于重做日志都包含在同一磁盘中,
您决定检查重做日志和归档日志的状态:
SQL> select * from v$logfile;
GROUP# STATUS MEMBER
------ ---------------- ---------------------------------
2 /disk1/data/log2a.rdo
1 /disk1/data/log1a.rdo
SQL> select * from v$log;
G# ... SEQ# BYTES MEMBERS ARC STATUS ... FIRST_TIME
-- ... ---- ------ ------- --- -------- ... --------------
1 ... 49 153600 1 NO CURRENT ... 01-03-09:11:55
2 ... 48 153600 1 NO INACTIVE ... 01-03-09:11:34

Oracle9i 数据库管理基础 II 14-15


基于取消的恢复示例

发现:
• 重做日志未多元备份。
• 有一个联机重做日志缺失。
• 缺失的重做日志未归档。
• 重做日志包含自上午 11:34 以来的信息。
• 26 分钟的数据将丢失。
• 用户可恢复其数据。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 UNTIL CANCEL 进行不完全恢复(续)


对 /disk1/data 目录进行搜索之后,发现找不到重做日志 log2a.rdo,并且该日志未归
档。因此,不能恢复该点之后的数据。
查询 V$LOG_HISTORY 确认缺少归档日志序列 48 (log2a.rdo):
SQL> select * from v$log_history;
RECID STAMP ... FIRST_CHANGE FIRST_TIME
----- --------- ... ------------ ----------
1 318531466 ... 88330 01-02-28:12:43
47 319512880 ... 309067 01-03-09:11:26
由于这是 OLTP 系统,V$LOG 的输出显示:如果数据库是在应用 log2a.rdo 之前恢复的,
另外 10 分钟的工作将丢失。用户不愿意丢失工作,但可以恢复该工作。
您可以按照以下步骤恢复数据库:
1. 关闭数据库。
2. 从最新备份还原所有数据文件。
3. 您已经拥有有效备份,因此请装载数据库。

Oracle9i 数据库管理基础 II 14-16


使用 UNTIL CANCEL 进行不完全恢复(续)
4. 将数据库恢复到序列号为 48 的日志:
SQL> recover database until cancel
ORA-00279:change 148448...03/02/01 12:45:20 needed for thread
ORA-00289: suggestion : /disk1/archive/arch_34.rdo
ORA-00280: change 148448 for thread 1 is in sequence #34
Log applied.
...
ORA-00279:change 309012...03/09/01 11:33:56 needed for thread
ORA-00289: suggestion : /disk1/archive/arch_48.rdo
ORA-00280: change 309012 for thread 1 is in sequence #48
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
5. 使用 RESETLOGS 选项打开数据库。
6. 检查 EMPLOYEES 表是否存在。
7. 恢复完成后,制作一份备份。通知用户该数据库可以使用,而恢复时间(上午 11:34)
之后输入的所有数据将需要重新输入。

Oracle9i 数据库管理基础 II 14-17


恢复期间使用
备份控制文件

情况:
• 当前时间是 2001 年 3 月 9 日夜间 12:00。
• 包含 EMPLOYEES 表的表空间已被删除。
• 错误出现的时间大约是上午 11:45。
• 许多员工记录都在这一天早晨更新,但上午 11:00 之后
没有更新。
• 每天晚上都进行备份。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用备份控制文件进行不完全恢复
1. 包含 EMPLOYEES 表的表空间已被删除,如下所示:
SQL> drop tablespace emp_ts including contents;
2. 您立即要求用户注销并保留过去 15 分钟内输入的数据记录。在等待所有用户注销并且
其余会话终止时,您将数据库置于受限模式以防止进一步的访问:
SQL> alter system enable restricted session;
3. 调查过程中,您从前一晚的备份中找到了二进制控制文件。由于当前的控制文件将被
替换,因此应仔细收集数据库结构信息,以备不时之需:
SQL> select * from v$log;
GROUP#...SEQ# BYTES ...ARC STATUS ... FIRST_TIME
------...---- ------...--- --------... --------------
1 … 61 153600... NO CURRENT ... 01-03-09:11:55
2 ...60 153600... NO INACTIVE... 01-03-09:11:34

Oracle9i 数据库管理基础 II 14-18


恢复期间使用
备份控制文件

发现:
• 前一晚的备份包含恢复所需的数据文件和控制文件。
• EMP_TS 表空间有一个数据文件。
• 当前日志序列号是 61。
• 确认该表空间是在 2001 年 3 月 9 日上午 11:44:54
被删除的。
• 数据文件编号 4 处于脱机状态。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用备份控制文件进行不完全恢复(续)
4. 您通过检查警报日志确定错误发生时间:
UNIX: vi /disk1/BDUMP/alert*.log
Windows NT: notepad c:\BDUMP\alert_DB00.log
...
Fri Mar09 11:44:54 1999
drop tablespace emp_ts including contents
...
5. 关闭数据库、备份控制文件、然后还原表空间存在时的某个时间点的数据库的所有数
据文件和控制文件。尝试打开数据库之后,以下错误将通知您重做日志与控制文件不
同步:
ORA-00314: log 1 of thread 1,expected sequence# doesn't
match
ORA-00312: online log 1 thread 1: '/disk1/data/log1a.rdo'

Oracle9i 数据库管理基础 II 14-19


使用备份控制文件进行不完全恢复(续)
6. 验证是否存在脱机数据文件并使它们处于联机状态,因为恢复后所有脱机文件可能无
法恢复:
SQL> select * from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- ------ ------- --------
4 OFFLINE 288772 02-MAR-01
SQL> alter database datafile 4 online;
7. 执行恢复:
SQL> recover database until time '2001-03-09:11:44:00'
2> using backup controlfile;
...
Media recovery complete.
注:如果提示您输入联机重做日志文件,请在提示符下输入文件名以继续进行恢复。
如果出现如下错误,而不是 “Media recovery complete(介质恢复完成)”,表明数据
文件需要从更早的备份进行还原,或需要进行更多的恢复(此处不可能)。
ORA-01152: file 7 was not restored from a sufficiently old backup
ORA-01110: datafile 7: '/disk1/data/new01.dbf'
8. 要使数据文件与控制文件和重做日志同步,请用 RESETLOGS 选项打开数据库。
9. 检查 EMPLOYEES 表是否存在。
10. 进行整体备份。
11. 通知用户数据库可以使用,需要重新输入在上午 11:44 之后输入的所有数据。

Oracle9i 数据库管理基础 II 14-20


当前重做日志文件丢失

如果数据库已经关闭:
• 尝试打开数据库。
• 查找当前日志序列号。
• 恢复发出取消命令之前的数据库。
• 如果需要,应删除并重新创建日志文件。
• 使用 RESETLOGS 打开数据库。
• 执行整体数据库备份。

Copyright © Oracle Corporation, 2001. All rights reserved.

当前重做日志文件丢失
如果数据库关闭,可能发生了介质故障或者后台进程可能已终止。按照以下步骤纠正该情
况:
1. 如果尝试打开数据库,以下消息将立即通知您当前的重做日志组:
Database mounted.
ORA-00313: open failed for members of log group 2 of
thread 1
ORA-00312: online log 2 thread 1: '/disk1/archive/log2a.rdo'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
由于日志组 2 是当前日志组,因此尚未归档。使用 CLEAR LOGFILE 命令无效,
原因是:
SQL> alter database clear unarchived logfile group 2;
ORA-01624: log 2 needed for crash recovery of thread 1
ORA-00312: online log 2 thread 1: 'disk1/archive/log2a.rdo'

Oracle9i 数据库管理基础 II 14-21


数据库由于故障关闭(续)
2. 因此需要不完全恢复。首先,必须记录当前日志序列号:
SQL> select * from v$log;
GROUP#... SEQ# BYTES ... ARC STATUS... FIRST_TIME
------... ---- ------... --- ------...--------------
1 ... 60 153600 ... NO INACTIVE. 01-03-09:19:34
2 ... 61 153600 ... NO CURRENT... 01-03-09:19:50
3. 从先前的备份还原所有数据文件,使用 RECOVER UNTIL CANCEL 命令并在应用重
做日志 61 之前停止:
SQL> recover database until cancel;
ORA-00279: change 309043...03/09/01 14:50:14 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_46.rdo
ORA-00280: change 309043 for thread 1 is in sequence #46
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
...
ORA-00279: change 309141...03/09/01 19:50:14 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_61.rdo
ORA-00280: change 309043 for thread 1 is in sequence #61
ORA-00278: log file ... no longer needed for this recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery complete.
4. 使用 RESETLOGS 选项打开数据库。
5. 现在数据库应该可以运行了,因为将重新创建所有丢失的日志文件。
注:如果由于介质故障需要在另一个磁盘上重新创建日志文件,请使用 ALTER
DATABASE DROP LOG GROUP 和 ALTER DATABASE ADD LOG GROUP 命令手动创
建日志文件。
6. 由于您刚刚执行了不完全恢复,因此,现在应备份数据库。

Oracle9i 数据库管理基础 II 14-22


小结

在这一课中,您应该能够掌握:
• 执行不完全数据库恢复
• 在当前联机重做日志文件丢失的情况下进行恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 14-23


练习 14-1 和 14-2 概览

这两个练习包括下列主题:
• 从用户失败进行恢复
• 在丢失归档重做日志文件的情况下进行恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 14-24


练习 14-1 用户管理的不完全恢复
从用户失败进行恢复:不完全恢复
1. 如果您不能肯定是否从前面的练习中得到了一个有效的备份,则可执行整体关闭或整
体打开数据库备份。将备份存储在 $HOME/BACKUP/UMAN 目录下。启动例程并打开
数据库。
2. 以 hr/hr 身份连接。发出下列语句将行插入 EMPHIST 表:
INSERT INTO emphist SELECT * FROM emphist;
3. 发出 SELECT 语句从 EMPHIST 表获取一定数量的行。记下行数。
4. 以 system/manager 身份连接并发出以下查询:
SELECT f.file_name FROM dba_tables t, dba_data_files f
WHERE table_name = ‘EMPHIST‘ AND
t.tablespace_name = f.tablespace_name;
记录表空间所有数据文件的文件名。
5. 用操作系统命令记录当前系统时间。
6. 查询 V$LOG 以查找当前联机日志的序列号。
7. 以 hr/hr 身份连接并执行以下命令向 EMPHIST 表添加行:
INSERT INTO emphist SELECT * FROM emphist;
8. 发出 SELECT 语句从 EMPHIST 表获取一定数量的行。记下行数。
9. 运行 $HOME/STUDENT/LABS/lab14_01_09.sql 脚本以模拟某个用户意外删除
EMPHIST 表的情况。
10. 尝试查询 EMPHIST 表。结果怎样?
11. Oracle 服务器找不到 EMPHIST 表。您需要将该表还原到数据库。因为已启用归档,
并且您知道发生故障的大概时间,因此现在可以执行不完全恢复来还原该表。
以 sysdba 身份连接并关闭例程。启动例程并装载数据库。
12. 从步骤 1 中制作的备份中还原所有数据文件。如果在本练习开始时未制作新的备份,
则一定要将 USERS 表空间的数据文件还原到适当的目录。
13. 恢复数据库直到步骤 5 中记下的时间。
14. 恢复完成后,使用 RESETLOGS 选项打开数据库。
15. 对 HR.EMPHIST 表执行查询。结果怎样?为什么?

Oracle9i 数据库管理基础 II 14-25


练习 14-1 用户管理的不完全恢复(续)
从用户失败进行恢复:不完全恢复
16. 以 system/manager 身份连接,查询 V$LOG 视图并记下序列号。将这个值与步
骤 5 中的值进行比较。关于不完全恢复,您可以得出什么结论?
17. 执行整体脱机备份。将备份存储在 $HOME/BACKUP/UMAN 目录下。

Oracle9i 数据库管理基础 II 14-26


练习 14-2 用户管理的不完全恢复(可选)
不完全恢复:在丢失归档日志的情况下进行恢复
1. 用操作系统命令确定当前系统时间。
2. 查询 V$LOG 视图并记录当前联机日志序列号。
3. 运行 $HOME/STUDENT/LABS/lab14_02_03.sql 脚本切换日志并创建一个新表。
4. 运行 $HOME/STUDENT/LABS/lab14_02_04.sql 脚本以模拟丢失归档日志文件的
情况。
5. 运行 $HOME/STUDENT/LABS/lab14_02_05.sql 脚本以模拟出现硬件故障的情况。
6. 尝试启动例程并打开数据库。结果怎样?
7. 服务器因发现介质故障而无法找到 USERS 表空间的文件。由于已经启用归档,您可
尝试执行完全恢复。从在练习 14-1 中制作的备份还原 USERS 表空间的数据文件。
8. 使用 RECOVER AUTOMATIC DATABASE 命令恢复数据库。记下未能找到的所有文件
的名称。如果服务器无法找到指定的归档重做日志文件,请发出 CANCEL 命令。
9. 尝试打开数据库。结果怎样?
10. 在应用丢失的归档重做日志文件之前,恢复已取消。USERS 表空间中的数据文件无
法向前恢复到当前数据库时间。因为恢复不能及时还原数据库,您必须执行不完全恢
复。从在练习 14-1 中制作的备份还原所有数据文件。
11. 用 UNTIL CANCEL 选项恢复数据库,在 Oracle 服务器请求步骤 8 中记录的归档重做
日志文件时停止。
注:不要使用自动方式。当 Oracle 服务器请求归档重做日志文件时,以手动方式应用
每一个归档重做日志文件。
12. 在恢复提示符处键入 cancel。
13. 恢复完成后,使用 RESETLOGS 选项打开数据库。
14. 查询 V$DATAFILE 以验证所有数据文件是否都处于联机状态。
15. 执行整体脱机备份。将备份存储在 $HOME/BACKUP/UMAN 目录下。
16. 以 sysdba 身份连接,然后启动例程,装载并打开数据库。

Oracle9i 数据库管理基础 II 14-27


Oracle9i 数据库管理基础 II 14-28
RMAN 不完全恢复

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 使用 UNTIL TIME 进行不完全数据库恢复
• 使用 UNTIL SEQUENCE 进行不完全数据库恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 15-2


使用 RMAN 进行数据库
的不完全恢复

1. 装载数据库。
2. 为并行化分配多个通道。
3. 还原所有数据文件。
4. 使用 UNTIL TIME、UNTIL SEQUENCE 或 UNTIL SCN
恢复数据库。
5. 使用 RESETLOGS 打开数据库。
6. 执行整体数据库备份。

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RMAN 进行数据库的不完全恢复
不完全恢复的还原和恢复进程的步骤和语法与完全恢复相同,只是需要从过去的备份中还
原所有数据文件。

• 目标数据库必须处于已装载的状态。
• 要还原的文件必须处于脱机状态。只有在备份是通过 RMAN 生成或注册的情况下,才
能使用 RMAN 进行还原。

Oracle9i 数据库管理基础 II 15-3


指定还原时间

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


您可使用 “恢复向导” (Recovery Wizard) 还原和恢复数据库。在 “恢复选项” (Recovery
Selection) 页上,必须选择 “直到” (Until) 复选框,并在 “日期” (date) 和 “时间” (time) 字段
被激活后输入日期和时间,以还原至以前某一时间点。可使用 “例程管理” (Instance
Management) 或 “控制台” (Console) 在作业完成后打开数据库。还可通过选择 “控制台作
业” (Console‘s Job) 窗口中的 “当前” (Active) 和 “历史记录” (History) 页选项卡来查看作业
状态。

Oracle9i 数据库管理基础 II 15-4


使用 UNTIL TIME 进行 RMAN
不完全恢复的示例

RMAN> run {
2> allocate channel c1 type DISK;
3> allocate channel c2 type DISK;
4> set until time = ‘2000-12-09:11:44:00';
5> restore database;
6> recover database;
7> alter database open resetlogs; }

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 UNTIL TIME 进行 RMAN 不完全恢复的示例


在 2000 年 12 月 9 日星期二夜间 12 点,确定 EMPLOYEES 表被删除后,立即关闭数据库
并开始恢复。已知故障发生的大概时间,并且上午 11 点 44 分以来没有更改过数据库结
构。在此情况下,可以使用 UNTIL TIME 方法:
1. 如果目标数据库已打开,则彻底关闭它。
2. 装载目标数据库。不要在恢复期间备份数据库。
3. 确保 NLS_LANG 和 NLS_DATE_FORMAT 环境变量已正确设置:
$NLS_LANG=american
$NLS_DATE_FORMAT=’YYYY-MM-DD:HH24:MI:SS’
4. 启动恢复管理器并连接至目标数据库。
$rman target rman/rman@DB00
5. 可分配多个通道以改善性能:
RMAN> run {allocate channel c1 type DISK;
allocate channel c2 type DISK;

Oracle9i 数据库管理基础 II 15-5


使用 UNTIL TIME 进行 RMAN 不完全恢复的示例(续)
6. 指定使用 RMAN 命令从备份恢复和还原所有数据文件的时间。RMAN 根据 SET
UNTIL 命令选择正确的文件:
RMAN> ... set until time = ‘2000-12-09:11:44:00’;
RMAN> ... restore database;
注:如果需要将归档重做日志文件还原到新位置,则可使用 RMAN SET
ARCHIVELOG DESTINATION TO <location> 命令。
7. 将数据库恢复到 SET UNTIL 命令中指定的时间:
RMAN> ... recover database;
8. 使用 RESETLOGS 选项打开数据库:
RMAN> ... alter database open resetlogs; }
9. 确认表存在,然后执行备份。
10. 通知用户数据库可以使用,需要重新输入系统发生故障前未提交的所有数据。
11. 如果使用恢复目录,则注册数据库的新复本:
RMAN> reset database;

Oracle9i 数据库管理基础 II 15-6


使用 UNTIL SEQUENCE 进行 RMAN
不完全恢复的示例

RMAN> RUN {
2> SET UNTIL SEQUENCE 120 THREAD 1;
3> ALTER DATABASE MOUNT;
4> RESTORE DATABASE;
5> RECOVER DATABASE; # recovers through log 119
6> ALTER DATABASE OPEN RESESTLOGS;
7> }

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 UNTIL SEQUENCE 进行 RMAN 不完全恢复的示例


UNTIL SEQUENCE 子句指定重做日志序列号和线程号的上限。RMAN 对日志序列号小于
指定日志序列号的文件执行操作。以上示例假定日志序列号 120 由于磁盘损坏而丢失,需
要使用可用的归档重做日志恢复数据库。

Oracle9i 数据库管理基础 II 15-7


小结

在这一课中,您应该能够掌握:
• 使用 UNTIL TIME 进行不完全数据库恢复
• 使用 UNTIL SEQUENCE 进行不完全数据库恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 15-8


练习 15 概览

本练习说明如何在丢失归档重做日志文件的情况下进行恢复。

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 15-9


练习 15 RMAN 不完全恢复
不完全恢复:在丢失归档日志的情况下进行恢复
1. 创建以下格式的完整数据库备份:
$HOME/BACKUP/RMAN/df_%d_%s_%p.bus
2. 运行 $HOME/STUDENT/LABS/lab15_02.sql 脚本切换日志并创建一个新表。
3. 运行 $HOME/STUDENT/LABS/lab15_03.sql 脚本以模拟丢失归档重做日志文件的
情况。
4. 运行 $HOME/STUDENT/LABS/lab15_04.sql 脚本以模拟出现硬件故障的情况。
5. 尝试启动例程并打开数据库。结果怎样?
6. 服务器因发现介质故障而无法找到 USERS 表空间的文件。因为已经启用归档,您可以
尝试执行完全恢复。使用 RMAN 还原 USERS 表空间的数据文件。
7. 使用 RMAN 恢复表空间。记下找不到的文件的名称和序列号。
8. 使用带有 UNTIL LOG SEQUENCE 子句的 RMAN 命令通过上一个完好的归档重做日志
文件执行不完全恢复。
9. 恢复完成后,使用 RESETLOGS 选项打开数据库。
10. 在 $HOME/BACKUP/RMAN 目录下按以下格式创建一个新备份:
df_%d_%s_%p.bus

Oracle9i 数据库管理基础 II 15-10


RMAN 维护

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 执行备份和副本的交叉查对
• 删除备份后更新资料档案库
• 更改备份和副本的可用性状态
• 使备份或副本脱离保留策略
• 将使用操作系统命令制作的备份列入目录

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 16-2


交叉查对备份和副本

使用 CROSSCHECK 命令可以:
• 确保资料档案库信息与实际文件同步
• 检查备份或副本的状态
• 使用操作系统命令删除文件后更新资料档案库

Copyright © Oracle Corporation, 2001. All rights reserved.

交叉查对 RMAN 备份和副本


执行交叉查对可以确保位于 RMAN 资料档案库中的有关备份集和映像副本的数据与磁盘
上或介质管理目录中的相应数据保持同步。
您可以使用 LIST 命令来获得有关已制作的备份和副本的报告,然后使用 CROSSCHECK
命令来检查这些文件是否仍然存在。如果 RMAN 找不到文件,则将资料档案库记录更新
为 EXPIRED。通过发出 LIST EXPIRED 命令,您可以确定哪些文件被标记为 EXPIRED。
然后,您可以运行 DELETE EXPIRED 以删除所有过期文件的资料档案库记录。
如果备份或副本位于磁盘上,则 CROSSCHECK 命令将确定备份片的头信息是否有效。如
果备份位于磁带上,则该命令只检查备份是否存在。

Oracle9i 数据库管理基础 II 16-3


CROSSCHECK 命令

• 交叉查对数据库中的所有备份:
CROSSCHECK BACKUPSET OF DATABASE;

• 交叉查对数据库中的所有副本:
CROSSCHECK COPY;

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 CROSSCHECK 命令
您可以发出 CROSSCHECK BACKUPSET 命令来交叉查对通过介质管理软件创建的备份集、
备份片和代理副本。缺省情况下,RMAN 会交叉查对整个数据库的备份。
您可以发出 CROSSCHECK COPY 命令来交叉查对数据文件副本、控制文件副本、归档重
做日志以及归档重做日志的映像副本。缺省情况下,将查对数据库中状态为 AVAILABLE
或 EXPIRED 的所有文件。
使用 CROSSCHECK 命令时还可带有选项,以便将查对限制于特定的备份片、备份集、数
据文件或控制文件副本。

Oracle9i 数据库管理基础 II 16-4


删除备份和副本

使用 DELETE 命令可以:
• 删除物理备份和映像副本
• 将资料档案库状态更新为 DELETED
• 从恢复目录中删除记录

Copyright © Oracle Corporation, 2001. All rights reserved.

删除备份和副本
您可以使用 DELETE 命令删除备份和映像副本,并更新档案库和恢复目录。发出该命令
后,RMAN 将显示文件列表并提示您确认删除请求。

Oracle9i 数据库管理基础 II 16-5


DELETE 命令

• 删除特定备份集:
DELETE BACKUPSET 102;

• 不经确认而删除过期备份:
DELETE NOPROMPT EXPIRED BACKUP OF TABLESPACE
users;

• 根据已配置的保留策略删除所有备份、副本和归档重做
日志文件:
DELETE OBSOLETE;

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 DELETE 命令
缺省情况下,DELETE 命令显示文件列表,并在删除列表中的任何文件之前提示您确认删
除操作。您可以使用 NOPROMPT 选项取消确认提示。如果从命令文件运行 DELETE 命
令,则缺省使用 NOPROMPT。
如果在 DELETE 命令中指定了 EXPIRED 选项,则仅删除已由 CROSSCHECK 命令标记为
EXPIRED 的文件。您可以使用 LIST 命令来确定哪些备份或副本已过期。
您可以指定 OBSOLETE 选项来删除那些被保留策略视为 OBSOLETE 的文件。通过使用
CONFIGURE RETENTION POLICY,您可以指定保留策略。您还可以按如下所示在
DELETE 命令中指定 REDUNDANCY 和 RECOVERY WINDOW 选项
RMAN> DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;

Oracle9i 数据库管理基础 II 16-6


删除备份和副本

使用 BACKUP … DELETE INPUT 命令可以:


• 在成功创建备份集后删除输入文件
• 删除归档重做日志文件、数据文件副本和备份集

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 BACKUP 命令的 DELETE INPUT 选项


您可以在 BACKUP 命令中使用 DELETE INPUT 选项,以指示 RMAN 在成功创建备份集
后删除输入文件。只有在备份归档重做日志文件、数据文件副本或备份集时,才可指定此
选项。使用此选项相当于对输入文件发出 DELETE 命令。
如果在备份归档重做日志文件时指定了 DELETE ALL INPUT,则 RMAN 会删除与选择
标准相符的相应归档重做日志文件的所有副本。BACKUP ARCHIVELOG 命令仅为每个不
同的日志序列号备份一个副本,因此,如果您指定了 DELETE INPUT 选项而未使用 ALL
关键字,RMAN 仅删除它所备份的文件的副本。

Oracle9i 数据库管理基础 II 16-7


更改 RMAN 备份和副本的可用性

• 使用 CHANGE … UNAVAILABLE 命令可以将备份或副


本的状态更改为 “不可用” (Unavailable)。
• 使用 CHANGE … AVAILABLE 命令可以将状态返回到
“可用” (Available)。

Copyright © Oracle Corporation, 2001. All rights reserved.

更改可用性状态
如果无法找到备份或副本,或由于硬件维护的原因而导致备份或副本不可用,您可以使用
CHANGE ... UNAVAILABLE 命令。如果某个文件被标记为 UNAVAILABLE,则当发出
RESTORE 或 RECOVER 命令时,RMAN 将不会使用该文件。
如果找到了该文件或维护过程已完成,则可以通过发出 CHANGE ... AVAILABLE 命令
再次将其标记为可用。

Oracle9i 数据库管理基础 II 16-8


更改可用性状态

• 更改特定数据文件的状态:
CHANGE DATAFILECOPY '/DB01/BACKUP/users01.dbf'
UNAVAILABLE;

• 更改控制文件备份的状态:
CHANGE BACKUP OF CONTROLFILE UNAVAILABLE;
CHANGE BACKUP OF CONTROLFILE AVAILABLE;

• 更改归档重做日志文件的状态:
CHANGE COPY OF ARCHIVELOG SEQUENCE BETWEEN 230
AND 240 UNAVAILABLE;

Copyright © Oracle Corporation, 2001. All rights reserved.

更改不可用状态
发出 CHANGE … UNAVAILABLE 命令后,状态将标记在资料档案库中。您可以通过
LIST 命令查看状态。
CHANGE 命令的 BACKUP 关键字指示该命令应对哪些备份集、备份片或代理副本进行操作。
如果不为 BACKUP 指定选项,则 CHANGE BACKUP 将对资料档案库中记录的所有备份进
行操作。
CHANGE 命令的 COPY 关键字指示该命令应对哪些数据文件副本、归档重做日志或归档重
做日志的映像副本进行操作。如果不为 COPY 指定选项,则 CHANGE COPY 将对资料档案
库中记录的所有备份进行操作。

Oracle9i 数据库管理基础 II 16-9


使备份或副本脱离保留策略

• 可以使用 CHANGE … KEEP 命令可使备份或副本脱离保


留策略。
• 可以使用 CHANGE … NOKEEP 命令取消脱离操作。

Copyright © Oracle Corporation, 2001. All rights reserved.

脱离保留策略
保留策略指定 RMAN 何时应将它所创建的备份和副本视为已过时。
您可以使用 CHANGE … KEEP 命令来使文件脱离保留策略;使用 CHANGE … NOKEEP 来
使该文件遵守保留策略。
KEEP 覆盖任何已为该备份或副本配置的保留策略,从而使备份不过时。您可以使用此选
项来创建一个长期备份。已脱离保留策略的备份仍然是一个完全有效的备份,可以象其它
任何 RMAN 备份一样进行还原。
NOKEEP 指定备份或副本将根据用户的保留策略过期。如果在 BACKUP 或 COPY 命令中未
指定 KEEP 选项,这是缺省行为。

Oracle9i 数据库管理基础 II 16-10


CHANGE … KEEP 命令

• 创建长期备份:
CHANGE BACKUPSET 123 KEEP FOREVER NOLOGS;

• 使数据文件脱离保留策略 60 天:
CHANGE DATAFILECOPY '/DB01/BACKUP/users01.dbf'
KEEP UNTIL 'SYSDATE+60';

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 CHANGE…KEEP 命令
FOREVER 参数指定备份或副本永不过期。如果指定了 FOREVER,则必须使用恢复目录,
否则,备份记录最终将超出控制文件的时间范围。
如果指定 LOGS 参数,则意味着:只要该备份或副本可用,则恢复此备份或副本所需的所
有归档日志都必须保持可用。
NOLOGS 指定由于不保留恢复此备份所需的归档日志,因此无法恢复该备份或副本。您只
能使用此备份或副本将数据库还原到制作该备份或副本的时间点。如果备份或副本不一
致,则此选项无效。您必须在已装载(但不打开)数据库的情况下制作一个一致的备份。
此外,该数据库在上一次打开时不能出现过崩溃或异常中止的情况。
您可以使用 UNTIL TIME = 'date_string' 参数来指定一个日期,在该日期之前必
须保留备份或副本。您可以使用当前 NLS_DATE_FORMAT 或一个 SQL 日期表达式(如
'SYSDATE+365')来指定一个特定的时间。

Oracle9i 数据库管理基础 II 16-11


将归档重做日志文件和用户管理
的备份列入目录

您可以使用 CATALOG 命令向资料档案库中添加有关


以下各项的信息:
• 操作系统数据文件副本
• 归档重做日志副本
• 控制文件副本

Copyright © Oracle Corporation, 2001. All rights reserved.

将文件列入资料档案库的目录
当您使用操作系统命令制作备份时,资料档案库中不会记录任何信息。如果使用操作系统
实用程序制作备份,则必须手动通知 RMAN。
要列入目录的操作系统备份必须符合以下条件:
• 位于磁盘上,可以访问
• 具有单个文件的完整映像副本
• 具有一致或不一致的数据文件、控制文件或归档重做日志备份。如果不一致,则必须
是使用 BEGIN BACKUP/END BACKUP 语句创建的。如果是控制文件备份,则应该是
通过 ALTER DATABASE BACKUP CONTROLFILE 语句制作的。
RMAN 将操作系统备份视为数据文件副本。在列入目录期间,RMAN 只检查文件头。它
不检查操作系统实用程序是否已正确复制该文件。
您可以使 RMAN 注意到有未记录在资料档案库中的归档重做日志文件。如果您已从备份
中还原控制文件,并且要使用归档重做日志文件信息对资料档案库进行更新,则需要完成
这一工作。

Oracle9i 数据库管理基础 II 16-12


CATALOG 命令

• 将使用操作系统命令制作的备份列入目录:
CATALOG DATAFILECOPY '/DB01/BACKUP/users01.dbf';

• 将归档重做日志文件列入目录
CATALOG ARCHIVELOG
'/ORADATA/ARCHIVE1/arch_12.arc',
'/ORADATA/ARCHIVE1/arch_13.arc';

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 CATALOG 命令
可以使用 CONTROLFILECOPY 参数来指定要添加到资料档案库中的、或要在资料档案库
中进行更新的控制文件副本的文件名。
DATAFILECOPY 指定要添加到资料档案库中的、或要在资料档案库中进行更新的数据文
件副本的文件名。
可以使用 ARCHIVELOG 参数来指定要添加到资料档案库中的、或要在资料档案库中进行
更新的归档重做日志文件的文件名。

Oracle9i 数据库管理基础 II 16-13


不将 RMAN 记录列入目录

使用 CHANGE … UNCATALOG 命令可以:


• 将资料档案库中的记录更新为 DELETED 状态
• 从恢复目录中删除特定备份或副本记录

Copyright © Oracle Corporation, 2001. All rights reserved.

不将 RMAN 资料档案库记录列入目录
如果您已通过 RMAN 之外的一种方法删除了备份或副本,则可以使用该命令。在对
RMAN 备份发出 CHANGE … UNCATALOG 命令后,RMAN 将永远不能使用该备份。

Oracle9i 数据库管理基础 II 16-14


CHANGE … UNCATALOG 命令

• 删除已删除的归档重做日志文件的记录:
CHANGE ARCHIVELOG … UNCATALOG;

• 删除已删除的数据文件的记录:
CHANGE DATAFILECOPY
'/DB01/BACKUP/users01.dbf' UNCATALOG;

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 CHANGE…UNCATALOG 命令
CHANGE ... UNCATALOG 命令用于更新资料档案库。它不删除物理备份或副本。如果您
使用其它方法(而非 RMAN DELETE 命令)删除了文件,则可以使用该命令通知 RMAN。

Oracle9i 数据库管理基础 II 16-15


小结

在这一课中,您应该能够掌握:
• 执行备份和副本的交叉查对
• 删除备份后更新资料档案库
• 更改备份和副本的可用性状态
• 使备份或副本脱离保留策略
• 将使用操作系统命令制作的备份列入目录

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 16-16


练习 16 概览

本练习包括下列主题:
• 执行交叉查对
• 将文件列入资料档案库的目录

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 16-17


练习 16 RMAN 维护
1. 在缺省 Nocatalog 模式下连接到数据库。
2. 使用 RMAN REPORT 命令生成数据库结构的列表。
3. 使用 RMAN LIST 和 CROSSCHECK 命令生成备份集和文件状态的列表。
4. 使用操作系统命令,将属于 SAMPLE 表空间的数据文件复制到您的 BACKUP 目录
中,然后将它从 RMAN 目录删除以模拟丢失备份的情况。
5. 通过 RMAN CROSSCHECK 命令,使用上一步中已移动的数据文件备份的状态来更新
资料档案库。确保指定上一步中所移动的备份集。
6. 发出 LIST EXPIRED 命令来检查文件的状态。是否有任何文件过期?
7. 使用操作系统命令,将 SAMPLE 表空间备份返回正确的位置。
8. 通过 RMAN CROSSCHECK 命令,使用数据文件备份的状态更新资料档案库。
9. 在 $HOME/BACKUP/RMAN 目录中,通过用户管理的过程制作属于 SAMPLE 表空间
的数据文件的备份。
10. 通过 RMAN CATALOG 命令,使用该备份信息更新资料档案库。
11. 使用 RMAN LIST COPY 命令来验证该备份是否已记录到资料档案库中。

Oracle9i 数据库管理基础 II 16-18


恢复目录的创建和维护

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 描述恢复目录的内容
• 列出需要恢复目录的 RMAN 功能
• 创建恢复目录
• 通过使用 RMAN 命令来维护恢复目录
• 使用 RMAN 注册、重新同步和重置数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 17-2


目标

• 查询恢复目录以生成报告和列表
• 创建、存储和运行脚本
• 描述备份和恢复恢复目录的方法

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 17-3


概览

还原/恢复
恢复管理器 Enterprise
备份 (RMAN) Manager

报告
目标数据库 控制文件 REPORT
LIST 已存储的脚本

目录维护
注册
重新同步
重置 目录数据库
更改/删除/目录
备份/还原/恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

概览
恢复目录是在单独的数据库中创建的方案。它包含从目标数据库的控制文件中获取的
RMAN 元数据。RMAN 将有关数据库结构、归档重做日志、备份集以及数据文件副本的
信息从目标数据库的控制文件传播到恢复目录中。
当要管理多个目标数据库时,应该使用目录。
RMAN 存储、使用和维护恢复目录中的信息。当执行以下操作时,恢复目录是由 RMAN
维护的:
1. 在目录中注册目标数据库。
2. 重新同步该目录和目标数据库的控制文件。
3. 将数据库重置为以前的复本。
4. 更改有关备份或文件的信息。
5. 执行备份、还原或恢复操作。
可以使用 REPORT 和 LIST 命令从恢复目录中获取信息。可以将脚本存储在恢复目录中。

Oracle9i 数据库管理基础 II 17-4


恢复目录内容

恢复目录是一个包含以下信息的可选资料档案库:
• 数据文件和归档重做日志文件备份集和备份片
• 数据文件副本
• 归档重做日志文件
• 目标数据库的物理结构

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复目录内容
恢复目录包含关于如下内容的信息:
• 数据文件和归档重做日志文件备份集和备份片:
该目录存储备份集名称和时间等信息。
• 数据文件副本:
该目录记录数据文件副本的时间戳和名称。
• 归档重做日志文件及其副本:
该目录维护服务器创建的归档日志以及 RMAN 制作的任何副本的记录。
• 目标数据库的物理结构:
它包含的信息与目标数据库控制文件中包含的信息类似。

Oracle9i 数据库管理基础 II 17-5


恢复目录内容

恢复目录还可能包含:
• 永久性的 RMAN 配置设置
• 已存储的作业脚本

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复目录内容
恢复目录还可能包含:
• 在 RMAN 会话期间持续有效的配置设置,以及使用 CONFIGURE 命令设置的配置设置。
• 已存储的脚本是命令的命名序列。脚本不能存储在目标数据库的控制文件中。

Oracle9i 数据库管理基础 II 17-6


使用恢复目录的优点

仅当使用恢复目录时,才能使用以下功能:
• 在一个目录中存储多个目标数据库的元数据
• 单个目标数据库的多个复本的元数据
• 历史记录元数据
• 报告非当前时间的目标数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

使用恢复目录的优点
可以使用恢复目录将多个目标数据库的相关信息存储在单个恢复目录中。恢复目录可用于
存储单个数据库的多个复本的信息。这样,就可以从非当前的复本报告目标数据库。

Oracle9i 数据库管理基础 II 17-7


创建恢复目录

1.创建表空间

2.创建目录所有者

3.授予权限
目录数据库
4.创建目录

5.连接到目标数据库

6.注册目标数据库
目标数据库

控制文件

Copyright © Oracle Corporation, 2001. All rights reserved.

如何创建恢复目录
要创建恢复目录,请执行以下步骤:
1. 连接到目录数据库并为该目录创建表空间:
SQL> create tablespace rman_ts datafile
2> ‘<directory>/<name>’
3> size 20M default storage
4> (initial 100K next 100K pctincrease 0);
2. 创建恢复目录的用户和方案:
SQL> create user rman_db01 identified by rman_db01
2> default tablespace rman_ts
3> quota unlimited on rman_ts;
3. 授予该用户维护恢复目录和执行备份、恢复操作的角色和权限。
SQL> grant recovery_catalog_owner to rman_db01;
SQL> grant connect, resource to rman_db01;

Oracle9i 数据库管理基础 II 17-8


如何创建恢复目录(续)
4. 登录到操作系统上,发出 RMAN 命令以调用 RMAN 命令解释器。创建目录。使用
LOG 选项允许 RMAN 将消息和命令输出到文件中。
% rman catalog rman_db1/rman_db1@catdb log = catalog.log
create catalog tablespace rman_ts;
exit;
注:使用 LOG 选项时,输出将定向到文件中,因而您可能得不到 RMAN 提示。因
此,当光标出现在新的一行时,应该输入 CREATE CATALOG 命令。类似地,应在
一个新行中输入 exit 命令。日志的用途是帮助您检查在创建目录过程中可能出现的
错误,以便进行更正。
查看由 RMAN 创建的 catalog.log 文件,注意在创建目录的过程中是否出现了错
误。如果确实发现了错误,则应该删除目录所有者下面的所有对象,从头开始重新创
建这些对象。
Catalog.log may appear as follows:
RMAN-06008: connected to recovery catalog database
RMAN-06428: recovery catalog is not installed
RMAN> create catalog tablespace rman_ts;
RMAN-06431: recovery catalog created
RMAN>
RMAN> exit;
Recovery Manager complete
5. 连接到目标数据库。要执行所有的备份和恢复操作,您必须以具有 SYSDBA 权限的
用户身份登录到目标数据库上。
% rman target sys/oracle@db01
RMAN-06005: connected to target database: DB01 (DBID=472633597)
RMAN> connect catalog rman_db01/rman_db01@catdb
RMAN-06008: connected to recovery catalog database
RMAN>

Oracle9i 数据库管理基础 II 17-9


如何创建恢复目录(续)
6. 在目录中注册目标数据库。如果未在恢复目录中注册目标数据库,则不能使用该目
录存储有关该数据库的信息。恢复管理器将内部数据库标识符 (DBID) 作为数据库
的唯一标识符,该标识符是在初次创建数据库时计算出的。如果要注册一个通过复
制现有数据库然后更改 db_name 而创建的新数据库,该注册操作将失败。可以使
用 DUPLICATE 命令避免出现这种问题,该命令从备份中复制数据库,并生成新
的数据库标识符。
要备份复制的数据库,请创建新的恢复目录所有者,然后在新帐户中创建目录。
RMAN 在恢复目录中创建包含目标数据库相关信息的行。RMAN 将目标数据库的所有
相关数据从控制文件复制到恢复目录中。
RMAN> register database;
RMAN-03022: compiling command: register
RMAN-03023: executing command: register
RMAN-08006: database registered in recovery catalog
RMAN-03023: executing command: full resync
RMAN-08002: starting full resync of recovery catalog
RMAN-08004: full resync complete
RMAN>
使用 Oracle Enterprise Manager
对于 Oracle9i,如果指定 Enterprise Manager 资料档案库位于本地数据库中,则创建恢复
目录。有关详细信息,请参阅 Configuration Assistant 联机帮助。
缺省情况下,将使用恢复目录的用户和口令 rman/rman 在 CATTBS 表空间中创建恢复目
录。

Oracle9i 数据库管理基础 II 17-10


使用恢复目录连接

• UNIX 上的示例
$ ORACLE_SID=db01; export ORACLE_SID
$ rman target /
RMAN> connect catalog rman_db01/rman_db01@catdb

• Windows NT 上的示例
C:\> set ORACLE_SID=db01
C:\> rman target /
RMAN> connect catalog rman_db01/rman_db01@catdb

Copyright © Oracle Corporation, 2001. All rights reserved.

如何连接恢复管理器
要使用恢复目录连接到 RMAN,请按照以下步骤操作:
1. 从目标数据库启动 RMAN 会话。
在 Windows NT 中,您可以在发出下面的 RMAN 命令之前调用命令提示符,或者您
可以使用 “开始” (Start) 菜单的 “运行” (Run) 选项调用命令行界面。
rman target sys/oracle@db01
RMAN-06005:connected to target database:
DB01(DBID=XXXXXXXXXX)
RMAN>
2. 连接到恢复目录数据库。
RMAN> connect catalog rman_db01/rman_db01@catdb
RMAN-06008: connected to recovery catalog database
RMAN>

Oracle9i 数据库管理基础 II 17-11


恢复目录维护

还原/恢复
恢复管理器 Enterprise
备份 (RMAN) Manager

报告
控制文件 REPORT
目标数据库 LIST 已存储的脚本

目录维护
注册
重新同步
重置 目录数据库
更改/删除/目录
备份/还原/恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

目录维护命令
CATALOG、CHANGE 和 DELETE 命令可用于手动更新恢复目录。在上一课中已介绍了这
些命令。
RESYNC 和 RESET 将在本课中介绍。

Oracle9i 数据库管理基础 II 17-12


目录维护

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


“目录维护向导” (Catalog Maintenance Wizard) 用于执行基本的恢复目录操作,如注册数据
库、重置数据库、重新同步目录等。“目录维护向导” 指导您完成定义恢复目录操作的过
程,以及通过 Oracle Enterprise Manager 提交目录维护作业以完成该操作。

Oracle9i 数据库管理基础 II 17-13


恢复目录的重新同步

可以通过以下两种方式来重新同步恢复目录:
• 使用 BACKUP 和 COPY 命令自动执行
• 使用 RESYNC CATALOG 命令手动执行

目录数据库
RMAN >

目标数据库
控制文件

Copyright © Oracle Corporation, 2001. All rights reserved.

重新同步恢复目录
重新同步恢复目录可确保元数据与目标控制文件的最新状态保持一致。
可以进行部分或完全重新同步。在部分重新同步中,RMAN 读取当前的控制文件以更新
更改的数据,但并不重新同步与数据库物理方案相关的元数据:数据文件、表空间、重
做线程回退段以及联机重做日志。在完全重新同步中,RMAN 更新所有更改的记录,包
括方案记录。
RMAN 自动检测何时需要执行完全或部分重新同步,并根据需要执行该操作。也可以通
过发出 RESYNC CATALOG 命令强制执行完全重新同步。
要确保目录处于最新状态,请定期运行 RESYNC CATALOG 命令。经验表明,应每隔 n 天
至少运行一次该命令,其中,n 是初始化参数。
CONTROL_FILE_RECORD_KEEP_TIME 的设置值。因为控制文件使用一个循环重用的系
统,所以最终会覆盖备份和副本记录。通过重新同步该目录,可确保将这些记录存储在目
录中,而不会丢失。

Oracle9i 数据库管理基础 II 17-14


使用 RESYNC CATALOG 进行重新同步

当您执行以下操作后,需要发出 RESYNC CATALOG 命令:


• 添加或删除表空间
• 添加或删除数据文件
• 重新定位数据库文件
$ rman target / catalog rman/rman@catdb
RMAN> RESYNC CATALOG;

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RESYNC CATALOG 命令
数据库的任何结构变化都会造成控制文件和恢复目录 “不同步”。在对目录发出 BACKUP
或 COPY 命令时,会自动同步该目录。但是,该同步过程可能会延迟备份操作。
RESYNC CATALOG 命令更新以下记录:
• 日志历史记录:在进行日志切换时创建。恢复管理器跟踪该信息,以便明确应该查找
哪些归档日志。
• 归档重做日志:与通过归档联机日志、复制现有的归档日志或还原归档日志备份集创
建的归档日志相关联。
• 备份历史记录:与备份集、备份片、备份集成员、代理副本和映像副本相关联。
• 物理方案:与数据文件和表空间相关联。
使用 Oracle Enterprise Manager
使用 “目录维护向导” (Catalog Maintenance Wizard) 的 “操作选项” (Operation Choice) 页重
新同步该目录。

Oracle9i 数据库管理基础 II 17-15


重置数据库复本

• RESET DATABASE 命令用于:


– 指示 RMAN 新建一个数据库复本记录
– 区分使用 RESETLOGS 打开和旧控制文件的故障还原操作

• 在执行 RESET DATABASE 命令之后使用 RESETLOGS


打开

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 RESET DATABASE 命令
数据库的复本号是在将日志序列号重置为零前用于标识数据库版本的号码。它可防止将归
档和联机重做日志应用到错误的数据库复本中。恢复管理器使用 RESET DATABASE 命令
在恢复目录中存储数据库复本信息。所有后续备份和日志归档均与新数据库复本相关联。
如果将目标数据库恢复到过去的某一时刻,则必须使用 RESETLOGS 选项打开该数据库。
这种情况下,在发出 RESET DATABASE 命令前,恢复管理器无法再次使用恢复目录。这
样,恢复管理器就可以区分 RESETLOGS 和旧控制文件的故障还原了。
使用 Oracle Enterprise Manager
使用 “目录维护向导” (Catalog Maintenance Wizard) 的 “操作选项” (Operation Choice) 页重
置目标数据库的恢复目录。

Oracle9i 数据库管理基础 II 17-16


使用 RESET DATABASE 命令(续)
示例
RMAN> reset database;
RMAN-03022: compiling command: reset
RMAN-03023: executing command: reset
RMAN-08006: database registered in recovery catalog
RMAN-03023: executing command: full resync
RMAN-08002: starting full resync of recovery catalog
RMAN-08004: full resync complete
RESET DATABASE TO INCARNATION 键命令
RESET DATABASE TO INCARNATION <identifier> 命令通过还原以前的数据库复
本备份来撤消 RESETLOGS 操作的影响。必须指定要还原的数据库复本的记录主键:
RMAN> reset database to incarnation <identifier>;
注:标识符是通过 LIST INCARNATION OF DATABASE 命令获取的。
示例
RMAN> list incarnation of database;
RMAN-03022: compiling command: list
RMAN-06240: List of Database Incarnations
RMAN-06241: DB Key Inc Key DB Name DB ID CUR Reset SCN
RMAN-06242: ------ ------- ------- ---------- --- ---------
RMAN-06243: 1 2 ORACLE 1186311932 YES 25730
RMAN-06243: 1 421 ORACLE 1186311932 NO 172279
RMAN> reset database to incarnation 421;

Oracle9i 数据库管理基础 II 17-17


恢复目录报告

还原/恢复
恢复管理器 Enterprise
备份 (RMAN) Manager

报告
控制文件 REPORT
目标数据库 LIST 已存储的脚本

目录维护
注册
重新同步
重置 目录数据库
更改
备份/还原/恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复目录报告
这些命令可以分析并列出包含在恢复目录中的信息。
REPORT 命令
可以使用 REPORT 命令来分析备份、复制、还原和恢复操作的各个方面。
LIST 命令
可以使用 LIST 命令显示备份集、文件副本和归档日志的相关信息(存储在恢复目录中)。
视图
除了 REPORT 和 LIST 命令外,还可以使用 SQL 命令查询创建恢复目录时创建的数据字
典和动态视图。

Oracle9i 数据库管理基础 II 17-18


查看恢复目录

数据字典视图:
• RC_DATABASE
• RC_DATAFILE
• RC_STORED_SCRIPT
• RC_STORED_SCRIPT_LINE
• RC_TABLESPACE

Copyright © Oracle Corporation, 2001. All rights reserved.

数据字典视图
恢复目录视图不是正规的视图,这些视图针对 RMAN 使用进行了优化,而不是针对用户
查询进行了优化。通常,可以使用 RMAN 报告命令从恢复目录获取所需的信息。
可以按下面的示例所示使用恢复目录视图:
示例 1
确定哪些数据库当前已在恢复目录中注册:
SQL> select * from rc_database;
DB_KEY DBINC_KEY DBID NAME CHANGE# RESETLOGS
------ --------- ---------- -------- -------- ---------
1 2 1943591421 DB01 1 20-APR-99

Oracle9i 数据库管理基础 II 17-19


数据字典视图(续)
示例 2
确定哪些表空间当前存储在目标数据库的恢复目录中:
SQL> SELECT DB_KEY, DBINC_KEY, DB_NAME, TS#, NAME,
CREATION_CHANGE# CHANGE#, CREATION_TIME CRE_DATE
FROM rc_tablespace;

DB_KEY DBINC_KEY DB_NAME TS# NAME CHANGE# CRE_DATE


------ --------- ------- -- ------ ------- ---------
1 2 DB01 3 DATA01 9611 20-APR-99
1 2 DB01 1 RBS 9599 20-APR-99
1 2 DB01 4 RMAN_TS 14023 29-APR-99
1 2 DB01 0 SYSTEM 3 20-APR-99
1 2 DB01 2 TEMP 9605 20-APR-99
示例 3
确定哪些表空间当前存储在目标数据库的恢复目录中:
SQL> SELECT * FROM rc_stored_script;
DB_KEY DB_NAME SCRIPT_NAME
------- -------- --------------------------------------
1 DB01 nightlybackup
1 DB01 archivebackup

Oracle9i 数据库管理基础 II 17-20


已存储的脚本

还原/恢复 恢复 Enterprise
管理器 Manager
备份 (RMAN)

报告
控制文件 REPORT
目标数据库 LIST 已存储的脚本

目录维护
注册
重新同步
重置 目录数据库
更改
备份/还原/恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

已存储的脚本
恢复管理器脚本是一组命令,它:
• 可以指定频繁使用的备份、恢复和还原操作
• 是由 CREATE SCRIPT 命令创建的
• 存储在恢复目录中
• 只有通过 RUN 命令才能调用
• 使您能够设计、开发和测试用于备份、还原和恢复数据库的命令组
• 可以使操作者出错误的可能性降到最低
存储和查看脚本
作为一个示例,创建名为 level0backup 的脚本,并将它存储在恢复目录中以制作增量 0 级
备份。通过将脚本存储在恢复目录中,任何使用恢复管理器的 DBA 都可以访问这些脚本。
可通过查询 RC_STORED_SCRIPT 视图,显示已存储的脚本的列表。
可以查询 RC_STORED_SCRIPT_LINE 视图以列出指定的已存储脚本的文本,或者使用
PRINT SCRIPT 命令。

Oracle9i 数据库管理基础 II 17-21


脚本示例

• 使用 CREATE SCRIPT 存储脚本。


RMAN> create script Level0Backup {
backup
incremental level 0
format ‘/u01/db01/backup/%d_%s_%p’
fileperset 5
(database include current controlfile);
sql ‘alter database archive log current’;
}

• 使用 EXECUTE SCRIPT 运行脚本。


RMAN > run {execute script Level0Backup;}

Copyright © Oracle Corporation, 2001. All rights reserved.

创建和使用已存储的脚本
通常,备份、还原和恢复操作是使用脚本自动执行的。RMAN 提供了一种将这些脚本存
储在恢复目录中的方法。可使用 CREATE SCRIPT 命令来创建脚本。使用 RUN 命令来执
行脚本。

Oracle9i 数据库管理基础 II 17-22


管理脚本

• 使用 REPLACE SCRIPT 重写脚本


RMAN> REPLACE SCRIPT Level0Backup {

fileperset 3

}

• 使用 DELETE SCRIPT 删除脚本


RMAN> DELETE SCRIPT Level0Backup;

• 使用 PRINT SCRIPT 显示脚本


RMAN> PRINT SCRIPT Level0Backup;

Copyright © Oracle Corporation, 2001. All rights reserved.

管理已存储的脚本
可以使用 REPLACE SCRIPT 命令重写脚本。必须提供整个脚本,而不仅仅是更改的行。

Oracle9i 数据库管理基础 II 17-23


恢复目录备份

• 包含恢复目录的数据库的整体数据库备份
• 包含恢复目录的表空间的表空间备份
• 导出:
– 如果目录数据库不是很大,则可以定期导出该数据库。
– 如果目录数据库很大,则导出包含恢复目录的方案。

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复目录备份
拥有经过检验的恢复目录备份策略是至关重要的。恢复目录是数据库中存储的对象的方案。
备份恢复目录的注意事项与备份方案相似。
您可以使用下列策略之一来备份恢复目录:
• 整体数据库备份:可以使用 RMAN 或操作系统命令进行整体数据库备份。
• 表空间备份:如果恢复目录存储在单独的表空间中(建议如此)并且目录数据库在
ARCHIVELOG 模式下操作,您可以联机备份包含恢复目录的表空间。
• 导出:如果包含目录的数据库不是很大,则可以定期导出该数据库。但是,当目录数
据库很大时,导出将花费很长的时间并占用大量磁盘存储空间。这时,可以只导出包
含恢复目录的方案。
始终将恢复目录存储在不同于目标数据库的数据库中。另外,还要确保将目录数据库的相
关文件与目标数据库的相关文件存储在不同的磁盘上。

Oracle9i 数据库管理基础 II 17-24


恢复恢复目录

• 用以前的恢复目录数据库备份创建一个数据库。
• 将目录重新定位到另一个数据库中并导入数据。
• 从导出内容中导入整个数据库。

Copyright © Oracle Corporation, 2001. All rights reserved.

恢复恢复目录
恢复恢复目录的策略应取决于故障的性质和使用的备份策略。
如果包含恢复目录的数据库损坏并且需要重建,则应考虑下列恢复选项:
• 可以用以前的恢复目录数据库备份创建数据库。
• 您可能决定将目录放置到另一个数据库中。在该数据库中,创建一个用户并授予该用
户 RECOVERY_CATALOG_OWNER 权限。可以从以前目录所有者的导出内容中将数据
导入到新建用户的方案中。
• 可以创建一个新的数据库,并从恢复目录数据库的导出内容中导入整个数据库
当重建了恢复目录后,应该立即重新同步该目录与目标数据库的控制文件。
在重新同步期间,恢复管理器可能为已不存在的文件添加记录,这是因为没有对重新编入
目录的文件进行验证。请发出 CHANGE … UNCATALOG 命令删除这些记录。

Oracle9i 数据库管理基础 II 17-25


小结

在这一课中,您应该能够掌握:
• 在使用恢复目录之前,必须注册目标数据库
• 应该经常使用控制文件重新同步该目录
• 可以将脚本存储在恢复目录中

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 17-26


练习 17 概览

此练习涉及以下主题:
• 创建恢复目录
• 在恢复目录中注册目标数据库
• 列出目标数据库的复本
• 将脚本存储在恢复目录中并执行该脚本

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 17-27


练习 17 RMAN 恢复目录
1. 执行 $HOME/STUDENT/LABS/lab17_01.sql 脚本以创建恢复目录的 recat 表空
间以及 rcuser 方案。
2. 使用 RMAN 连接到恢复目录数据库。在 recat 表空间中创建该目录。
3. 用 RMAN 与目标数据库和恢复目录连接起来。
4. 执行此命令以重新同步控制文件和恢复目录。结果怎样?为什么?
5. 在恢复目录中注册目标数据库。
6. 使用 RMAN,列出目录中注册的所有数据库复本。
7. 在 RMAN 提示符下输入 RESET DATABASE 命令。结果怎样?
8. 查看 $HOME/LABS/lab17_08.sql 脚本。在 SQL*Plus 中,以 system/manager 的身
份连接到目标数据库并执行该脚本,以便在 $HOME/BACKUP 目录中创建 SAMPLE 表
空间数据文件的联机操作系统副本。
9. 使用 RMAN,将在第 8 步中制作的备份添加到恢复目录中。
10. 使用 RMAN,确认已将数据文件添加到恢复目录中。
11. 使用 RMAN 命令从恢复目录中删除 SAMPLE 表空间数据文件的备份。切勿从操作系
统中删除该文件。
12. 使用 SQL*Plus 连接到恢复目录数据库,查询 RC_DATAFILE_COPY 视图,确认已从
恢复目录中删除了该数据文件。
13. 创建一个脚本以做一个带有下列信息的整体数据库备份:
脚本名:nightback
通道名:dbnD (n 是学生帐号)
通道类型:磁盘
格式:$HOME/BACKUP/RMAN/%b%d%s%p
级别:数据库(无归档日志)
标记:nback
注:此时不要运行该脚本。
14. 使用 PRINT 命令查询恢复目录,并验证是否创建了脚本。

Oracle9i 数据库管理基础 II 17-28


在数据库之间传输数据

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 描述导出和导入实用程序的使用
• 描述导出和导入的概念与结构
• 执行简单的导出和导入操作
• 列出使用导出和导入操作的原则

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 18-2


Oracle 导出和导入实用程序

Oracle
数据库

导出

导入
Oracle
数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

导出和导入实用程序
导出实用程序提供了一种简单方法,使用该方法,您可以在 Oracle 数据库之间传送数据
对象,即使这些数据库位于具有不同硬件和软件配置的平台上。
对 Oracle 数据库运行导出实用程序时,该实用程序将提取对象(如表),如果这些对象
还存在相关对象,则继续提取这些相关对象(如索引、注释和授权)。提取出的数据写
入一个导出文件中,该文件是一个 Oracle 二进制格式的转储文件,且通常位于磁盘或磁
带上。
导入实用程序从导出转储文件中读取对象定义和表数据。它用于将数据对象插入 Oracle
数据库。

Oracle9i 数据库管理基础 II 18-3


Oracle 导出和导入实用程序概览

您可以使用这两个实用程序来执行以下任务:
• 归档历史数据
• 保存表定义以防止出现用户错误故障
• 在计算机和数据库之间,或在不同版本的 Oracle
服务器之间移动数据
• 在数据库之间传输表空间

Copyright © Oracle Corporation, 2001. All rights reserved.

导出和导入实用程序概览
导出实用程序可以提供以下内容的逻辑备份:
• 数据库对象
• 表空间
• 整个数据库
导入实用程序用于读取有效的导出文件,以便将数据移动到数据库中。重做日志历史记录
不能应用于从导出文件中导入的对象,因此,虽然仍可能会造成数据丢失,但是可以使丢
失减至最少。
您可以使用导出和导入实用程序来执行正常的操作系统备份,方法是使用这两个实用程序
执行以下操作:
• 创建某个数据库对象或整个数据库的历史归档;例如,在修改某个方案以支持不断变
化的业务要求时。
• 将表定义保存在一个二进制文件中。这对于创建和维护一个给定方案结构的基线可能
非常有用。
• 将数据从一个 Oracle 数据库版本移动到另一个 Oracle 数据库版本,例如从 Oracle8i 升
级到 Oracle9i。

Oracle9i 数据库管理基础 II 18-4


导出和导入实用程序概览(续)
使用这两个实用程序可以防止出现以下情形:
• 可能因用户意外删除或截断表而造成的用户错误
• 逻辑上已经损坏的表
• 只影响数据库的子集的不正确的批处理作业或其它 DML 语句
使用这两个实用程序可以恢复:
• 当一个物理数据库的各个表空间中存在多个逻辑数据库时,将某个逻辑数据库恢复到
与物理数据库中其它逻辑数据库不同的时间点
• 当表空间时间点恢复 (TSPITR) 与使用备份还原整个数据库然后再前滚数据库相比,前
者的效率更高时,则恢复超大型数据库 (VLDB) 中的某个表空间
注:本课程介绍导出和导入实用程序,并讨论这两个实用程序如何影响备份和恢复操作。
有关这两个实用程序的详细说明,请参阅 Oracle9i Database Utilities 手册。

Oracle9i 数据库管理基础 II 18-5


调用导出和导入实用程序的方法

• 命令行界面
• 交互式对话
• 参数文件
• Oracle Enterprise Manager

Copyright © Oracle Corporation, 2001. All rights reserved.

调用导出和导入实用程序
您可以通过以下任何一方法来调用导出和导入实用程序并指定参数:
• 命令行输入
• 交互式提示
• 参数文件
• Oracle Enterprise Manager 数据管理向导
要使用导出实用程序,必须对 Oracle 数据库拥有 CREATE SESSION 权限。要导出由另
一个用户拥有的表,必须已启用了 EXP_FULL_DATABASE 角色。该角色授予所有 DBA。
如果您不具有 EXP_FULL_DATABASE 角色中所包含的系统权限,则无法导出包含在另一
个用户的方案中的对象。
要使用导入实用程序,需要具有 CREATE SESSION 权限以便登录到 Oracle 数据库服务
器。此权限属于在创建数据库期间建立的 CONNECT 角色。
即使您没有创建导出文件,也可以执行导入。但是,如果导出文件是由其他人而不是您创
建的,则只当您具有 IMP_FULL_DATABASE 角色的权限时,才可以导入该文件。
注:许多选项只能通过命令行界面才能使用。不过,您可以将参数文件与命令行一起使用。

Oracle9i 数据库管理基础 II 18-6


导出模式

完全数据库
表模式 用户模式 表空间模式 模式
表定义 表定义 表定义 表定义

表数据(所有行 表数据 表数据


或选定的行)

所有者的表授权 所有者的授权 授权 授权

所有者的表索引 所有者的索引 索引 索引

表约束 表约束 表约束 表约束


触发器

Copyright © Oracle Corporation, 2001. All rights reserved.

导出模式
表模式
表模式可以导出用户方案中的指定的表,而不是导出所有表。已授权的用户可以导出其他
用户所拥有的指定的表。
用户模式
用户模式可以导出某个用户方案的所有对象。已授权的用户可以导出一组指定用户的方案
中的所有对象。此模式可用于执行完全数据库导出。
表空间模式
表空间模式可用于导出指定表空间中的所有表。
使用可移动的表空间功能,可以将一组表空间从一个 Oracle 数据库移动到另一个 Oracle
数据库。
利用可移动的表空间来移动数据,其速度比对相同数据执行导入/导出要快得多,原因是
传输表空间只需要复制数据文件,然后并入表空间结构信息即可。您还可以使用可移动的
表空间来移动索引数据,从而避免在导入表数据时必须重建索引。

Oracle9i 数据库管理基础 II 18-7


导出模式(续)
完全数据库模式
完全数据库模式可以导出所有数据库对象,SYS 方案中的对象除外。只有已授权的用
户才能在此模式中执行导出。
注:这是部分处理。有关模式和对象的完全处理,请参阅 “Oracle9i Utilities Guide”,部
件号为 A86728-01。

Oracle9i 数据库管理基础 II 18-8


调用导出实用程序

• 语法:
exp keyword = value, value2, … ,valuen
• 示例:
exp hr/hr TABLES=employees,departments
rows=y file=exp1.dmp

exp system/manager OWNER=hr direct=y


file=expdat.dmp

exp \'username/password AS SYSDBA\'


TRANSPORT_TABLESPACE=y
TABLESPACES=ts_emp log=ts_emp.log

Copyright © Oracle Corporation, 2001. All rights reserved.

调用导出实用程序
命令行导出
可以使用导出实用程序的命令行模式将数据库数据复制到某个操作系统文件中。只有导入
实用程序才能读取该文件。
示例
创建名为 exp1.dmp 的导出文件,其中包含 HR 方案中的表 EMPLOYEES 和
DEPARTMENTS(包括表行):
exp hr/hr tables=employees,departments rows=y file=exp1.dmp
注:表名称中可包含任意数量的 '%' 模式匹配字符,其中每个字符可将表名称中的零或多
个字符与数据库中的表对象相匹配。
创建一个名为 expdat.dmp 的快速导出文件,其中包含 HR 方案的所有对象:
exp system/manager owner=hr direct=y
注:缺省的导出文件名为 expdat.dmp。

Oracle9i 数据库管理基础 II 18-9


调用导出实用程序(续)
创建一个名为 expdat.dmp 的导出文件,该文件中包含属于 TS_EMPLOYEES 表空间
的所有的对象定义,并生成一个名为 ts_employees.log 的日志文件:
exp \'username/password AS SYSDBA\' TRANSPORT_TABLESPACE=y\
TABLESPACES=ts_employees LOG=ts_employees.log

Oracle9i 数据库管理基础 II 18-10


导出参数
参数 说明 缺省值
BUFFER 指定用于提取行的缓冲区的大小 取决于操作
(以字节为单位) 系统
COMPRESS 指定导出实用程序如何管理表数据 Y
的初始区
CONSISTENT 指定导出实用程序是否使用 Y
SET TRANSACTION READ ONLY
DIRECT 指定使用直接路径 N
FEEDBACK 指定为已导出的 n 行显示时间段形 0
式的进度表。
FILE 指定导出文件的名称 expdat.dmp
FULL 指示以完全数据库模式导出 N
HELP 显示参数的说明 N
INDEXES 指定是否导出索引 Y
LOG 指定接收信息性消息和错误消息的 无
文件名
OWNER 指示以用户模式导出,并列出要导 无
出的对象所属的用户
PARFILE 指定包含有导出参数列表的文件 无
RECORDLENGTH 指定文件记录长度(以字节为单位) 取决于操作
系统
ROWS 指定是否导出表数据的行 Y
TABLES 指定以表模式导出,并列出要导出 无
的表名称、分区和子分区名称
TABLESPACES 指定导出表空间中的所有表 无
TRANSPORT_ 启用导出可移动的表空间元数据 N
TABLESPACE
USERID 指定执行导出操作的用户的用户名/ 无
口令

Oracle9i 数据库管理基础 II 18-11


使用导出向导

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


“导出向导” (Export Wizard) 是 “数据管理” (Data Management) 向导之一,它引导您指定要
导出的内容,并通过 Enterprise Manager 提交导出作业以完成操作。

Oracle9i 数据库管理基础 II 18-12


直接路径导出概念

导出 Oracle 服务器
双任务 SQL 缓冲区高
生成 SQL 命令 公用协议 命令处理 速缓存 写入块
(Two-Task 管理器
common,
导出 TTC)
TTC 缓冲区高 读取块
转储文件 评估缓冲区 速缓存
缓冲区

直接路径

直接路径
常规路径

Copyright © Oracle Corporation, 2001. All rights reserved.

直接路径导出概念
使用直接路径功能可以大大加快提取数据的速度。如果指定了 DIRECT=Y 参数,导出实
用程序将直接从数据层读取,而不必通过 SQL 命令处理层。
直接路径导出机制
• 直接导出模式可以通过指定 DIRECT=Y 参数来设置。
• 直接路径导出不与例程的其它资源竞争。
• 在直接读取模式中,它将数据库的数据块读入由会话使用的一个专用区域中。
• 行将被直接传送到双任务通信协议 (Two-Task Common, TTC) 缓冲区以供传输。
• TTC 协议缓冲区中数据的格式是导出实用程序预期的格式。

Oracle9i 数据库管理基础 II 18-13


直接路径导出功能

• 导出类型将显示在屏幕输出、导出转储文件和日志
文件中。
• 数据已经是导出实用程序所预期的格式,从而避免
了不必要的数据转换。
• 使用优化的 SQL SELECT 语句。

Copyright © Oracle Corporation, 2001. All rights reserved.

直接路径导出
导出实用程序的直接路径选项引入了一些有别于常规路径导出的功能。
直接路径功能
• 导出的类型将显示在屏幕输出、导出转储文件和以 LOG 参数指定的日志文件中。
• 数据已经是导出实用程序所预期的格式,因此避免了不必要的数据转换。数据将
传送到导出客户机,该客户机随后将数据写入导出文件。
• 直接路径导出使用经过优化的 SELECT * FROM 表,而不带任何谓词。
注:导出转储文件中的列数据和说明的格式与常规路径导出的相应格式不同。

Oracle9i 数据库管理基础 II 18-14


直接路径导出的限制

• 直接路径选项不能交互式调用。
• 客户端和服务器端的字符集必须相同。
• BUFFER 参数不起作用。
• 不能使用直接路径选项来导出包含 LOB、BFILE、REF
的行或对象类型。

Copyright © Oracle Corporation, 2001. All rights reserved.

直接路径的限制
导出实用程序的直接路径选项具有一些有别于常规路径导出的限制。
• 直接路径导出功能不能通过使用交互式 EXP 会话来进行调用。
• 在使用直接路径选项时,客户端的字符集必须与服务器端的字符集相匹配。可以使用
环境变量 NLS_LANG 设置为与服务器端相同的字符集。
• 导出实用程序的 BUFFER 参数对直接路径导出不起作用;只有常规路径选项使用该参
数。
• 不能使用直接路径导出功能来导出包含有 LOB、BFILE、REF 数据类型的行或对象类
型列(包括 VARRAY 列和嵌套表)。只导出用来创建表的数据定义,而不导出数据。

Oracle9i 数据库管理基础 II 18-15


指定直接路径导出

• 使用导出命令的命令行参数:
exp userid=hr/hr full=y direct=y

• 使用参数文件中的关键字:
exp parfile=<Parameter file>

参数文件
…..(其它参数)
DIRECT = Y
…...(其它参数)

Copyright © Oracle Corporation, 2001. All rights reserved.

指定直接路径导出
在可以使用直接路径导出之前,必须确保已运行了 catexp.sql 脚本。它位于
$HOME/rdbms/admin/ 目录下。
命令行选项
可以在操作系统提示符下使用 DIRECT 命令行参数来调用直接路径导出。
$ exp user=hr/hr full=y direct=y
参数文件
exp_par.txt是参数文件的一个示例:
USERID=hr/hr
TABLES=employees,departments
FILE=exp_one.dmp
DIRECT=Y
从操作系统提示符下使用参数文件调用导出实用程序:
$ exp parfile=exp_param.txt

Oracle9i 数据库管理基础 II 18-16


使用导入实用程序进行恢复

• 创建表定义
• 从有效的导出文件中提取数据
• 从完全或累积导出文件中导入
• 从用户错误故障中恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

导入实用程序
导入实用程序从导出转储文件中读取对象定义和表数据。它将数据对象插入 Oracle 数据
库。导入功能包括:
• 创建表定义(因为表定义存储在导出文件中)。选择导入不带行的数据将只创建表定
义。
• 从有效的导出文件中提取数据,方法是使用表模式、用户模式、表空间模式或完全导
入模式
• 从完全或累积导出文件中导入数据
• 使用前面所述的方法之一从用户操作失败而导致的错误中(如意外删除或截断了某个
表)恢复

Oracle9i 数据库管理基础 II 18-17


导入模式

模式 说明

表模式 将指定的表导入方案中。

用户模式 导入属于某个方案的所有对象

表空间模式 导入表空间中包含的所有的对象定义

完全数据库模式 从导出文件中导入所有对象

Copyright © Oracle Corporation, 2001. All rights reserved.

导入模式
表模式
表模式可以导入用户方案中所有指定的表,而不是导入所有表。已授权的用户可以导入其
他用户拥有的指定的表。
用户模式
用户模式可以导入某个用户方案的所有对象。已授权的用户可以导入一组指定用户的方案
中的所有对象。
表空间模式
表空间模式允许已授权的用户将一组表空间从一个 Oracle 数据库移动到另一个 Oracle 数
据库。
完全数据库模式
完全数据库模式可以导入所有数据库对象,SYS 方案中的对象除外。只有已授权的用户才
能以此模式执行导入。

Oracle9i 数据库管理基础 II 18-18


调用导入实用程序

• 语法:
imp keyword = value or keyword = value,
value2, … value n
• 示例:
imp hr/hr TABLES=employees,departments
rows=y file=exp1.dmp

imp system/manager FROMUSER=hr file=exp2.dmp

imp \'username/password AS SYSDBA\'


TRANSPORT_TABLESPACE=y
TABLESPACES=ts_employees

Copyright © Oracle Corporation, 2001. All rights reserved.

调用导入实用程序
导入示例
使用名为 exp1.dmp 的导出文件,将表 EMPLOYEES 和 DEPARTMENTS(包括表行)导
入 HR 方案中。
$ imp hr/hr tables=employees,departments rows=y file=exp1.dmp
使用名为 exp2.dmp 的导出文件,导入所有属于 HR 方案的对象(包括表行)。
$ imp system/manager FROMUSER=hr file=exp2.dmp
使用名为 expdat.dmp 的导出文件,导入所有属于表空间 TS_EMPLOYEES 的对象定义。
$ imp \'username/password AS SYSDBA\' \
TRANSPORT_TABLESPACE=y TABLESPACES=ts_employees
如果未指定文件参数,导入实用程序会查找缺省的文件 expdat.dmp。
注:命令行模式选项与交互模式选项相似,但却提供更多的功能。

Oracle9i 数据库管理基础 II 18-19


导入参数

参数 说明 缺省值
BUFFER 指定用来传送数据行的缓冲区大小 取决于操作系统
(以字节为单位)
DATAFILES 列出要传输到数据库中的数据文件 无
DESTROY 指定是否应重复使用构成数据库的现 N
有数据文件
FEEDBACK 为已导入的 n 行显示时间段形式的进 0
度表
FILE 指定要导入的导出文件的名称 expdat.dmp
FROMUSER 要导入的方案的列表 无
FULL 指定是否导入整个导出文件 N
HELP 显示导入参数的说明 N
IGNORE 指定应如何处理对象创建错误 N
INDEXES 指定是否导入索引 Y
INDEXFILE 指定接收索引创建语句的文件 无
LOG 指定接收信息性消息和错误消息的文件 无
PARFILE 指定包含有导入参数列表的文件 无
RECORDLENGTH 指定文件记录长度(以字节为单位) 取决于操作系统
ROWS 指定是否导入表数据的行 Y
TABLES 指定以表模式导入,并列出要导入的 无
表名称、分区和子分区名称
TABLESPACES 指定要传输到数据库中的表空间列表 无
TOUSER 指定其方案要作为导入目标的用户名 无
列表
TRANSPORT_ 从导出文件中导入可移动的表空间元 N
TABLESPACE 数据
USERID 指定执行导入操作的用户的用户名/ 无
口令

Oracle9i 数据库管理基础 II 18-20


使用导入向导

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 Oracle Enterprise Manager


“导入向导” (Import Wizard) 是 “数据管理” (Data Management) 向导之一,它引导您指定要
导入的内容,并通过 Enterprise Manager 作业系统提交导入作业以完成操作。

Oracle9i 数据库管理基础 II 18-21


作为 SYSDBA 调用导入实用程序

• 在下列条件下,您需要以 SYSDBA 用户身份调用导入


实用程序:
– 应 Oracle 技术支持的要求
– 在导入可移动的表空间集时
• 要以 SYSDBA 用户身份来调用导入实用程序,请执行
以下命令:
imp \'username/password AS SYSDBA\'

Copyright © Oracle Corporation, 2001. All rights reserved.

作为 SYSDBA 导入
SYSDBA 在内部使用并具有专门功能。它的行为与一般用户的行为不同。因此,通常应不
需要以 SYSDBA 用户身份来调用导入实用程序,除了以下两种情况:
• 应 Oracle 技术支持的要求
• 在导入可移动的表空间集时
要以 SYSDBA 用户身份来调用导入实用程序,请使用下面的语法,并添加任何所需的参
数或参数文件名:
imp \'username/password AS SYSDBA\'
或者,也可以使用:
imp \'username/password@instance AS SYSDBA\'
如果遗漏了用户名或口令,导入实用程序将提示您输入它。在该示例中,完整的连接字符
串由引号和反斜杠括起来。这是因为字符串 AS SYSDBA 中包含一个空格;在这种情况
下,大多数操作系统都要求将整个连接字符串放在引号内,或用某种方法将其标记为一个
字。此外,某些操作系统还要求命令行中的引号前应具有转义符。在该示例中,反斜杠即
用作转义符。如果没有反斜杠,导入实用程序所使用的命令行语法分析器将无法理解引
号,而会在调用导入实用程序前删除它们。

Oracle9i 数据库管理基础 II 18-22


导入进程序列

1. 创建新表
2. 导入数据
3. 建立索引
4. 导入触发器
5. 对新表启用完整性约束
6. 建立所有位图、函数和/或域索引

Copyright © Oracle Corporation, 2001. All rights reserved.

导入进程序列
在导入一个表时,将读取导出文件,并按照以下顺序创建表和数据:
1. 创建新表
2. 导入数据
3. 建立索引
4. 导入触发器
5. 对新表启用完整性约束
6. 建立所有位图、函数和/或域索引
该顺序可防止数据由于表的导入顺序而被拒绝。该顺序还可防止对同一数据两次触发冗余
触发器(一次在初始插入时,一次在导入过程中)。
如果不导入某个用户拥有的所有对象,那么导入表的顺序将非常重要。例如,如果具有外
键的表对具有主键的表进行引用检查,而且先导入外键表,则在启用了约束条件的情况
下,将拒绝所有引用该尚未导入的主键的行。在完全数据库导出中不存在该问题。

Oracle9i 数据库管理基础 II 18-23


全球化支持注意事项

• 导出文件确定该文件中字符数据所使用的字符编码方案。
• 导入实用程序将数据转换成其主机系统的字符集。
• 多字节字符集导出文件必须导入到具有相同特征的系统
中。

Copyright © Oracle Corporation, 2001. All rights reserved.

全球化支持注意事项
将数据从使用一种字符集的 Oracle 数据库移动到另一个使用其它字符集的数据库时,请
确保必须对数据进行相应的转换。可以将 NLS_LANG 环境变量设置为要从其中导出数据
的数据库的字符集定义,以便进行数据转换。如果没有正确设置该变量,数据中的字符可
能会出现意外转换,从而导致数据丢失。
示例
将 7 位 ASCII 字符集(如美国英语)转换为 8 位字符集(如丹麦语)时,因为所有字符
在丹麦语字母表中均有对应的字符,所以无需转换。
而将 8 位 ASCII 字符集(如丹麦语)转换为 7 位字符集(如美国英语)时,会将美国英
语字母表中找不到的特别的丹麦语字符转换为问号 (?)。在这种情况下,使用问号代替未
知的丹麦语字符是一个合适的结果。
在 8 位至 8 位的数据移动中,是否丢失字符取决于用来输入数据的语言的特性。例如,西
班牙语字母表中的某些字母在丹麦语字母表中没有,所以将数据从西班牙语数据库移动到
丹麦语数据库时可能会需要数据转换,从而可能会丢失这些字符。

Oracle9i 数据库管理基础 II 18-24


小结

在这一课中,您应该能够掌握:
• 描述导出和导入实用程序的使用
• 说明导出和导入的概念与结构
• 执行简单的导出和导入操作
• 列出使用导出和导入操作的原则

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 18-25


练习 18 概览

此练习涉及以下主题:
• 使用导出实用程序
• 使用导入实用程序

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 18-26


练习 18
1. 调用导出实用程序以导出 HR 方案中的 EMPLOYEES 和 DEPARTMENTS 表。
2. 启动 SQL*Plus 并以 HR 身份进行连接。删除 EMPLOYEES 和 DEPARTMENTS 表。
3. 使用导入实用程序还原 EMPLOYEES 和 DEPARTMENTS 表。
4. 查询 EMPLOYEES 和 DEPARTMENTS 表以获取每个表的行数。

Oracle9i 数据库管理基础 II 18-27


Oracle9i 数据库管理基础 II 18-28
专题讨论

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 使用数据库配置工作表记录数据库配置
• 配置 Oracle9i 数据库以支持规定的业务要求

• 恢复出现故障的数据库,并使停机时间和数据
损失降至最小

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 19-2


目标

• 启用并使用跟踪输出以进行故障排除
• 识别并排除以下故障:
– 监听程序问题
– 客户机配置问题

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II 19-3


专题讨论方法

• 面向学习小组并鼓励组间交流
• 强化的实践诊断和问题解决
• 多种故障类型
• 恢复解决方案
• 多种配置错误
• 练习故障排除技能

Copyright © Oracle Corporation, 2001. All rights reserved.

面向学习小组的交互式结构
专题讨论的结构是将学员分组,每个人在各自的小组中执行数据库备份、还原和恢复操作。
鼓励每个组与班级中的其它组共享其排除数据库故障的方法。
强化的实践诊断和问题解决
旨在为您提供尽可能多的实践经验,以便诊断并应付各种备份和恢复情况。从本课程中获
得的经验和知识对于成功完成每个课时的目标将起到关键作用。

Oracle9i 数据库管理基础 II 19-4


各种故障情况
在本专题讨论中,教师将通过运行一系列 shell 脚本来引发各种配置错误。目的在于诊断
故障的本质并进行必要的更正。
在本专题讨论中,教师还将引发各种故障情况,并且不向班级中的学生介绍有关信息。这
样做的目的是诊断故障的本质,并执行相应的恢复过程。可能遇到的故障类型包括:
• 重做日志组丢失
• 数据文件丢失
• 控制文件丢失
• 介质丢失
• 表丢失
• 联机还原段数据文件丢失
恢复解决方案
本专题讨论将模拟现实世界中的环境,即当数据库出现故障时,可能并没有现成的问题
解决方案可用。因此,本课程只在附录 B 中为执行还原和恢复操作提供了粗略的指导。
在某些情况下,您可能需要使用包含在附录 C 中的相关的 Oracle 全球支持系统公告板。
这样做的目的是使您熟悉可用的文档,以及如何理解文档以成功进行数据库恢复。

Oracle9i 数据库管理基础 II 19-5


专题讨论的方法步骤

• 实际调查:
– 使用视图和工具以获得信息
– 查看跟踪文件和日志文件
– 查看命令输出和日志文件
– 使用视图和工具以确认正确的数据库配置
• 数据库配置:
– 启用归档
– 镜像控制文件和日志文件
– 备份控制文件

Copyright © Oracle Corporation, 2001. All rights reserved.

实际调查
使用 Oracle9i 环境中的工具,如 V$ 视图、数据字典视图、SQL*Plus 中的工具以及 Oracle
Enterprise Manager(如果有),可获得有关数据库环境的信息。记住业务要求,并记录所
有您感到为支持这些业务要求需要纠正或改进的不足之处。
您将使用命令(tnsping、sqlplus 和 lsnrctl 等等)输出和日志文件来执行必要的
故障排除。对于第二部分,您可以使用 Oracle9i 环境中的工具(如 V$ 视图和 SQL*Plus
中的工具)来设置和测试您的配置。
数据库配置
真正修改数据库的配置,以确保:
• 启用归档
• 控制文件和日志文件在多个设备上镜像和分布
• 控制文件既备份到跟踪文件,也以二进制格式备份

Oracle9i 数据库管理基础 II 19-6


业务要求

• 24 小时可用性

• 使用高峰期在各个时区互不相同
• 需要每日进行备份
• 需要执行完全数据库恢复

Copyright © Oracle Corporation, 2001. All rights reserved.

业务要求
在配置数据库进行备份和恢复时,应了解以下业务要求。
24 小时可用性:数据库必须每周 7 天、每天 24 小时可用。每个月的第一个星期六,在例
程可以关闭时安排一个 8 小时维护窗口。
使用高峰期随可用时间段的变化而不同:该数据库供全球访问,所以每天 24 小时均会使
用该数据库。
每日备份:需要每日进行完全数据库备份。
完全数据库恢复:这是一个关键业务应用,绝不允许丢失任何数据。每天 24 小时均会发
生大量的事务处理。

Oracle9i 数据库管理基础 II 19-7


排除数据库故障

• 第一阶段:诊断问题
• 第二阶段:还原相应的文件
• 第三阶段:恢复数据库
• 第四阶段:备份数据库

Copyright © Oracle Corporation, 2001. All rights reserved.

解决专题讨论故障情况
故障和恢复方案是一些实践练习,每个学习小组均可以灵活地执行自己认为是正确的还原
和恢复操作。专题讨论期间大约练习六种故障和恢复情况。
教师不会告诉您练习哪种情况。在排除故障时,请按照本课介绍的诊断步骤操作。

Oracle9i 数据库管理基础 II 19-8


第一阶段:诊断问题
1.第一个阶段是研究故障的本质。使用 V$ 视图、数据字典视图、跟踪文件和日志文件、
基本操作系统命令和 Oracle Enterprise Manager 来诊断问题。
2. 确定数据库例程是否可用以及数据库是否打开。
3. 尝试启动该例程。
4. 如果在启动例程或打开数据库时出现问题,请关闭该例程。
5. 检查跟踪文件和警报日志文件。
6. 确定适当的恢复方法:
– 已关闭的数据库恢复
– 打开的数据库恢复、脱机表空间恢复
– 打开的数据库恢复、脱机表空间恢复、单独的数据文件恢复
– 基于取消的恢复
– 基于时间的恢复
– 基于更改的恢复
7. 在确定了要处理的故障类型后,请参阅附录 B 来获取其它说明和信息。
第二阶段:还原相应的文件
在执行恢复方案之前,先确定要还原何种文件以及例程和数据库必须处于何种状态,才能
进行恢复。记住,目的是尽量减少关机的时间以及数据的丢失,所以,如果没有必要,不
要还原文件。
第三阶段:恢复数据库
在还原相应的文件后,开始进行恢复操作。完成恢复后,记录所有可以采用的预防性方
法,以防止今后出现同样类型的故障。
第四阶段:备份数据库
并非所有恢复操作均需要在完成时进行数据库备份。不过,要确定数据库是否需要备份,
如果需要,再执行一次备份。

Oracle9i 数据库管理基础 II 19-9


排除网络故障

• 使用操作系统实用程序(如 ping 和 telnet)测试网络连



• 使用 Oracle Net 实用程序(如 tnsping)测试服务连接

• 首先检查日志文件以诊断问题
• 使用跟踪文件以获得详细信息
• 谨慎地使用跟踪,并定期调整跟踪文件,因为这些文件
可能会迅速增大

Copyright © Oracle Corporation, 2001. All rights reserved.

网络专题讨论
本专题讨论引入了八种故障情况。每个脚本都在 Oracle 网络产品的其中一个配置文件中
引发一个错误。在教师引发配置中的错误后,请尝试使用网络进行连接,然后在继续运行
下一脚本之前排除并修正该问题。例如,要启动第一个故障情况,应运行下面的命令:
$ sqlplus system/manager@your_service_name
(应该会生成某些错误)
使用命令输出和日志文件来更正该错误。使用编辑器修正包含该错误的文件
(tnsnames.ora、sqlnet.ora 或 listener.ora)并尝试再次连接。
如果不能解决该问题,并希望继续练习下一个故障情况,可以使用以下三个脚本来还原原
始文件:FIX_CLIENT.sh(tnsnames.ora)、FIX_NAMING.sh(sqlnet.ora) 和
FIX_LISTENER.sh(listener.ora)。仅当您无法自行修复该问题时再运行与该问题
相关的 FIX 脚本,然后告诉教师希望继续练习下一个情况。

Oracle9i 数据库管理基础 II 19-10


启用跟踪

• Oracle Net Manager


• 编辑 sqlnet.ora 文件
TRACE_DIRECTORY_CLIENT = /u01/user01/NETWORK/LOG
NAMES.DEFAULT_DOMAIN = us.oracle.com
TRACE_UNIQUE_CLIENT = on
TRACE_FILE_CLIENT = client.trc
TRACE_LEVEL_CLIENT = SUPPORT
NAMES.DIRECTORY_PATH= (TNSNAMES)

Copyright © Oracle Corporation, 2001. All rights reserved.

跟踪
客户机跟踪受以下 sqlnet.ora 参数的控制:
TRACE_DIRECTORY_CLIENT:设置将用于写入跟踪文件的目录
TRACE_FILE_CLIENT:设置跟踪文件名
TRACE_UNIQUE_CLIENT:强制为每个连接创建一个新的跟踪文件
TRACE_LEVEL_CLIENT:控制跟踪输出量。值可以是 OFF、USER、ADMIN 和
SUPPORT,按从小到大顺序排列
要使用 Oracle Net Manager 配置对客户机的跟踪,请执行以下操作:
在目录树中单击 “配置文件” (Profile) 图标。从下拉菜单中选择 “常规” (General) 并单击
“跟踪” (Tracing) 选项卡。从位于 “客户机信息” (Client Information) 部分的菜单中选择跟踪
级别。在 “跟踪目录” (Trace Directory) 字段中输入有效的目录名,然后在 “跟踪文件”
(Trace File) 字段中输入文件名。如果您希望在每个新创建的跟踪文件后附加一个唯一标识
符,请选择 “唯一文件跟踪名称” (Unique File Trace Name) 复选框,然后保存您的配置。

Oracle9i 数据库管理基础 II 19-11


使用跟踪文件

跟踪文件会让您更好地了解以下内容:
• 网络节点之间的数据包流
• 哪一个 Oracle Net 组件发生故障

• 相关的错误代码

Copyright © Oracle Corporation, 2001. All rights reserved.

使用跟踪文件
通过评估跟踪文件,您可以更好地了解数据包流、组件故障和错误代码,这样会有助
于您诊断和排除网络问题。检查数据包数据和确定数据包类型的能力是一个无价的故
障排除工具。数据包类型代码如下所列:
1. 连接数据包
2. 接受数据包
3. 确认数据包
4. 拒绝数据包
5. 重定向数据包
6. 数据包
7. 空数据包、空数据
8. 中止数据包
9. 重新发送数据包
10. 标记数据包
11. 提示数据包
12. 控制信息数据包

Oracle9i 数据库管理基础 II 19-12


使用跟踪文件(续)
以下示例是一个实际跟踪文件的摘录:
1. nspsend: plen=287, type=1
2. ntpwr: entry
3. ntpwr: exit
4. nspsend: 287 bytes to transport
5. nspsend: packet dump
6. nspsend: 01 1F 00 00 01 00 00 00 |........|
7. ...
8. nspsend: 00 00 28 44 45 53 43 52 |..(DESCR|
9. nspsend: 49 50 54 49 4F 4E 3D 28 |IPTION=(|
10.nspsend: 41 44 44 52 45 53 53 3D |ADDRESS=|
11.vnspsend: 28 50 52 4F 54 4F 43 4F |(PROTOCO|
12.nspsend: 4C 3D 62 65 71 29 28 50 |L=beq)(P|
13.nspsend: 52 4F 47 52 41 4D 3D 2F |ROGRAM=/|
14.nspsend: 75 30 33 2F 6F 72 61 39 |u03/ora9|
15.nspsend: 69 2F 62 69 6E 2F 6F 72 |i/bin/or|
16.nspsend: 61 63 6C 65 29 28 41 52 |acle)(AR|
17.nspsend: 47 56 30 3D 6F 72 61 63 |GV0=orac|
18.nspsend: 6C 65 55 30 31 29 28 41 |leU01)(A|
19.nspsend: 52 47 53 3D 27 28 44 45 |RGS='(DE|
20.nspsend: 53 43 52 49 50 54 49 4F |SCRIPTIO|
21.nspsend: 4E 3D 28 4C 4F 43 41 4C |N=(LOCAL|
22.nspsend: 3D 59 45 53 29 28 41 44 |=YES)(AD|
23.nspsend: 44 52 45 53 53 3D 28 50 |DRESS=(P|
24.nspsend: 50 52 4F 47 52 41 4D 3D |PROGRAM=|
25.nspsend: 29 28 48 4F 53 54 3D 73 |)(HOST=s|
26.nspsend: 74 63 2D 73 75 6E 30 32 |tc-sun02|
27.nspsend: 2E 75 73 2E 6F 72 61 63 |.us.orac|
28.nspsend: 6C 65 2E 63 6F 6D 29 28 |le.com)(|
29.nspsend: 55 53 45 52 3D 75 73 65 |USER=use|
30.nspsend: 72 30 31 29 29 29 29 00 |r01)))).|
31.nspsend: normal exit

这是客户机为建立连接而向监听程序发送的第一个数据包。从第 1 行,我们可以看到这
是一个连接数据包(TYPE 1)。从剩下的输出中,我们可以看到发送至该监听程序的数
据包的长度、初始化设置和连接数据。尽管由于文件太大而无法完全显示,但是您可以
找到连接协商数据和重要的错误代码。此类信息对于排除很难的网络问题非常有价值。

Oracle9i 数据库管理基础 II 19-13


网络专题讨论
本专题讨论引入了八种故障情况。每个脚本都在 Oracle 网络产品的其中一个配置文件中引
发一个错误。在教师引发配置中的错误后,请尝试使用网络进行连接,然后在继续运行下
一脚本之前排除并修正该问题。例如,要启动第一个故障情况,应运行下面的命令:
$ sqlplus system/manager@your_service_name
(应该会生成某些错误)
使用命令输出和日志文件来更正该错误。使用编辑器修正包含该错误的文件
(tnsnames.ora、sqlnet.ora 或 listener.ora)并尝试再次连接。
如果不能解决该问题,并希望继续练习下一个故障情况,可以使用以下三个脚本来还原原
始文件:FIX_CLIENT.sh(tnsnames.ora)、FIX_NAMING.sh(sqlnet.ora)和
FIX_LISTENER.sh(listener.ora)。仅当您无法自行修复该问题时再运行与该问题
相关的 FIX 脚本,然后告诉教师希望继续练习下一个情况。

Oracle9i 数据库管理基础 II 19-14


小结

• 教师引导的专题讨论
• 面向学习小组
• 实践方法
• 模拟 “现实世界” 环境

• 使停机时间和数据损失减至最小
• 使用工具和诊断程序以确定故障类型

Copyright © Oracle Corporation, 2001. All rights reserved.

教师引导的专题讨论
教师将提供相应的指导和附加信息来引导专题讨论。
强调小组作用
着重强调与专题讨论中的其他同学进行团队合作,以便诊断并排除故障。成功应对每种情
况的能力取决于每个组积累的知识和解决问题的技能。
实践方法
这是一个旨在实践的专题讨论,它为您提供尽可能长的时间来练习 lab 情况。

Oracle9i 数据库管理基础 II 19-15


模拟现实世界环境
现实世界中的问题没有假设的 lab 问题那样容易解决。因此,本专题讨论提供了许多您不
了解的数据库故障,每个组必须使用所能用到的资源和工具来诊断问题和解决问题。每种
情况的主要目的是要执行及时的恢复,并且杜绝或尽量减少关机时间和数据丢失。
最少的关机时间和数据丢失
许多故障情况可能有多种还原和恢复数据库的方法。记住,在解决故障时,要尽量减少关
机时间和数据丢失,所以应选择最好的还原和恢复方法。
工具和诊断程序的使用
使用在本课程中讲解的各种工具和诊断程序可帮助您确定并解决某种类型的故障。

Oracle9i 数据库管理基础 II 19-16


练习 19
1. 关闭例程并通过 $HOME/DONTOUCH 目录中的备份还原数据库文件。
2. 启动例程,装载并打开数据库。
3. 使用 sysdba 用户身份连接,然后使用数据字典视图和 SQL*Plus 命令完成随后的
数据库配置核对清单。
4. 验证已镜像了控制文件。
5. 验证已对联机重做日志文件执行了多元备份。
6. 验证数据库处于 ARCHIVELOG 模式。
7. 运行 $HOME/STUDENT/LABS/emphist.sql 和
$HOME/STUDENT/LABS/moreemphist.sql 脚本。
8. 使用操作系统命令或 RMAN 在 $HOME/BACKUP 目录下执行整体数据库备份。
9. 删除任何不再需要的归档重做日志文件。
10. 备份要跟踪的控制文件。
11. 开始练习专题讨论中的故障情况之前,确保已启动例程且数据库已打开。

Oracle9i 数据库管理基础 II 19-17


练习 19 数据库配置核对清单
表空间和数据文件信息

表空间名称 数据文件名称(完整路径)

联机重做日志文件信息

组号 重做日志文件名称(完整路径) 大小 状态

控制文件信息

控制文件名称

Oracle9i 数据库管理基础 II 19-18


练习 19 数据库配置核对清单
初始化参数

参数名称 值
BACKGROUND_DUMP_DEST
CORE_DUMP_DEST
DB_FILES
DB_NAME
LOG_ARCHIVE_DEST_n
LOG_ARCHIVE_DEST_n
LOG_ARCHIVE_FORMAT
LOG_ARCHIVE_MIN_SUCCEED_DEST
LOG_ARCHIVE_START
USER_DUMP_DEST

Oracle Net 配置信息

TNS_ADMIN 变量值
监听程序名称
端口号
协议
listener.ora 文件的位置
服务名称
tnsnames.ora 文件的位置
sqlnet.ora 文件的位置
跟踪文件的位置
日志文件的位置

Oracle9i 数据库管理基础 II 19-19


Oracle9i 数据库管理基础 II 19-20
A

练习答案
练习 3 答案
1. 使用 Oracle Net Manager 创建监听程序 listenernn(nn 是教师为您分配的一个两位
数字编号)。必须按教师指定的步骤为服务器配置监听程序。必须将监听程序配置
为只用于 TCP/IP 协议,并且监听程序必须监听教师提供的端口上的传入连接。
注:如果学生 PC 上安装了 Oracle9i Oracle Net 软件,则使用 Oracle Net Manager 在
客户机 PC 上创建监听程序配置文件,然后在以后的步骤中,通过 FTP 或类似的文
件传输应用程序将该文件传输到服务器上。
对于本练习和后续网络练习,TNS_ADMIN 环境变量必须指向您的 UNIX 帐户所在
主机上的 $HOME/NETWORK/ADMIN 目录。
可以在 UNIX 提示符下执行以下命令以验证设置:
echo $TNS_ADMIN
或者可查看 .profile 文件(位于您的主目录中)并搜索以下条目:
TNS_ADMIN=$HOME/NETWORK/ADMIN
export TNS_ADMIN
如果这些条目不在该文件中,则编辑该文件并添加上述行。注销然后重新登录以使
更改生效。
如果您的 PC 上没有安装 Oracle9i 客户机软件,则必须编辑 listener.ora。在
$HOME/LABS 目录下可找到示例联网文件。示例文件的扩展名为 .sam。将
$HOME/STUDENT/LABS/listener.sam 复制为
$TNS_ADMIN/listener.ora,并使用 vi 编辑该文件。
$ cd $TNS_ADMIN
$ cp $HOME/STUDENT/LABS/listener.sam listener.ora
使用 Oracle Net Manager
a. 从 “开始” (Start) 菜单,选择 “程序” (Programs > Oracle - Oracle Home > “配置
和移植工具” (Configuration and Migration Tools) > Net Manager。
b. 展开 “Oracle 网络配置” (Oracle Net Configuration) 树中的 “本地” (Local) 文件
夹,然后单击 “监听程序” (Listeners) 文件夹。从 “编辑” (Edit) 菜单中选择 “创
建” (Create),或者单击 “+” 图标。
c. 在出现的 “选择监听程序名” (Choose Listener Name) 对话框中输入监听程序
(listenernn) 的名称,然后单击 “确定” (OK)。在左侧窗格的 Listeners 文件夹下
面将出现新监听程序的名称。
d. 如果尚未选定,请从屏幕右侧的下拉菜单中选择 “监听位置” (Listening
Locations)。
e. 单击 “添加地址” (Add Address) 按钮。此时,就会出现一个选项卡供您输入有
关监听程序地址的详细信息。
f. 选择 TCP 协议(如果尚未选定)。
g. 在 “主机” (Host) 字段中输入服务器的名称,并在 “端口” (Port) 字段中输入为
监听程序分配的端口号(端口号是由教师提供的)。
h. 从屏幕右侧的下拉菜单中选择 “数据库服务” (Database Services)。

Oracle9i 数据库管理基础 II A-2


练习 3 答案(续)
i. 单击 “添加数据库” (Add Database) 按钮。此时,将出现 “数据库服务” (Database
Services) 选项卡,您可通过该选项卡指定监听程序为其接收连接请求的数据库服
务。
j. 在 “全局数据库名称” (Global Database Name) 字段中,输入全局数据库的名称
(全局数据库名称是由教师提供的)。
k. 在 “Oracle 主目录” (Oracle Home Directory) 字段中,输入在服务器上定义为
$ORACLE_HOME 的目录。(在 UNIX 提示符下执行 env 命令以获取主目录,或
者输入 echo $ORACLE_HOME)。
l. 在 SID 字段中,输入数据库系统标识符 (Unn)。
m. 从屏幕右侧的下拉菜单中,选择 “常规参数” (General Parameters),然后选择 “事
件记录与跟踪” (Logging and Tracing) 选项卡。确保已启用了事件记录。
n. 从 “文件” (File) 菜单项中选择 “保存网络配置” (Save Network Configuration) 以保
存配置并退出 Oracle Net Manager。
手动配置
如果要手动编辑 listener.ora 文件,请按以下步骤操作。
a. 转到目录 $TNS_ADMIN,并将 $HOME/STUDENT/LABS/listener.sam 文件
复制为 $TNS_ADMIN/listener.ora(如果尚未执行此操作的话)。
$ cd $TNS_ADMIN
$ cp $HOME/STUDENT/LABS/listener.sam listener.ora
b. 使用 vi 编辑 listener.ora 文件并定义以下条目:
SID_LIST_LISTENERnn (其中,LISTENERnn 是监听程序
名称)
GLOBAL_DBNAME (例程名 + 域名)
ORACLE_HOME (应该与 $ORACLE_HOME 相同)
SID_NAME (例程名)
LISTENERnn (监听程序名)
PROTOCOL (应为 tcp)
HOST (主机名)
PORT (教师分配的端口)
LOG_DIRECTORY_LISTENERnn (YOUR_HOME_DIR/NETWORK/LOG)
LOG_FILE_ LISTENERnn (YOUR_LISTENER_NAME.log)

Oracle9i 数据库管理基础 II A-3


练习 3 答案(续)
例如:
SID_LIST_LISTENER01 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = U01.world)
(ORACLE_HOME = /u03/ora9i)
(SID_NAME = U01)
)
)
LISTENER01 =
DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02)(PORT = 1701))
)
LOG_DIRECTORY_LISTENER01 = /dbclass7/user01/NETWORK/LOG
LOG_FILE_LISTENER01 = listener01.log
2. 如果已在您的 PC 上创建了 listener.ora 文件,可使用 FTP(ASCII 模式)
将其传输到 UNIX 服务器上的 $TNS_ADMIN 目录中。在 PC 客户机上,该文件位
于 <ORACLE_HOME>\NETWORK\ADMIN 目录中。您需要编辑该文件以更改日志
目录的位置。
3. 验证文件中的配置详细信息。
a. $ cd $TNS_ADMIN
b. $ view listener.ora(也可以使用 more 或 pg)
4. 通过在操作系统提示符下执行 lsnrctl start listenernn 命令来启动监听
程序。如果遇到问题,可使用 lsnrctl 命令输出监听程序日志文件以排除故障。
$ lsnrctl start <listenernn>(替代监听程序名称)
5. 停止数据库例程然后重新启动。
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
6. 查看监听程序日志文件的内容。是否已注册了该例程?为什么没有注册?
$ more $HOME/NETWORK/LOG/listener<nn>.log
TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [*
SID] * RETURN CODE
23-APR-2001 21:28:15 *
CONNECT_DATA=(CID=(PROGRAM=)(HOST=stc-sun02) …
对于例程注册,必须正确定义初始化参数 SERVICE_NAMES 和 INSTANCE_NAME 如
果监听程序不是缺省监听程序,还必须定义 LOCAL_LISTENER。此参数尚未定义。

Oracle9i 数据库管理基础 II A-4


练习 4 答案
1. 使用 Oracle Net Manager 并配置客户机以使用本地命名方法。选择 TNSNAMES 作为
唯一 命名方法。如果不能确定客户机的名称,可向教师询问如何获取该名称。
使用 Oracle Net Manager
a. 如果 PC 上安装了 Oracle9i,请转到 “开始” (Start) 菜单,选择 “程序” (Programs) >
Oracle - Oracle Home > “配置和移植工具” (Configuration and Migration Tools) > Net
Manager。
b. 展开 “本地” (Local) 文件夹,然后选择 “Oracle 网络配置” (Oracle Net Configuration)
树中的 “配置文件” (Profile) 图标。从下拉菜单中选择 “命名” (Naming)。
c. 选择 “方法” (Methods) 选项卡,确保 “选定方法” (Selected Method) 中只包括
TNSNAMES。
d. 从 “文件” (File) 菜单中,选择 “保存网络配置” (Save Network Configuration)。
e. 从树中选择 “服务命名” (Service Naming),然后单击 “+” 以添加服务名称。
f. 输入网络服务的名称,然后单击 “下一步” (Next) 以继续操作。
g. 选择 TCP/IP 协议,然后单击 “下一步” (Next) 以继续操作。
h. 输入 UNIX 主机名和教师给您分配的端口。选择 “下一步” (Next) 以继续操作。
i. 输入服务名称,然后单击 “下一步” (Next) 以继续操作。
j. 测试服务。如果测试失败,则单击 “更改登录” (Change Login) 按钮以检查使用的登
录帐户。确保使用的帐户存在并重试。
k. 从 “文件” (File) 菜单中,选择 “保存网络配置” (Save Network Configuration)。
手动配置
如果 PC 客户机上没有安装 Oracle9i,可从 UNIX 主机手动配置并测试客户机连接。转到
$TNS_ADMIN 目录,并将 $HOME/STUDENT/LABS/sqlnet.sam 和
$HOME/STUDENT/LABS/tnsnames.sam 分别复制为 sqlnet.ora 和 tnsnames.ora。
使用 vi 手动编辑这两个文件。
a. 编辑 sqlnet.ora,并确保将 NAMES.DIRECTORY_PATH 设置为 TNSNAMES。
$ cd $TNS_ADMIN
$ cp $HOME/STUDENT/LABS/sqlnet.sam sqlnet.ora
$ cp $HOME/STUDENT/LABS/tnsnames.sam tnsnames.ora
$ vi sqlnet.ora
NAMES.DEFAULT_DOMAIN = world
NAMES.DIRECTORY_PATH= (TNSNAMES)

Oracle9i 数据库管理基础 II A-5


练习 4 答案(续)
b. 编辑 tnsnames.ora 并添加数据库的网络服务名称。
$ cd $TNS_ADMIN
$ vi tnsnames.ora
U01 = <例程名>
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02)(PORT = 1501))
) <协议必须是 TCP,主机名和分配的端口>
(CONNECT_DATA =
(SERVICE_NAME = U01.world) <SID+DOMAIN 或 GLOBAL_DBNAME>
)
)
2. 查看通过 Oracle Net Manager 创建的 sqlnet.ora 和 tnsnames.ora 文件的内容。
您所提供的信息在这些文件中是如何记录的?
在 PC 客户机上,该文件位于 <ORACLE_HOME>\NETWORK\ADMIN 目录中。
3. 如果已手动编辑了这些文件,可使用 tnsping 测试能否连接到该服务。
$ tnsping U01
Used parameter files:
/u01/user01/NETWORK/ADMIN/sqlnet.ora
/u01/user01/NETWORK/ADMIN/tnsnames.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact(ADDRESS=(PROTOCOL=TCP)(HOST=stc-
sun02)(PORT=1501))
OK (10 msec)
4. 使用 SQL*Plus 并以 system/manager 的身份连接到服务器,通过查询 V$INSTANCE
视图验证是否已与正确的例程建立连接。
$ sqlplus system/manager
SQL*Plus:Release 9.0.0.0.0 - Beta on Tue Mar 27 22:32:46
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.0.0.0.0 – Beta
With the Partitioning option
JServer Release 9.0.0.0.0 - Beta
SQL> select instance_name from v$instance;
INSTANCE_NAME
-------------
U01

Oracle9i 数据库管理基础 II A-6


练习 5 答案
1. 启动一个连接到您的数据库所在服务器的 Telnet 会话。为您的数据库配置并启动
Oracle Shared Server,以便使一个调度程序监听 TCP/IP 连接,一个共享服务器为请求
提供服务。将调度程序和共享服务器的最大数目分别指定为 2 和 6。
注:因为使用的监听程序不在缺省端口 1521 上进行监听,所以,必须在初始化参数
文件中定义 local_listener 参数,同时必须在 tnsnames.ora 文件中包含监听
程序别名和地址。如果未正确定义此参数,则无法启动该例程,这是因为调度程序进
程不知道如何向监听程序进行注册。
a. 关闭您的例程,并将以下参数添加到初始化参数文件中。
local_listener=your_listener_name
dispatchers = "(PROTOCOL=TCP)(DISPATCHERS=1)”
shared_servers=1
max_dispatchers=2
max_shared_servers=6
b. 将以下行添加到 tnsnames.ora 文件中:
your_listener_name.world =
(description =
(ADDRESS=(PROTOCOL=tcp)(HOST=your_host.world)
(PORT = <your port number>)))
c. 重新启动您的例程
2. 要验证调度程序是否与监听程序关联,请使用 lsnrctl 实用程序。
执行以下命令:lsnrctl services your_listener_name
$ lsnrctl services listener01
LSNRCTL for Solaris: Version 9.0.0.0.0
Copyright (c) 1991, 2001, Oracle Corporation.
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stc-sun02)
Services Summary...
Service "u01.world" has 1 instance(s)
...
"D000" established:0 refused:0 current:0 max:992 state:ready
DISPATCHER <machine: stc-sun02.us.oracle.com, pid: 14277>
(ADDRESS=(PROTOCOL=tcp)(HOST=stc-sun02)(PORT=35204))
The command completed successfully

Oracle9i 数据库管理基础 II A-7


练习 5 答案(续)
3. 进行网络连接前,应在 telnet 会话中调用 SQL*Plus 并以 system/manager 的身份进
行连接。查询 V$CIRCUIT 以查看它是否包含任何行。对于当前正在使用共享服务
器的每个连接,该视图都有一个条目与之对应。
$ sqlplus system/manager
SQL> select circuit, dispatcher, server from v$circuit;
no rows selected
4. 使用 PC 客户机上的 SQL*Plus 并以 system/manager 的身份进行连接,然后再
次查询 V$CIRCUIT。验证连接之后,退出 SQL*Plus。
注:如果在练习 4 中手动配置了 tnsnames.ora 文件,则需要在客户机 PC 上的
tnsnames.ora 文件中添加一个条目。
SQL> select circuit, dispatcher, server from v$circuit;
CIRCUIT DISPATCH SERVER
-------- -------- --------
80DE1B50 8108FDA8 8108F728
5. 从您的 telnet 会话查询 V$SHARED_SERVER 视图,以查看已启动的共享服务器的
数目。
SQL> select name, status, circuit from v$shared_server;
NAME STATUS CIRCUIT
---- ---------------- --------
S000 EXEC 80DE1B50
6. 从您的 telnet 会话查询 V$DISPATCHER 视图,以查看已启动的调度程序的数目。
SQL> select name, status from v$dispatcher;
NAME STATUS
---- ----------------
D000 WAIT
7. 在您的 PC 客户机上使用 SQL*Plus、以 system/manager 身份并使用共享服务器进行
两次连接。共享服务器的数目是否有所增加?如果是,为什么?如果不是,为什
么?
SQL> select name, status, circuit from v$shared_server;
NAME STATUS CIRCUIT
---- ---------------- --------
S000 EXEC 80DE1B50
另一个共享服务器尚未启动。并不认为该共享服务器处于过载状态,而是远少于操
作系统决定的最大连接数。

Oracle9i 数据库管理基础 II A-8


练习 5 答案(续)
8. 再添加一个调度程序以处理 TCP 请求,并验证是否已添加了这个附加的调度程序。
a. 关闭您的例程,并在初始化参数文件中将 “dispatchers” 的值从 1 更改为 2:
$ vi $HOME/ADMIN/PFILE/init<SID>.ora
dispatchers = "(PROTOCOL=TCP)(DISPATCHERS=2)
b. 重新启动该例程,并使用 lsnrctl 命令检查服务:
$ lsnrctl services listener<nn>
LSNRCTL for Solaris: Version 9.0.0.0.0
Copyright (c) 1991, 2001, Oracle Corporation.
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stc-sun02)
Services Summary...
Service “U01.us.oracle.com" has 1 instance(s).
...
"D000" established:0 refused:0 current:0 max:992 state:ready
DISPATCHER <machine: stc-sun02.us.oracle.com, pid: 14277>
(ADDRESS=(PROTOCOL=tcp)(HOST=stc-sun02)(PORT=35204))
"D001" established:0 refused:0 current:0 max:992 state:ready
DISPATCHER <machine: stc-sun02, pid: 14596>
(ADDRESS=(PROTOCOL=tcp)(HOST=stc-sun02)(PORT=35310))
The command completed successfully

Oracle9i 数据库管理基础 II A-9


练习 7 答案
1. 查询所使用的 V$ 视图,以查找数据库中所有数据文件的名称。
SQL> SELECT name FROM v$datafile;
NAME
--------------------------------------------
/databases/db01/ORADATA/u01/system01.dbf
/databases/db01/ORADATA/u02/undotbs.dbf
/databases/db01/ORADATA/u03/users01.dbf
/databases/db01/ORADATA/u03/indx01.dbf
/databases/db01/ORADATA/u02/sample01.dbf
/databases/db01/ORADATA/u01/querydata01.dbf
2. 查询所使用的 V$ 视图,以查找数据库中的当前联机重做日志组和所有重做日志
文件的名称。
SQL> SELECT group#, status FROM v$log;
GROUP# STATUS
------ ----------------
1 CURRENT
2 INACTIVE
SQL> SELECT member FROM v$logfile;
MEMBER
------------------------------------
/databases/db01/ORADATA/u03/log01a.rdo
/databases/db01/ORADATA/u03/log02a.rdo
3. 查询所使用的 V$ 视图,以查找数据库中所有控制文件的名称。
SQL> SELECT name FROM v$controlfile;
NAME
--------------------------------------
/databases/db01/ORADATA/u01/ctrl01.ctl
4. 在删除表或关闭数据库之前,查询所使用的 V$ 视图以查找数据库的名称。
SQL> SELECT name FROM v$database;
NAME
---------
DB01

Oracle9i 数据库管理基础 II A-10


练习 7 答案(续)
5. 在关闭数据库之前,查询所使用的 V$ 视图以找出仍连接到例程的进程。
SQL> SELECT pid, username FROM v$process;
PID USERNAME
--- ---------------
1
2 db01
3 db01
4 db01
5 db01
6 db01
7 db01
8 db01
8 rows selected.
6. 哪一个初始化参数可以在 SGA 中配置一块内存区域,在将恢复信息写入磁盘之前可以
当作这些信息的缓冲区?
LOG_BUFFER
7. 什么是大型共享池?何时使用?哪个初始化参数用于对其进行配置?
大型共享池是 SGA 的一段区域,当需要 IO 从属时可用于为恢复管理器缓存内存中的
信息。使用 RMAN 时,这将增加备份和恢复的速度以及效率。
LARGE_POOL_SIZE 参数指定从 SGA 分配的字节数。
8. 描述 FAST_START_MTTR_TARGET 参数在例程恢复中的重要性。
完成恢复前滚阶段的目标(限定)时间是使用 FAST_START_MTTR_TARGET 参数指
定的,Oracle 根据该目标自动改变检查点写入。
9. 在准备使用 Oracle Enterprise Manager 时,执行目标发现并设置您的 “首选身份证明”
(Preferred Credentials)。
仅用于 Oracle Classroom
如果正在使用 Oracle Classroom,则必须执行以下四个专用于设置 Oracle Classroom 的
步骤:
a. 单击桌面上的 omsconfig 文件更新图标,输入您的班级使用的 Unix 服务器的名称。
教师将为您提供该服务器名称。请注意,此名称是区分大小写的。
b. 打开一个 MSDOS 窗口。
c. 在命令提示符下输入:oemctl start oms
等待出现以下消息:“Oracleoracle901_homeManagementServer 服务已成功启动。”
d. 关闭 MSDOS 窗口。

Oracle9i 数据库管理基础 II A-11


练习 7 答案(续)
启动 Oracle Enterprise Manager 控制台,将 “管理员” (Administrator) 设置为
sysman 并将口令设置为 oem_temp。出现提示后,将口令更改为 oracle。
从 “导航” (Navigator) 中选择 “发现节点” (Discover Nodes),然后输入正在使用
的数据库所在的服务器主机名。
a. 从 “开始” (Start) 菜单选择 Æ “程序” (Programs) Æ Oracle – OracleHome Æ
“Enterprise Manager 控制台” (Enterprise Manager Console)
b. 确保选择了 “登录到 Oracle Management Server” (Login to the Oracle
Management Server)。
c. “管理员” (Administrator):sysman
d. “口令” (Password):oem_temp
e. Management Server 是您的计算机
f. 当提示更改 sysman 口令时,将它更改为 oracle
g. 从控制台菜单中选择 “导航器” (Navigator) —> “发现节点” (Discover Nodes)
或者单击鼠标右键,从弹出的菜单中选择 “发现节点” (Discover Nodes),以
打开 “发现节点” (Discover Nodes) 对话框。
h. 从 “发现向导:简介” (Discovery Wizard: Introduction) 屏幕,单击 “下一步”
(Next),输入 UNIX 数据库服务器的名称,然后单击 “下一步” (Next)。
i. 单击 “下一步” (Next),您将具有访问数据库的一般管理员权限。
j. 单击 “完成” (Finish),然后单击 “确定” (OK)。如果发现操作未成功,请向
教师报告。

设置数据库和服务器(节点)的 “首选身份证明” (Preferred Credentials),以便在 “首


选身份证明” (Preferred Credentials) 页上运行作业。选择您的数据库并提供用户名
sys 和口令 change_on_install 或者由教师提供的名称及口令。在列表中滚动到
该节点处。突出显示数据库服务器节点,并输入您在服务器上的帐户的用户名和口
令。
a. 从主菜单中导航到:“配置” (Configuration) > “首选项” (Preferences)。
b. 选择 “首选身份证明” (Preferred Credentials) 页。
c. 滚动到窗口底部,并选择与您的数据库相对应的条目。
d. 提供下列信息:
“用户名” (Username):sys 或教师提供的名称
“口令” (Password):change_on_install 或教师提供的口令
“确认口令” (Confirm Password):
“角色” (Role):SYSDBA
e. 单击 “确定” (OK)。
f. 选择您的节点(服务器)。
g. 提供您的服务器登录用户名和口令。
h. 单击 “确定” (OK)。

Oracle9i 数据库管理基础 II A-12


练习 7 答案(续)
10. 设置控制文件的镜像以便有两个控制文件。将第二个控制文件放在
$HOME/ORADATA/u02 目录中。
若要添加新的控制文件或更改控制文件的号码或位置,请遵循以下步骤:
a. 关闭数据库:
SQL> SHUTDOWN IMMEDIATE;
b. 使用以下操作系统命令将现有的控制文件复制到另一个设备上:
$cp -p $HOME/ORADATA/u01/ctrl01.ctl
$HOME/ORADATA/u02/ctrl02.ctl
$chmod g+wx $HOME/ORADATA/u02/ctrl02.ctl
c. 编辑或添加 CONTROL_FILES 参数,并为所有控制文件指定名称:
$vi $HOME/ADMIN/PFILE/init<sid>.ora
control_files=$HOME/ORADATA/u01/ctrl01.ctl,
$HOME/ORADATA/u02/ctrl02.ctl
d. 启动例程并打开数据库:
SQL> STARTUP PFILE=$HOME/ADMIN/PFILE/init<sid>.ora
SQL> show parameter control_files
NAME TYPE VALUE
------------------ ------ -------------------------------
control_files string $HOME/ORADATA/u01/ctrl01.ctl,
$HOME/ORADATA/u02/ctrl02.ctl
11. 设置联机重做日志文件的镜像以便每组有两个成员。将每组的第二个成员放在
$HOME/ORADATA/u04 目录中。
使用 SQL 命令解答
SQL> alter database add logfile member
2 '$HOME/ORADATA/u04/log01b.rdo' to group 1,
3 '$HOME/ORADATA/u04/log02b.rdo' to group 2;
Database altered.
使用 Oracle Enterprise Manager 解答
a. 在 “导航器” (Navigator) 树中选择您的节点和数据库。
b. 选择 “存储” (Storage) > “重做日志组” (Redo Log Groups)。
c. 展开 “重做日志组” (Redo Log Groups) 以查看每个组。
d. 依次单击每个日志组。通过在展开的表中键入每个新成员的文件名和目录来添
加重做日志成员。

Oracle9i 数据库管理基础 II A-13


练习 7 答案(续)
12. 查询 V$LOGFILE 以确认是否添加了新成员。
SQL> select member from v$logfile;
MEMBER
--------------------------------------
/databases/ed21/ORADATA/u03/log01a.rdo
/databases/ed21/ORADATA/u03/log02a.rdo
/databases/ed21/ORADATA/u04/log01b.rdo
/databases/ed21/ORADATA/u04/log02b.rdo

Oracle9i 数据库管理基础 II A-14


练习 8 答案
1. 对初始化参数进行如下更改:
– 启用归档
– 将日志文件归档到两个目标位置:$HOME/ORADATA/ARCHIVE1 和
$HOME/ORADATA/ARCHIVE2 目录。$HOME/ORADATA/ARCHIVE1 是强制的,
$HOME/ORADATA/ARCHIVE2 是可选的。
– 使用 arch_%s.arc 归档格式
– 在例程开始处衍生两个归档进程
init.ora file
...
log_archive_start=true
log_archive_dest_1=“LOCATION=$HOME/ORADATA/ARCHIVE1/ MANDATORY”
log_archive_dest_2=“LOCATION=$HOME/ORADATA/ARCHIVE2/ OPTIONAL”
log_archive_format = arch_%s.arc
log_archive_max_processes = 2
2. 调用 SQL*Plus,以 sysdba 的身份进行连接并使用 Immediate 选项关闭例程。
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown immediate
3. 以 MOUNT 模式启动数据库。
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
ORACLE instance started.

Oracle9i 数据库管理基础 II A-15


练习 8 答案(续)
4. 列出 LOG_ARCHIVE_DEST、LOG_ARCHIVE_START 和 LOG_ARCHIVE_FORMAT
参数,并记下它们的值。
SQL> show parameter log_archive
NAME TYPE VALUE
log_archive_dest string
log_archive_dest_1 string
LOCATION=$HOME/ORADATA/
ARCHIVE1/MANDATORY
log_archive_dest_10 string
log_archive_dest_2 LOCATION=$HOME/ORADATA/
ARCHIVE2/OPTIONAL

log_archive_dest_9 string
log_archive_dest_state_1 string enable
log_archive_dest_state_10 string enable

log_archive_dest_state_9 string enable
log_archive_duplex_dest string
log_archive_format string arch_%s.arc
log_archive_max_processes integer 2
log_archive_min_succeed_dest integer 1
log_archive_start boolean TRUE
log_archive_trace integer 0
5. 执行 ARCHIVE LOG LIST 命令。注意数据库的日志模式以及是否启用了自动归
档。
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Enabled
Archive destination /databases/db01/ORADATA/ARCHIVE2/
Oldest online log sequence 62
Current log sequence 63

Oracle9i 数据库管理基础 II A-16


练习 8 答案(续)
6. 将数据库设置为 ARCHIVELOG 模式。
使用 SQL 命令解答
SQL> alter database archivelog;
Database altered.
使用 Oracle Enterprise Manager 解答
a. 在 “导航器” (Navigator) 树中选择您的节点和数据库。
b. 展开 “例程管理” (Instance Management),并选择 “配置属性工作表”
(Configuration Property Sheet)。
c. 选择 “恢复” (Recovery) 页,并选中 “归档日志模式” (Archive Log Mode)。单击
“应用” (Apply) 按钮。
d. 在 “关闭选项” (Shutdown Options) 屏幕上单击 “确定” (OK)。
e. 在 “配置” (Configuration) 对话框中单击 “关闭” (Close)。
7. 打开数据库。
使用 SQL 命令解答
SQL> alter database open;
Database altered.
使用 Oracle Enterprise Manager 解答
a. 在 “导航器” (Navigator) 树中选择您的节点和数据库。
b. 展开 “例程管理” (Instance Management),并选择 “配置属性工作表”
(Configuration Property Sheet)。
c. 选择 “常规” (General) 页,然后选择 “打开” (Open)。单击 “应用” (Apply) 按钮。
d. 单击对话框中的 “确定” (OK)。

Oracle9i 数据库管理基础 II A-17


练习 8 答案(续)
8. 执行 ARCHIVE LOG LIST 命令。检查两个归档进程是否正在运行。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /databases/db01/ORADATA/ARCHIVE2
Oldest online log sequence 62
Next log sequence to archive 63
Current log sequence 63
在操作系统提示符下输入以下命令:
$ ps -ef|grep arc
oracle 29296 1 0 03:19:51 ? 0:00 ora_arc0_db01
oracle 29298 1 0 03:19:51 ? 0:00 ora_arc1_db01
9. 将 ALTER SYSTEM SWITCH LOGFILE 命令执行两次,然后显示 ARCHIVE 参数的
值。看到归档日志文件了吗?文件名的格式是什么?
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> column name format A25
SQL> column value format A35
SQL> select name, value
2 from v$parameter
3 where name like 'log_archive_dest%';
NAME VALUE
------------------------ -------------------------------
log_archive_start TRUE
log_archive_dest
log_archive_duplex_dest
log_archive_dest_1 LOCATION=$HOME/ORADATA/ARCHIVE1/
MANDATORY
log_archive_dest_2 LOCATION=$HOME/ORADATA/ARCHIVE2/
OPTIONAL

log_archive_dest_10
log_archive_dest_state_1 enable
log_archive_dest_state_2 enable

Oracle9i 数据库管理基础 II A-18


练习 8 答案(续)
log_archive_dest_state_10 enable
log_archive_max_processes 2
log_archive_min_succeed_dest 1
log_archive_trace 0
log_archive_format arch_%s.arc
SQL> !ls -l $HOME/ORADATA/ARCHIVE1 $HOME/ORADATA/ARCHIVE2
/databases/db01/ORADATA/ARCHIVE1/:
total 150
-rw-rw---- 1 oracle dba 77824 Mar 23 03:28 arch_63.arc
-rw-rw---- 1 oracle dba 1024 Mar 23 03:28 arch_64.arc
/databases/db01/ORADATA/ARCHIVE2/:
total 150
-rw-rw---- 1 oracle dba 77824 Mar 23 03:28 arch_63.arc
-rw-rw---- 1 oracle dba 1024 Mar 23 03:28 arch_64.arc

10. 执行 ALTER SYSTEM ARCHIVE LOG STOP 命令,停止自动归档。


使用 SQL 命令解答
SQL> alter system archive log stop;
System altered.
使用 Oracle Enterprise Manager 解答
a. 在 “导航器” (Navigator) 树中选择您的节点和数据库。
b. 展开 “例程管理” (Instance Management),并选择 “配置属性工作表”
(Configuration Property Sheet)。
c. 选择 “恢复” (Recovery) 页,并取消选中 “自动归档” (Automatic Archival)。
单击 “应用” (Apply) 按钮。
d. 单击对话框中的 “确定” (OK)。

Oracle9i 数据库管理基础 II A-19


练习 8 答案(续)
11.多次执行 ALTER SYSTEM SWITCH LOGFILE 命令以循环使用所有联机重做日志组。
发生什么现象?为什么?
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
该数据库处于 ARCHIVELOG 模式。自动归档被禁用,下一个重做日志文件由于未
被归档而无法使用。
12. 建立第二个 telnet 会话并调用 SQL*Plus。以 sysdba 的身份连接。
13. 使用 ALTER SYSTEM ARCHIVE LOG START 命令启用自动归档。
使用 SQL 命令解答
SQL> alter system archive log start;
System altered.
使用 Oracle Enterprise Manager 解答
a. 在 “导航器” (Navigator) 树中选择您的节点和数据库。
b. 展开 “例程管理” (Instance Management),并选择 “配置属性工作表”
(Configuration Property Sheet)。
c. 选择 “恢复” (Recovery) 页,并选中 “自动归档” (Automatic Archival)。单击 “应
用” (Apply) 按钮。
d. 单击对话框中的 “确定” (OK)。
14. 返回到第一个会话。发生什么现象?为什么?此时,会出现后随 SQL 提示符的
“System Altered” 消息。归档程序进程已重新启动。由于在重新启动自动归档时
已归档了重做日志文件,因此,现在可以使用日志切换。

Oracle9i 数据库管理基础 II A-20


练习 9 答案
1. 列出使用 RMAN 而不使用用户管理的备份和恢复过程的部分优点。
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
2. 描述 RMAN 使用目标数据库的控制文件的一些方式。
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
3. 在缺省的 NOCATALOG 模式下连接到您的目标数据库。
$rman
Recovery Manager: Release 9.0.1.0.0 – Production
(c) Copyright 2001 Oracle Corporation. All rights reserved.
RMAN> connect target
connected to target database: DB01 (DBID=1125003950)
4. 使用 RMAN REPORT 命令生成数据库结构的列表。
RMAN> report schema;
using target database controlfile instead of recovery catalog
Report of database schema
Fi K-bytes Tablespace Datafile Name
-- ------- ---------- ----------------------------------------
1 128000 SYSTEM /databases/db01/ORADATA/u01/system.dbf
2 30720 UNDOTBS /databases/db01/ORADATA/u02/undotbs.dbf
3 5120 USERS /databases/db01/ORADATA/u03/users01.dbf
4 5120 INDX /databases/db01/ORADATA/u03/indx01.dbf
5 81920 SAMPLE /databases/db01/ORADATA/u02/sample01.dbf
6 1024 QUERYDATA /databases/db01/ORADATA/u01/querydata01.dbf

注:输出中还有一个名为 RB segs 的列,它出现在 Tablespace 和 Datafile Name 之间。为使格


式紧凑整齐,在以上输出示例中删除了这一列。

Oracle9i 数据库管理基础 II A-21


练习 9 答案(续)
5. 使用 RMAN SHOW 命令生成 RMAN 配置设置的列表。
RMAN> show all;
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
# default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
# default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO
'/databases/oracle9i/dbs/snapcf_db01.f';
6. 使用 RMAN CONFIGURE 命令将备份保留策略设置成恢复期为 14 天。
RMAN> configure retention policy to recovery
2> window of 14 days;
new RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
new RMAN configuration parameters are successfully stored
7. 验证备份保留策略的设置。
RMAN> SHOW RETENTION POLICY;
RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
8. 将备份保留策略重新设置为缺省值。
RMAN> CONFIGURE RETENTION POLICY CLEAR;
old RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
RMAN configuration parameters are successfully reset to default
value

Oracle9i 数据库管理基础 II A-22


练习 10 答案
1. 数据库打开后,以 sys 或 system 的身份连接到数据库,并使用 V$ 和数据字典视
图,列出进行整体脱机数据库备份时必须备份的全部文件。
注:为方便 NOARCHIVELOG 模式下的还原/恢复,应复制重做日志。
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------
/databases/db01/ORADATA/u01/ctrl01.ctl
/databases/db01/ORADATA/u02/ctrl02.ctl

SQL> select member from v$logfile;


MEMBER
--------------------------------------------------------
/databases/db01/ORADATA/u03/log01a.rdo
/databases/db01/ORADATA/u03/log02a.rdo
/databases/db01/ORADATA/u04/log01b.rdo
/databases/db01/ORADATA/u04/log02b.rdo

SQL> select name from v$datafile;


NAME
--------------------------------------------------------
/databases/db01/ORADATA/u01/system01.dbf
/databases/db01/ORADATA/u02/undotbs.dbf
/databases/db01/ORADATA/u03/users01.dbf
/databases/db01/ORADATA/u03/indx01.dbf
/databases/db01/ORADATA/u02/sample01.dbf
/databases/db01/ORADATA/u01/querydata01.dbf

Oracle9i 数据库管理基础 II A-23


练习 10 答案(续)
2. 使用 IMMEDIATE 选项关闭数据库。使用操作系统命令在 $HOME/DONTTOUCH 目录
中进行整体脱机数据库备份。
SQL> shutdown immediate
SQL> !cp -rp $HOME/ORADATA/u* $HOME/DONTTOUCH
SQL> !cp $ORACLE_HOME/dbs/orapw<sid> $HOME/DONTTOUCH
注:不要在 DONTTOUCH 目录中放置文件或删除该目录中的文件。在专题讨论中会
用到此副本。
3. 启动例程,装载并打开数据库。
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
4. 以 system/manager 的身份进行连接,并对 SAMPLE 表空间执行打开的数据库的
完全备份。将该文件复制到 $HOME/BACKUP/UMAN 目录中。确保没有覆盖另一个副
本。
SQL> connect system/manager
SQL> ALTER TABLESPACE sample BEGIN BACKUP;
SQL> !cp $HOME/ORADATA/u02/sample01.dbf
$HOME/BACKUP/UMAN/sample01.dbf
SQL> ALTER TABLESPACE sample END BACKUP;
5. 使用 ALTER DATABASE 命令备份要跟踪的控制文件。执行
$HOME/STUDENT/LABS/lab10_05.sql 脚本以识别该跟踪文件。退出到操作系
统并将跟踪文件复制到 $HOME/BACKUP/UMAN/cntrl.sql。使用编辑器,将跟踪
文件中的注释删除。
SQL> alter database backup controlfile to trace;
SQL> @$HOME/STUDENT/LABS/spid.sql
USERNAME SPID
------------------------------ ---------
SYSTEM <process ID>
SQL> exit
$ cd $HOME/ADMIN/UDUMP
$ cp <sid>_ora_<process ID>.trc $HOME/BACKUP/UMAN/cntrl.trc
$ vi $HOME/BACKUP/UMAN/cntrl.trc
Remove all comments from the trace file.
6. 创建控制文件的二进制副本,并将其放到 $HOME/BACKUP/UMAN 目录下。将备份副
本命名为 cntrl1.bkp。
SQL> alter database backup controlfile to
2> ‘$HOME/BACKUP/UMAN/cntrl1.bkp‘;

Oracle9i 数据库管理基础 II A-24


练习 11 答案
1. 恢复管理器两个被支持的备份类型是什么?列举出两个备份类型之间的一些不同点。
恢复管理器支持的两种备份类型为备份集和映像副本。
备份集是一个或多个数据库文件的备份,而映像副本仅包含一个数据文件的备份。
映像副本只能制作到磁盘上,而备份集可制作到磁盘或磁带上。
映像副本包含输入文件的所有块(甚至包括数据文件中未使用的块),而备份集可能
仅包含使用过的块。
映像副本在文件级别上对单个文件上进行操作,而备份集对文件及其逻辑组(如表空
间、数据库)进行操作。
2. 使用 RMAN 来备份属于 SAMPLE 和 USERS 表空间的数据文件。确保还制作了当前控
制文件的副本。应该将备份放在 $HOME/BACKUP/RMAN 目录中,并使用文件名格式
df_%d_%s_%p.bus。
使用 RMAN 命令行解答
RMAN> CONNECT TARGET
connected to target database: ED21 (DBID=1140378486)
RMAN> BACKUP TABLESPACE sample INCLUDE CURRENT CONTROLFILE FORMAT
‘$HOME/BACKUP/RMAN/df_%d_%s_%p.bus‘;
Starting backup at 21-MAR-01 using target database controlfile
instead of recovery catalog allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=12 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00006
name=/databases/db01/ORADATA/u02/sample01.dbf
including current controlfile in backupset
channel ORA_DISK_1: starting piece 1 at 21-MAR-01
channel ORA_DISK_1: finished piece 1 at 21-MAR-01
piece handle=/databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 21-MAR-01

Oracle9i 数据库管理基础 II A-25


练习 11 答案(续)
2. 使用 Oracle Enterprise Manager 解答
必须先使用 “创建备份配置向导” (Create Backup Configuration Wizard) 创建一个
“备份配置” (Backup Configuration):
a. 选择目标数据库。
b. “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “创建备份配置” (Create Backup Configuration)
c. 在 “常规” (General) 选项卡上提供名称。
d. 选择 “备份集” (Backup Set) 和 “磁盘” (Disk)。
e. 提供通道名称和格式
<path>/BACKUP/RMAN/df_%d_%s_%p.bus
f. 单击 “创建” (Create)。
现在可以使用 “备份向导” (Backup Wizard) 创建备份:
a. “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “备份” (Backup)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “策略选择” (Strategy Choice) 页:选择 “自定义备份策略” (Customize Backup
Strategy)。单击 “下一步” (Next)。
d. “备份选择” (Backup Selection) 页:选择 “表空间” (Tablespaces)。单击 “下一
步” (Next)。
e. “表空间” (Tablespaces) 页:选择所需的表空间。选中 “包括控制文件” (Include
Control File)。单击 “下一步” (Next)。
f. “已归档的日志” (Archived Logs) 页:选择 “否” (No)。单击 “下一步” (Next)。
g. “备份选项” (Backup Options) 页:选择 “完全” (Full)。单击 “下一步” (Next)。
h. “配置” (Configuration) 页:选择您的配置。单击 “下一步” (Next)。
i. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
j. “作业信息” (Job Information) 页:单击 “完成” (Finish)。
k. “概要” (Summary) 页:单击 “确定” (OK)。此时,将把作业提交到 Oracle
Enterprise Manager 作业系统中。

Oracle9i 数据库管理基础 II A-26


练习 11 答案(续)
3. 创建属于 SYSTEM 表空间的数据文件的映像副本。应将该副本以 sys0101.cpy 的名
称存放在 $HOME/BACKUP/RMAN 目录中。标记应为 SYSTEM01。
使用 RMAN 命令行解答
RMAN> COPY DATAFILE ‘$HOME/ORADATA/u01/system01.dbf’
TO ‘$HOME/BACKUP/RMAN/sys0101.cpy’
TAG ‘SYSTEM01’;
Starting copy at 21-MAR-01 using target database controlfile instead
of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
channel ORA_DISK_1: copied datafile 1
output filename=/databases/db01/BACKUP/RMAN/sys0101.cpy recid=1
stamp=424947138
Finished copy at 21-MAR-01
使用 Oracle Enterprise Manager 解答
必须先使用 “创建备份配置向导” (Create Backup Configuration Wizard) 创建一个 “备份配
置” (Backup Configuration):
a. 在 “导航器” (Navigator) 中连接到您的数据库。
b. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “创建备份配置” (Create Backup Configuration)
c. 在 “常规” (General) 选项卡上输入名称。
d. 在 “通道” (Channels) 选项卡上,选择 “映像副本” (Image Copy) 和 “磁盘” (Disk)。
现在可以使用 “备份向导” (Backup Wizard) 创建备份:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “备份” (Backup)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “策略选择” (Strategy Choice) 页:选择 “自定义备份策略” (Customize Backup
Strategy)。单击 “下一步” (Next)。
d. “备份选择” (Backup Selection) 页:选择 “数据文件” (Datafiles)。选中 “使用映像
副本” (Use an Image Copy)。单击 “下一步” (Next)。
e. “配置” (Configuration) 页:确认您的配置。单击 “下一步” (Next)。
f. “数据文件” (Datafile) 页:选择数据文件。取消选中 “包括控制文件” (Include
Control File)。单击 “下一步” (Next)。
g. “位置” (Location):确认位置。单击 “下一步” (Next)。
h. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
i. “作业信息” (Job Information) 页:单击 “完成” (Finish)。
j. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。

Oracle9i 数据库管理基础 II A-27


练习 11 答案(续)
4. 使用 RMAN,将当天生成的归档日志备份到 $HOME/BACKUP/RMAN 目录中。
使用 RMAN 命令行解答
RMAN> BACKUP ARCHIVELOG FROM TIME ‘SYSDATE-1’;
Starting backup at 21-MAR-01
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=1 sequence=33 recid=5 stamp=424878058
...
input archive log thread=1 sequence=43 recid=25 stamp=424948086
channel ORA_DISK_1: starting piece 1 at 21-MAR-01
channel ORA_DISK_1: finished piece 1 at 21-MAR-01
piece handle=/databases/oracle9i/dbs/02cl8cbn_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 21-MAR-01
使用 Oracle Enterprise Manager 解答
使用 “备份向导” (Backup Wizard) 创建备份:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “备份” (Backup)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “策略选择” (Strategy Choice) 页:选择 “自定义备份策略” (Customize Backup
Strategy)。单击 “下一步” (Next)。
d. “备份选择” (Backup Selection) 页:选择 “归档日志” (Archivelogs)。单击 “下一
步” (Next)。
e. “已归档的日志” (Archived Logs) 页:选择 “选定的归档日志” (Selected
Archivelogs)。指定所需的 “开始/截止” (From/To) 时间。取消选择 “删除的归
档日志” (Deleted Archived Logs)。单击 “下一步” (Next)。
f. “配置” (Configuration) 页:选择您的配置。单击 “下一步” (Next)。
g. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
j. “作业信息” (Job Information) 页:单击 “完成” (Finish)。
k. “概要” (Summary):单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统中。

Oracle9i 数据库管理基础 II A-28


练习 11 答案(续)
5. 获取所有尚未备份的数据文件的列表。
RMAN> REPORT NEED BACKUP;
RMAN retention policy will be applied to the command
RMAN retention policy is set to redundancy 1
Report of files with less than 1 redundant backups
File #bkps Name
---- ----- ----------------------------------
2 0 /databases/db01/ORADATA/u02/undotbs.dbf
3 0 /databases/db01/ORADATA/u03/users01.dbf
4 0 /databases/db01/ORADATA/u03/indx01.dbf
6 0 /databases/db01/ORADATA/u01/querydata01.dbf

Oracle9i 数据库管理基础 II A-29


练习 12-1 答案
完全数据库恢复:NOARCHIVELOG 模式
1. 关闭数据库并禁用自动归档。启动该例程并装载数据库。将数据库设置为
NOARCHIVELOG 模式,然后打开数据库。执行 ARCHIVE LOG LIST 命令以确认
状态。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
$ vi $HOME/ADMIN/PFILE/init<sid>.ora
comment out the log_archive_start parameter
$ sqlplus /nolog
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
SQL> alter database noarchivelog;
sql> alter database open;
sql> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /databases/db01/ORADATA/ARCHIVE2/
Oldest online log sequence 69
Current log sequence 70
2. 关闭数据库,使用操作系统命令执行关闭的数据库的完全备份,即将文件复制到
$HOME/BACKUP/NOARCH 目录中。验证副本是否完整。启动该例程,装载并打开数
据库。
SQL> shutdown immediate
SQL> exit
$ cp -r $HOME/ORADATA/u* $HOME/BACKUP/NOARCH
$ ls -alr $HOME/BACKUP/NOARCH/*
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora

Oracle9i 数据库管理基础 II A-30


练习 12-1 答案(续)
3. 运行 $HOME/STUDENT/LABS/lab12_01_03.sql 脚本。此脚本在 HR 方案中新建
一个名为 EMPHIST 的表,并向该表中添加行。查询该表以获取表中的行数。
SQL> @$HOME/STUDENT/LABS/lab12_01_03.sql
SQL> SELECT count(*) FROM hr.emphist;
COUNT(*)
----------
45
1 row selected
4. 以 system/manager 的身份进行连接,并执行
$HOME/STUDENT/LABS/lab12_01_04.sql 脚本以获取包含 EMPHIST 表的数据
文件的名称:
SQL> @$HOME/STUDENT/LABS/lab12_01_04.sql
SQL> select f.file_name from dba_tables t, dba_data_files f
2> where table_name = ‘EMPHIST‘ and
3> t.tablespace_name=f.tablespace_name;
FILE_NAME
----------------------------------------------
/databases/db01/ORADATA/u03/users01.dbf
5. 在 SQL*Plus 中运行 $HOME/STUDENT/LABS/lab12_01_05.sql 脚本以模拟出现
故障时的情况。
SQL> @$HOME/STUDENT/LABS/lab12_01_05.sql
6. 试着重新正常启动数据库。结果怎样?
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
ORACLE instance started.
...
Database mounted.
ORA-01157: cannot identify/lock datafile 3-see DBWR trace file
ORA-01110: datafile
3:'/databases/db01/ORADATA/u03/users01.dbf‘
Oracle 服务器无法打开编号为 3 的数据文件。因此,数据库仍处于装载状态。由于
服务器认为出现了介质故障,所以它无法找到 USERS 表空间的文件。

Oracle9i 数据库管理基础 II A-31


练习 12-1 答案(续)
7. 关闭数据库,使用相应的操作系统命令将当前数据库替换为最新的备份(提示:从
NOARCH 目录复制到 ORADATA 目录)。
SQL> connect / as sysdba;
SQL> shutdown abort;
SQL> !cp -r $HOME/BACKUP/NOARCH/u* $HOME/ORADATA
8. 启动并打开数据库,以使所有用户都能使用。
SQL> connect / as sysdba;
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
9. 以 hr/hr 的身份连接到数据库,并对 EMPHIST 表执行查询。结果怎样?为什么?
SQL> connect hr/hr;
SQL> SELECT * FROM emphist;
ORA-00942: table or view does not exist
该表不存在,因为它是在执行上次备份之后创建的。
10. 关于脱机备份和恢复 NOARCHIVELOG 模式下的数据库,您可以得出什么结论?
脱机备份可用于还原数据库。处于 NOARCHIVELOG 模式的数据库没有可用于恢复
到故障点的归档重做日志文件。因此,上次备份后的所有更改都已丢失。由此可解
释为什么 EMPHIST 表已不存在。

Oracle9i 数据库管理基础 II A-32


练习 12-2 答案
完全数据库恢复:ARCHIVELOG 模式
1. 查询 V$DATABASE 视图以确定数据库的归档日志模式。使用 ARCHIVE LOG LIST
检查自动归档的状态。
SQL> select dbid, name, log_mode from v$database;
DBID NAME LOG_MODE
--------- ----- ------------
1943591421 DB01 NOARCHIVELOG
1 row selected.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /databases/db01/ORADATA/ARCHIVE2/
Oldest online log sequence 69
Current log sequence 70
2. 关闭该例程,并配置自动归档。装载数据库并使用 ALTER DATABASE 命令将数据
库设置为 ARCHIVELOG 模式。
SQL> shutdown immediate;
SQL> exit
编辑 init.ora 文件以设置 LOG_ARCHIVE_START 参数。
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
SQL> alter database archivelog;
SQL> alter database open;
3. 使用 ARCHIVE LOG LIST 命令验证更改。记下当前的日志序列号。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /databases/db01/ORADATA/
ARCHIVE2/
Oldest online log sequence 69
Next log sequence to archive 70
Current log sequence 70

Oracle9i 数据库管理基础 II A-33


练习 12-2 答案(续)
4. 执行关闭的数据库的备份。将该备份存储在 $HOME/BACKUP/UMAN 目录中。
SQL> shutdown immediate;
SQL> !cp -rp $HOME/ORADATA/u* $HOME/BACKUP/UMAN
SQL > startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
5. 运行 $HOME/STUDENT/LABS/lab12_02_05.sql 脚本。此脚本在 HR 方案中新建
一个名为 EMPHIST 的表,并向该表中添加行。对 EMPHIST 表发出查询,以确定该
表中包含多少行。
SQL> @$HOME/STUDENT/LABS/lab12_02_05.sql
SQL> SELECT count(*) FROM hr.emphist;
COUNT(*)
----------
45
1 row selected
6. 以 system/manager 的身份进行连接,运行
$HOME/STUDENT/LABS/lab12_02_06.sql 脚本,并记下与包含 EMPHIST 表的
表空间关联的数据文件的名称。
SQL> connect system/manager
SQL> @$HOME/STUDENT/LABS/lab12_02_06
FILE_NAME
------------------------------------------------------
/databases/db01/ORADATA/u03/users01.dbf
1 row selected.
7. 运行 $HOME/STUDENT/LABS/lab12_02_07.sql 脚本以模拟出现硬件故障的情
况。
SQL> @$HOME/STUDENT/LABS/lab12_02_07.sql
8. 试着正常启动数据库。结果怎样?
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify/lock datafile 3 - see DBWR trace file
ORA-01110: datafile 3: '/databases/db01/ORADATA/u03/users01.dbf'
Oracle 服务器无法打开编号为 3 的数据文件。因此,数据库仍旧处于 MOUNT 模式。

Oracle9i 数据库管理基础 II A-34


练习 12-2 答案(续)
9. 由于 Oracle 服务器认为出现了介质故障,所以它无法找到 USERS 表空间的文件。由
于归档已启用,现在可以执行完全恢复了。
从第 4 步制作的备份中还原 USERS 表空间的数据文件。
$ cp -p $HOME/BACKUP/UMAN/u03/users01.dbf
$HOME/ORADATA/u03/users01.dbf
10. 用 RECOVER DATABASE 命令恢复数据库。
SQL> recover automatic database;
11. 恢复完成后,打开数据库以便让所有用户可以使用。
SQL> alter database open;
12. 查询 DBA_TABLESPACES 视图,以查看 USERS 表空间是否联机。
SQL > select tablespace_name, status from dba_tablespaces
2 > where tablespace_name = ‘USERS’;
TABLESPACE_NAME STATUS
--------------- ---------
USERS ONLINE
1 row selected.
13. 对 HR.EMPHIST 表执行查询。结果怎样?
SQL> SELECT count(*) FROM hr.emphist;
COUNT(*)
----------
55
1 row selected
注:breakdb.sql 脚本执行 moreemphist.sql 脚本,后者将附加的行插入到
HR.EMPHIST 表中。
14. 以 system/manager 的身份进行连接,查询 V$LOG 视图,并记下序列号。将这些
值与第 3 步中找到的值进行比较。关于完全恢复,您可以得出什么结论?
SQL> SELECT * FROM v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS...
------ ------- --------- ------- ------- --- ------
1 1 77 10485760 2 YES INACTIVE
2 1 78 10485760 2 NO CURRENT
制作数据库备份时使用的日志序列号将高于第 3 步中的序列号。在恢复过程中,已
应用了归档重做日志文件,并且将数据库更新到当前时间点。

Oracle9i 数据库管理基础 II A-35


练习 12-3 答案
1. 运行 $HOME/STUDENT/LABS/lab12_03_01.sql 脚本以模拟出现硬件故障的情
况。
SQL> @$HOME/STUDENT/LABS/lab12_03_01.sql
2. 尝试重新启动该例程并打开数据库。结果怎样?
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify datafile 3- file not found
ORA-01110: datafile 3: '/…/ORADATA/u03/users01.dbf'
Oracle 服务器无法打开编号为 3 的数据文件。数据库仍处于 MOUNT 模式。
3. 此时,可以执行完全恢复。将 USERS 表空间的数据文件脱机。
SQL > alter database datafile
'$HOME/ORADATA/u03/users01.dbf' offline;
4. 打开数据库以便让所有用户可以使用。
SQL> alter database open;
5. 将 USERS 表空间脱机,然后从备份中还原所有的数据文件。
SQL> ALTER TABLESPACE users OFFLINE IMMEDIATE;
$ cp $HOME/BACKUP/UMAN/u03/users01.dbf $HOME/ORADATA/u03
6. 用 RECOVER TABLESPACE 命令恢复表空间。
SQL> RECOVER AUTOMATIC TABLESPACE users;
7. 将 USERS 表空间重新联机。
SQL> ALTER TABLESPACE users ONLINE;
8. 对 HR.EMPHIST 表执行查询。
SQL> SELECT COUNT(*) FROM hr.emphist;
COUNT(*)
----------
65
1 row selected

Oracle9i 数据库管理基础 II A-36


练习 12-4 答案
1. 以用户 SYSTEM 的身份运行 $HOME/STUDENT/LABS/lab12_04_01.sql 脚本来
执行以下操作:
– 用新的数据文件创建新的表空间
– 在新的表空间的 HR 方案中创建名为 NEW_EMP 的表
– 模拟丢失新数据文件的情况
SQL> @$HOME/STUDENT/LABS/newtbs.sql
2. 使用以下命令更新 NEW_EMP 表中的行:结果怎样?
SQL> UPDATE hr.new_emp
2> SET salary = salary * 1.1;
UPDATE new_emp
*
ERROR at line 1:
ORA-01116: error in opening database file 7
ORA-01110: datafile 7:
'/databases/db01/ORADATA/u04/newusers01.dbf‘
ORA-27041: unable to open file
SVR4 Error:2: No such file or directory
Additional information: 3
Oracle 服务器找不到 NEW_USERS 表空间的文件。
3. 在重新创建没有备份的文件后,可以执行完全恢复。以 sysdba 的身份进行连接。
可以将 NEW_USERS 表空间的数据文件脱机,或者将该表空间脱机,因为它只包含
一个数据文件。
注:为避免检查点写入到不存在的文件,必须包含 Immediate 选项:
SQL> CONNECT / AS SYSDBA
SQL> ALTER TABLESPACE new_users OFFLINE IMMEDIATE;
Tablespace altered.
通过查询 V$RECOVER_FILE 确认恢复状态。
SQL> select * from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
-----------------------------------------------
7 OFFLINE FILE NOT FOUND 0

Oracle9i 数据库管理基础 II A-37


练习 12-4 答案(续)
4. 现在,必须重新创建该文件。
SQL > ALTER DATABASE CREATE DATAFILE
2 > '$HOME/ORADATA/u04/newusers01.dbf';
Database altered.
SQL> select * from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- ------------------ --------- ---------
7 OFFLINE 248621 22-MAR-01

5. 使用 RECOVER TABLESPACE 命令将重做日志应用到数据文件中。


SQL > RECOVER TABLESPACE new_users;
6. 恢复完成后,将该表空间联机。
SQL > ALTER TABLESPACE new_users ONLINE;
所有数据现已恢复。将文件包括在备份策略中,并通知用户可以再次使用表空间了。
7. 按如下方式再次尝试更新 HR.NEW_EMP 表中的行:
SQL> UPDATE hr.new_emp
2> SET salary = salary * 1.1;
8. 删除 NEW_USERS 表空间及其关联的数据文件,以便进行以后的练习。
SQL > DROP TABLESPACE new_users
2 > INCLUDING CONTENTS AND DATAFILES;

Oracle9i 数据库管理基础 II A-38


练习 12-5 答案
在本练习中,将模拟对 SAMPLE 表空间进行联机备份时出现数据库故障的情况。需要执
行相应的命令恢复和重新打开数据库。
1. 通过在 SQL*Plus 中发出相应的命令,从而开始对 SAMPLE 表空间进行联机备份。
SQL> ALTER TABLESPACE sample BEGIN BACKUP;
Tablespace altered.
2. 在 $HOME/BACKUP/UMAN 目录中,制作属于 SAMPLE 表空间的文件的操作系统备
份。
$ cp $HOME/ORADATA/u02/sample01.dbf $HOME/BACKUP/UMAN
3. 在 SQL*Plus 中执行 SHUTDOWN ABORT 命令。
SQL> shutdown abort;
4. 启动该例程并装载数据库。
SQL> connect / as sysdba;
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora;
ORACLE instance started.
Total System Global Area 21797632 bytes
Fixed Size 285440 bytes
Variable Size 16777216 bytes
Database Buffers 4194304 bytes
Redo Buffers 540672 bytes
Database mounted.
5. 查询 V$BACKUP 以确定所有文件是否都在联机备份中。
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
----- ------------------ ------- ---------
1 NOT ACTIVE 0
2 NOT ACTIVE 0
3 NOT ACTIVE 0
4 NOT ACTIVE 0
5 ACTIVE 107167 22-MAR-01
6 NOT ACTIVE 0
这说明编号为 5 的文件当前处于联机备份模式。

Oracle9i 数据库管理基础 II A-39


练习 12-5(续)
6. 执行相应的命令以终止备份模式,并取消冻结数据文件头。查询 V$BACKUP 以检查
数据文件的状态。
SQL> ALTER DATABASE datafile 5 END BACKUP;
Database altered.
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
---- --------------- ------- ---------
1 NOT ACTIVE 0
...
5 ACTIVE 107167 22-MAR-01
...
7. 打开用户数据库。
SQL> ALTER DATABASE OPEN;
Database altered.

Oracle9i 数据库管理基础 II A-40


练习 13-1 答案
使用 RMAN 恢复表空间
1. 使用以下格式配置控制文件自动备份:
$HOME/BACKUP/RMAN/%F.bck
RMAN> connect target
connected to target database: ED21 (DBID=1140378486)
RMAN> configure controlfile autobackup format for device type disk
2> to '$HOME/BACKUP/RMAN/%F.bck';
using target database controlfile instead of recovery catalog
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'$HOME/BACKUP/R;
new RMAN configuration parameters are successfully stored RMAN>
configure controlfile autobackup on;
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters are successfully stored
2. 创建以下格式的完整数据库备份:
$HOME/BACKUP/RMAN/df_%d_%s_%p.bus
使用 RMAN 命令行解答
RMAN> backup database
2> format '$HOME/BACKUP/RMAN/df_%d_%s_%p.bus';
Starting backup at 25-APR-01
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/…/ORADATA/u01/system01.dbf
input datafile fno=00005 name=/…/ORADATA/u02/sample01.dbf
input datafile fno=00002 name=/…/ORADATA/u02/undotbs.dbf
input datafile fno=00003 name=/…/ORADATA/u03/users01.dbf
input datafile fno=00004 name=/…/ORADATA/u03/indx01.dbf
input datafile fno=00006 name=/…/ORADATA/u01/querydata01.dbf
channel ORA_DISK_1: starting piece 1 at 25-APR-01
channel ORA_DISK_1: finished piece 1 at 25-APR-01
piece handle=/…/BACKUP/RMAN/df_ED21_3_1.bus comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35

Oracle9i 数据库管理基础 II A-41


练习 13-1 答案(续)
Finished backup at 25-APR-01
Starting Control File Autobackup at 25-APR-01
piece handle=/…/BACKUP/RMAN/c-1125003950-20010425-00.bck comment=NE
Finished Control File Autobackup at 25-APR-01
使用 Oracle Enterprise Manager 解答
使用 “备份向导” (Backup Wizard) 创建备份:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “备份” (Backup)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “策略选择” (Strategy Choice) 页:选择 “自定义备份策略” (Customize Backup
Strategy)。单击 “下一步” (Next)。
d. “备份选择” (Backup Selection) 页:选择 “数据库” (Database)。单击 “下一步” (Next)。
e. “归档日志” (Archived Logs) 页:选择 “否” (No)。单击 “下一步” (Next)。
f. “备份选项” (Backup Options) 页:选择 “完全” (Full)。单击 “下一步” (Next)。
g. “配置” (Configuration) 页:选择您的配置。单击 “下一步” (Next)。
h. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
i. “作业信息” (Job Information) 页:单击 “完成” (Finish)。
j. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。
使用 RMAN 恢复表空间
3. 在 SQL*Plus 中,以 sysdba 用户身份连接,然后运行
$HOME/STUDENT/LABS/lab13_01_03.sql 脚本。
SQL> @$HOME/STUDENT/LABS/lab13_01_03.sql
4. 在 SQL*Plus 中启动您的例程。
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora

Oracle9i 数据库管理基础 II A-42


练习 13-1 答案(续)
5. 使用 RMAN 还原和恢复 USERS 表空间。
使用 RMAN 命令行解答
RMAN> connect target
connected to target database (not started)
RMAN> restore tablespace users;
Starting restore at 02-APR-01
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=11 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup
set
restoring datafile 00003 to
/databases/db01/ORADATA/u03/users_01_db01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/databases/db01/BACKUP/RMAN/df_DB01_3_1.bus tag=null
params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 02-APR-01
RMAN> recover tablespace users;
Starting recover at 02-APR-01
using channel ORA_DISK_1
starting media recovery
archive logfilename=/databases/db01/ORADATA/ARCHIVE1/arch_90.arc
thread=1 sequ6

archive logfilename=/databases/db01/ORADATA/ARCHIVE1/arch_95.arc
thread=1 sequ3
media recovery complete
Finished recover at 02-APR-01

Oracle9i 数据库管理基础 II A-43


练习 13-1 答案(续)
使用 Oracle Enterprise Manager 解答
使用 “恢复向导” (Recovery Wizard) 恢复表空间:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “恢复” (Recovery)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “恢复选择” (Recovery Selection) 页:选择 “表空间” (Tablespaces)。单击 “下一
步” (Next)。
d. “表空间” (Tablespaces) 页:选择 USERS 表空间。单击 “下一步” (Next)。
e. “重命名” (Rename) 页:单击 “下一步” (Next)。
f. “配置” (Configuration) 页:单击 “完成” (Finish)。
g. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。
6. 完成恢复后打开数据库。
RMAN> alter database open;
using target database controlfile instead of recovery catalog
database opened

Oracle9i 数据库管理基础 II A-44


练习 13-2 答案
重新定位数据文件
1. 在 SQL*Plus 中,以 sysdba 的身份进行连接,然后运行
$HOME/STUDENT/LABS/lab13_02_01.sql 脚本。
SQL> @$HOME/STUDENT/LABS/lab13_02_01.sql
2. 您已确定 u03 ($HOME/ORADATA/u03) 已损坏。必须将 USERS 表空间的数据文件
重新定位到另一位置。$HOME/ORADATA/u04 具有足够的空间。使用 RMAN,建立
一个 RUN 块以将数据文件从 u03 重新定位到 u04,然后恢复 USERS 表空间。
使用 RMAN 命令行解答
RMAN> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora;
run{
set newname for datafile 3 to ‘$HOME/ORADATA/u04/users01.dbf’;
restore tablespace users;
switch datafile all;
recover tablespace users;
sql ‘alter database open’;
}
executing command: SET NEWNAME
Starting restore at 02-APR-01
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup
set
restoring datafile 00003 to
/databases/db01/ORADATA/u04/users01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/databases/db01/BACKUP/RMAN/df_DB01_3_1.bus tag=null
params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 02-APR-01
datafile 3 switched to datafile copy
input datafilecopy recid=4 stamp=425996991
filename=/databases/ed01/ORADATA/u04f
Starting recover at 02-APR-01
using channel ORA_DISK_1
starting media recovery
archive logfilename=/databases/db01/ORADATA/ARCHIVE1/arch_90.arc
thread=1 sequ6
archive logfilename=/databases/db01/ORADATA/ARCHIVE1/arch_103.arc
thread=1 sequ4
media recovery complete
Finished recovery at 02-APR-01

Oracle9i 数据库管理基础 II A-45


练习 13-2 答案(续)
使用 Oracle Enterprise Manager 解答
使用 “恢复向导” (Recovery Wizard) 恢复表空间:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “恢复” (Recovery)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “恢复选择” (Recovery Selection) 页:选择 “表空间” (Tablespaces)。单击 “下
一步” (Next)。
d. “表空间” (Tablespaces) 页:选择 USERS 表空间。单击 “下一步” (Next)。
e. “重命名” (Rename) 页:在 “新名称” (New Name) 字段中输入新的路径和名称。
单击 “下一步” (Next)。
f. “配置” (Configuration) 页:单击 “完成” (Finish)。
g. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。

Oracle9i 数据库管理基础 II A-46


练习 14-1 答案
从用户失败进行恢复:不完全恢复
1. 如果您不能肯定是否从前面的练习中得到了一个有效的备份,则可执行关闭的或打
开的数据库的整体备份。将备份存储在 $HOME/BACKUP/UMAN 目录下。启动例程并
装载数据库。
SQL> shutdown immediate;
SQL> !cp -rp $HOME/ORADATA/u* $HOME/BACKUP/UMAN
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora;
2. 以 hr/hr 身份连接。执行下列语句以在 EMPHIST 表中插入行:
SQL> INSERT INTO emphist SELECT * FROM emphist;
SQL> COMMIT;
3. 执行 SELECT 语句从 EMPHIST 表获取一定数量的行。记下行数。
SQL> SELECT COUNT(*) FROM emphist;
COUNT(*)
--------
170
4. 以 system/manager 身份连接并发出以下查询
SQL> SELECT f.file_name FROM dba_tables t, dba_data_files f
2> WHERE table_name = ‘EMPHIST‘ AND
3> t.tablespace_name = f.tablespace_name;
记录表空间的所有数据文件的文件名。
$HOME/ORADATA/u04/users01.dbf
5. 用操作系统命令记录当前系统时间。
SQL> !date
Thu Mar 22 14:34:41 PST 2001
6. 查询 V$LOG 以查找当前的联机日志序列号。
SQL> SELECT * FROM v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS...
------ ------- --------- -------- ------- --- ------- ...
1 1 105 10485760 2 YES INACTIVE
2 1 106 10485760 2 NO CURRENT
7. 以 hr/hr 身份连接并执行以下命令向 EMPHIST 表添加行:
$ sqlplus hr/hr
SQL> INSERT INTO emphist SELECT * FROM emphist;
SQL> COMMIT;

Oracle9i 数据库管理基础 II A-47


练习 14-1 答案(续)
8. 执行 SELECT 语句从 EMPHIST 表获取一定数量的行。记下行数。
SQL> SELECT COUNT(*) FROM emphist;
COUNT(*)
--------
340
9. 运行 $HOME/STUDENT/LABS/lab14_01_09.sql 脚本以模拟某个用户意外删除
EMPHIST 表的情况。
SQL> @$HOME/STUDENT/LABS/lab14_01_09.sql
10. 尝试查询 EMPHIST 表。结果怎样?
SQL> SELECT * FROM hr.emphist;
ORA-00942: table or view does not exist
该表已不存在。
11. Oracle 服务器找不到 EMPHIST 表。您需要将该表还原到数据库。因为已启用归
档,并且您知道发生故障的大概时间,因此现在可以执行不完全恢复来还原该表。
关闭例程。
SQL> shutdown immediate
12. 使用第 1 步中制作的备份还原所有数据文件。
SQL> !cp $HOME/BACKUP/UMAN/u01/*.dbf $HOME/ORADATA/u01
SQL> !cp $HOME/BACKUP/UMAN/u02/*.dbf $HOME/ORADATA/u02
SQL> !cp $HOME/BACKUP/UMAN/u03/*.dbf $HOME/ORADATA/u03
如果在本练习开始前没有进行备份,则需要按如下方式还原 USERS 表空间的数据文
件:
SQL> !cp $HOME/BACKUP/UMAN/u03/users01.dbf $HOME/ORADATA/u04
13. 启动该例程并装载数据库。将数据库恢复至第 5 步中记下的时间。
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
SQL> RECOVER DATABASE UNTIL TIME '2001-03-22:14:34:41'
14. 恢复完成后,使用 Resetlogs 选项打开数据库。
SQL> ALTER DATABASE OPEN RESETLOGS;

Oracle9i 数据库管理基础 II A-48


练习 14-1 答案(续)
15. 以 hr/hr 的身份进行连接,并对 EMPHIST 表执行查询。结果怎样?为什么?
SQL> connect hr/hr
SQL> SELECT COUNT(*) FROM emphist;
COUNT(*)
----------
170
1 row selected
现在可以查找到该表,这是因为整个数据库被恢复到删除该表前的时间。但是,
在恢复数据库后插入的行将丢失。
16. 以 system/manager 身份连接,查询 V$LOG 视图并记下序列号。将这个值与第 5
步中的值进行比较。关于不完全恢复,您可以得出什么结论?
SQL> SELECT * FROM v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS...
------ ------- --------- ------ ------- --- -------...
1 1 0 10485760 2 YES UNUSED
2 1 1 10485760 2 NO CURRENT
The sequence numbers are reset to 1.
17. 执行整体脱机备份。将备份存储在 $HOME/BACKUP/UMAN 目录下。
SQL> connect / as sysdba
SQL> shutdown immediate
SQL> !cp -rp $HOME/ORADATA/u* $HOME/BACKUP/UMAN

Oracle9i 数据库管理基础 II A-49


练习 14-2 答案
在丢失归档日志的情况下进行恢复:不完全恢复
1. 启动例程并打开数据库。使用操作系统命令确定当前的系统时间。
SQL> startup
SQL> !date
Fri Mar 23 07:35:46 PST 2001
2. 查询 V$LOG 视图并记录当前的联机日志序列号。
SQL> SELECT * FROM v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS...
------ ------- --------- ----- ------- --- ------- ...
1 1 0 10485760 2 YES UNUSED
2 1 1 10485760 2 NO CURRENT
3. 运行 $HOME/STUDENT/LABS/lab14_02_03.sql 脚本切换日志并创建一个新表。
SQL> @$HOME/STUDENT/LABS/lab14_02_04.sql
4. 运行 $HOME/STUDENT/LABS/lab14_02_04.sql 脚本以模拟丢失归档重做日志
文件时的情况。
SQL> @$HOME/STUDENT/LABS/lab14_02_04.sql
5. 运行 $HOME/STUDENT/LABS/lab14_02_05.sql 脚本以模拟出现硬件故障时的
情况。
SQL> @$HOME/STUDENT/LABS/lab14_02_05.sql
6. 试着重新正常启动数据库。结果怎样?
SQL> startup
ORACLE instance started.

Database mounted.
ORA-01157:cannot identify/lock datafile 3 - see DBWR trace file
ORA-01110:datafile 3: '/databases/db01/ORADATA/u04/users01.dbf‘
Oracle 服务器无法打开编号为 3 的数据文件。数据库仍处于 MOUNT 模式。
7. 由于 Oracle 服务器认为出现了介质故障,所以它无法找到 USERS 表空间的文件。由
于归档已启用,现在可以尝试执行完全恢复了。
使用练习 14-1 中制作的备份还原 USERS 表空间的数据文件。
$cp $HOME/BACKUP/UMAN/u04/users01.dbf $HOME/ORADATA/u04

Oracle9i 数据库管理基础 II A-50


练习 14-2 答案(续)
8. 使用 RECOVER AUTOMATIC DATABASE 命令恢复数据库。记下找不到的所有文件
的名称。当 Oracle 服务器找不到指定的归档日志时,发出 CANCEL 命令。
SQL> RECOVER AUTOMATIC DATABASE
ORA-00279: change 87937 generated at 03/23/2001 08:49:39 needed
for thread 1
ORA-00289:suggestion:/…/ORADATA/ARCHIVE2/arch_32.arc
ORA-00280: change 87937 for thread 1 is in sequence #3
ORA-00278: log file '/databases/db01/ORADATA/ARCHIVE2/arch_32.arc'
no longer needed for this recovery
ORA-00308: cannot open archived log
'/databases/db01/ORADATA/ARCHIVE2/arch_32.arc‘
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
Specify log:{<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
Media recovery cancelled.
9. 试着打开数据库。结果怎样?
SQL> ALTER DATABASE OPEN;
ORA-01113: file 3 needs media recovery
ORA-01110: datafile 3: ‘/…/ORADATA/u04/users01.dbf'
要与其它数据文件保持同步,必须对该数据文件进行进一步的恢复。
10. 在应用丢失的归档日志之前,已取消了恢复。因此,不能将 USERS 表空间中的数据
文件前滚到当前的数据库时间。由于恢复无法及时还原数据库,所以必须进行不完
全恢复。
使用练习 14-1 中制作的备份还原所有数据文件。
SQL> !cp $HOME/BACKUP/UMAN/u01/*.dbf $HOME/ORADATA/u01
SQL> !cp $HOME/BACKUP/UMAN/u02/*.dbf $HOME/ORADATA/u02
SQL> !cp $HOME/BACKUP/UMAN/u03/*.dbf $HOME/ORADATA/u03
SQL> !cp $HOME/BACKUP/UMAN/u04/*.dbf $HOME/ORADATA/u04

Oracle9i 数据库管理基础 II A-51


练习 14-2 答案(续)
11. 使用 UNTIL CANCEL 选项恢复数据库,在 Oracle 服务器请求使用第 8 步中记录的
归档日志文件时停止恢复。
注:不要使用自动方法。当 Oracle 服务器请求归档日志时,以手动方式应用每一个
归档日志。
SQL> RECOVER DATABASE UNTIL CANCEL
ORA-00279: change 87837 generated at 03/22/2001 15:06:39 needed
for thread 1
ORA-00289: suggestion :
/databases/db01/ORADATA/ARCHIVE2/arch_1.arc
ORA-00280: change 87837 for thread 1 is in sequence #1
...
ORA-00279: change 87937 generated at 03/23/2001 08:49:39 needed
for thread 1
ORA-00289: suggestion :
/databases/db01/ORADATA/ARCHIVE2/arch_3.arc
ORA-00280: change 87937 for thread 1 is in sequence #3
ORA-00278: log file '/databases/db01/ORADATA/ARCHIVE2/arch_2.arc'
no longer
needed for this recovery
12. 在恢复提示符下键入 cancel。
CANCEL
Media recovery cancelled.
13. 恢复完成后,使用 RESETLOGS 选项打开数据库。
SQL> ALTER DATABASE OPEN RESETLOGS;
Statement processed.
14. 查询 V$DATAFILE 以验证所有数据文件是否都处于联机状态。
SQL> SELECT name, status FROM v$datafile;
NAME STATUS
-------------------------------------------- -------
/databases/db01/ORADATA/u01/system01.dbf SYSTEM
/databases/db01/ORADATA/u02/undotbs.dbf ONLINE
/databases/db01/ORADATA/u04/users01.dbf ONLINE
/databases/db01/ORADATA/u03/indx01.dbf ONLINE
/databases/db01/ORADATA/u02/sample01.dbf ONLINE
/databases/db01/ORADATA/u01/querydata0.dbf ONLINE
15. 执行整体脱机备份。将备份存储到 $HOME/BACKUP/UMAN 目录中。
SQL> connect / as sysdba
SQL> shutdown immediate
SQL> !cp -rp $HOME/ORADATA/u* $HOME/BACKUP/UMAN

Oracle9i 数据库管理基础 II A-52


练习 15 答案
在丢失归档日志的情况下进行 RMAN 恢复:不完全恢复
1. 使用 RMAN 创建具有以下格式的完整数据库备份:
$HOME/BACKUP/RMAN/df_%d_%s_%p.bus
使用 RMAN 命令行解答
RMAN> backup database
2> format '$HOME/BACKUP/RMAN/df_%d_%s_%p.bus';
使用 Oracle Enterprise Manager 解答
使用 “备份向导” (Backup Wizard) 创建备份:
a. 在 “导航器” (Navigator) 中选择您的数据库。
b. 择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “备份” (Backup)
c. “简介” (Introduction) 页:单击 “下一步” (Next)。
d. “策略选择” (Strategy Choice) 页:选择 “自定义备份策略” (Customize Backup
Strategy)。单击 “下一步” (Next)。
e. “备份选择” (Backup Selection) 页:选择 “数据库” (Database)。单击 “下一步”
(Next)。
f. “归档日志” 页:选择 “否” (No)。单击 “下一步” (Next)。
g. “备份选项” (Backup Options) 页:选择 “完全” (Full)。单击 “下一步” (Next)。
h. “配置” (Configuration) 页:选择您的配置。单击 “下一步” (Next)。
i. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
j. “作业信息” (Job Information) 页:单击 “完成” (Finish)。
k. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统中。
2. 运行 $HOME/STUDENT/LABS/lab15_02.sql 脚本切换日志并创建一个新表。
SQL> @$HOME/STUDENT/LABS/lab15_02.sql
3. 运行 $HOME/STUDENT/LABS/lab15_03.sql 脚本以模拟丢失归档重做日志文件
的情况。
SQL> @$HOME/STUDENT/LABS/lab15_03.sql
4. 运行 $HOME/STUDENT/LABS/lab15_04.sql 脚本以模拟出现硬件故障的情况。
SQL> @$HOME/STUDENT/LABS/lab15_04.sql
5. 试着重新正常启动数据库。结果怎样?
SQL> startup
ORACLE instance started.

Database mounted.
ORA-01157:cannot identify/lock datafile 3 - see DBWR trace file
ORA-01110:datafile 3: '/databases/db01/ORADATA/u04/users01.dbf‘
Oracle 服务器无法打开编号为 3 的数据文件。数据库仍处于 MOUNT 模式 。

Oracle9i 数据库管理基础 II A-53


练习 15 答案(续)
6. 由于 Oracle 服务器认为出现了介质故障,所以它无法找到 USERS 表空间的文件。由
于归档已启用,现在可以尝试执行完全恢复了。
使用 RMAN 还原 USERS 表空间的数据文件。
使用 RMAN 命令行解答
RMAN> restore tablespace users;
Starting restore at 26-APR-01
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=11 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup
set
restoring datafile 00003 to
/databases/ed21/ORADATA/u04/users01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/databases/ed21/BACKUP/RMAN/df_ED21_5_1.bus tag=null
params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 26-APR-01
使用 Oracle Enterprise Manager 解答
使用 “恢复向导” (Recovery Wizard) 恢复表空间:
a. 在 “导航器” (Navigator) 中选择您的数据库。
b. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “恢复” (Recovery)
c. “简介” (Introduction) 页:单击 “下一步” (Next)。
d. “恢复选择” (Recovery Selection) 页:选择 “表空间” (Tablespaces)。单击 “下一
步” (Next)。
e. “表空间” (Tablespaces) 页:选择 USERS 表空间。单击 “下一步” (Next)。
f. “重命名” (Rename) 页:单击 “下一步” (Next)。
g. “配置” (Configuration) 页:单击 “完成” (Finish)。
h. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。

Oracle9i 数据库管理基础 II A-54


练习 15 答案(续)
7. 使用 RMAN 恢复表空间。记下找不到的文件的名称和序列号。
RMAN> recover tablespace users;
Starting recover at 26-APR-01
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 1 is already on disk as file
/databases/ed21/ORADc
RMAN
00571:=========================================================
RMAN-00579: the following error occurred at 04/26/2001 13:12:50
RMAN-03002: failure during compilation of command
RMAN-03013: command type: recover
RMAN-03002: failure during compilation of command
RMAN-03013: command type: recover(4)
RMAN-06053: unable to perform media recovery because of missing
log
RMAN-06025: no backup of log thread 1 seq 2 scn 168396 found to
restore
8. 使用带有 UNTIL LOG SEQUENCE 子句的 RMAN 命令,通过上一个完好的归档重
做日志文件执行不完全恢复。
RMAN> RUN {
2> SET UNTIL SEQUENCE 2 THREAD 1;
3> RESTORE DATABASE;
4> RECOVER DATABASE;
5> }
executing command: SET until clause
Starting restore at 26-APR-01
using channel ORA_DISK_1
datafile 6 not processed because file is read-only
skipping datafile 3; already restored to file
/databases/ed21/ORADATA/u04/users01.dbf
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup
set

Oracle9i 数据库管理基础 II A-55


练习 15 答案(续)
restoring datafile 00001 to
/databases/ed21/ORADATA/u01/system01.dbf
restoring datafile 00002 to
/databases/ed21/ORADATA/u02/undotbs.dbf
restoring datafile 00004 to /databases/ed21/ORADATA/u03/indx01.dbf
restoring datafile 00005 to
/databases/ed21/ORADATA/u02/sample01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/databases/ed21/BACKUP/RMAN/df_ED21_5_1.bus tag=null
params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 26-APR-01
Starting recover at 26-APR-01
using channel ORA_DISK_1
datafile 6 not processed because file is read-only
starting media recovery
archive log thread 1 sequence 1 is already on disk as file
/databases/ed21/ORADc
archive log filename=/databases/ed21/ORADATA/ARCHIVE1/arch_1.arc
thread=1 seque1
media recovery complete
Finished recover at 26-APR-01
9. 恢复完成后,使用 RESETLOGS 选项打开数据库。
RMAN> ALTER DATABASE OPEN RESETLOGS;
Database altered
10. 在 $HOME/BACKUP/RMAN 目录中,按以下格式创建一个新备份
df_%d_%s_%p.bus
使用 RMAN 命令行解答
RMAN> backup database
2> format '$HOME/BACKUP/RMAN/df_%d_%s_%p.bus';
使用 Oracle Enterprise Manager 解答
请参见第 1 步。

Oracle9i 数据库管理基础 II A-56


练习 16 答案
1. 在缺省 NOCATALOG 模式下连接到数据库。
$ rman target /
Recovery Manager: Release 9.0.0.0.0 - Beta
(c) Copyright 2000 Oracle Corporation. All rights reserved.
connected to target database: DB01 (DBID=1121888154)
2. 使用 RMAN REPORT 命令生成数据库结构的列表。
RMAN> REPORT SCHEMA;
using target database controlfile instead of recovery catalog
Report of database schema
File K-bytes Tablespace RB Datafile Name
---- ------- ---------- --- -------------------
1 102400 SYSTEM *** /…/ORADATA/u01/system01.dbf
2 30720 UNDOTBS *** /…/ORADATA/u02/undotbs.dbf
3 51200 USERS *** /…/ORADATA/u03/users01.dbf
4 5120 INDX *** /…/ORADATA/u03/indx01.dbf
5 1024 QUERY_DATA *** /…/ORADATA/u01/querydata01.dbf
6 10240 SAMPLE *** /…/ORADATA/u02/sample01.dbf
3. 使用 RMAN LIST 和 CROSSCHECK 命令生成备份集和文件状态的列表。
RMAN> LIST BACKUP;
List of Backup Sets
===================
BS Key Type LV SizeDevice Type Elapsed Time Completion Time
------ ---- -- ---------- ---- ------------ ----------------
1 Full 1M DISK 00:00:01 21-MAR-01
BP Key: 1 Status: AVAILABLE Tag:
Piece Name: /databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
Controlfile Included: Ckp SCN: 66090 Ckp time: 21-MAR-01
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ------- --------- ---------------------------
6 Full 66091 21-MAR-01 /…/ORADATA/u03/sample01.dbf

Oracle9i 数据库管理基础 II A-57


练习 16 答案(续)
RMAN> CROSSCHECK BACKUPSET 1;
using channel ORA_DISK_1
crosschecked backup piece: found to be 'AVAILABLE‘
backup piece handle=/databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
recid=1 stamp=46
4. 使用操作系统命令,将属于 SAMPLE 表空间的备份文件复制到 BACKUP 目录中,然
后将它从 RMAN 目录删除以模拟丢失备份时的情况。
$cp $HOME/BACKUP/RMAN/df_DB01_1_1.bus $HOME/BACKUP
$rm $HOME/BACKUP/RMAN/df_DB01_1_1.bus
5. 通过 RMAN CROSSCHECK 命令,使用上一步中已移动的数据文件备份的状态来更新
资料档案库。确保指定上一步中所移动的备份集
RMAN> CROSSCHECK BACKUPSET 1;
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
crosschecked backup piece: found to be 'EXPIRED'
backup piece handle=/databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
recid=1 stamp=46
6. 执行 LIST EXPIRED 命令来检查文件的状态。是否有任何文件过期?
RMAN> LIST EXPIRED BACKUP;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
--- ---- -- ---- ----------- ------------ ---------------
1 Full 1M DISK 00:00:01 21-MAR-01
BP Key: 1 Status: EXPIRED Tag:
Piece Name: /databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
Controlfile Included: Ckp SCN: 66090 Ckp time: 21-MAR-01
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
-- -- ---- ------- --------- ------------------------------
6 Full 66091 21-MAR-01 /…/ORADATA/u02/sample01.dbf

Oracle9i 数据库管理基础 II A-58


练习 16 答案(续)
7. 使用操作系统命令,将 SAMPLE 表空间备份返回到正确的位置。
$mv $HOME/BACKUP/df_DB01_1_1.bus $HOME/BACKUP/RMAN
8. 通过 RMAN CROSSCHECK 命令,使用数据文件备份的状态更新资料档案库。
RMAN> CROSSCHECK BACKUPSET 1;
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
crosschecked backup piece: found to be ‘AVAILABLE‘
backup piece handle=/databases/db01/BACKUP/RMAN/df_DB01_1_1.bus
recid=1 stamp=46
9. 在 $HOME/BACKUP/RMAN 目录中,通过用户管理的过程创建属于 SAMPLE 表空间
的数据文件的备份
SQL> ALTER TABLESPACE sample BEGIN BACKUP;
Tablespace altered.
cp $HOME/ORADATA/u02/sample01.dbf $HOME/BACKUP/RMAN
SQL> ALTER TABLESPACE sample END BACKUP;
Tablespace altered.
10. 通过 RMAN CATALOG 命令,使用该备份信息更新资料档案库。
RMAN> CATALOG DATAFILECOPY
'$HOME/BACKUP/RMAN/sample01.dbf';
using target database controlfile instead of recovery catalog
cataloged datafile copy
datafile copy filename=/databases/db01/BACKUP/RMAN/sample01.dbf
recid=3 s7

Oracle9i 数据库管理基础 II A-59


练习 16 答案(续)
11. 使用 RMAN LIST COPY 命令来验证该备份是否已记录到资料档案库中。
RMAN> list copy;
List of Datafile Copies
Key F S Completion Ckp SCN Ckp Time Name
--- - - ---------- ------- --------- ---------------
1 1 A 21-MAR-01 66107 21-MAR-01 /…/BACKUP/RMAN/
sys0101.cpy
3 6 A 23-MAR-01 88207 23-MAR-01 /…/BACKUP/RMAN/
sample01…

Oracle9i 数据库管理基础 II A-60


练习 17 答案
1. 执行 lab17_01.sql 脚本创建恢复目录的 recat 表空间以及 rcuser 方案。
SQL> @$HOME/STUDENT/LABS/lab17_01
2. 使用 RMAN 连接到恢复目录数据库。在 recat 表空间中创建目录。
rman catalog rcuser/rcuser@<service name>
Recovery Manager: Release 9.0.0.0.0 - Beta
(c) Copyright 2000 Oracle Corporation. All rights reserved.
connected to recovery catalog database
recovery catalog is not installed
RMAN> CREATE CATALOG;
3. 使用 RMAN 连接到目标数据库和恢复目录。
rman target / catalog rcuser/rcuser@<service name>
Recovery Manager: Release 9.0.0.0.0 - Beta
(c) Copyright 2000 Oracle Corporation. All rights reserved.
connected to target database: DB01 (DBID=1122749761)
connected to recovery catalog database
4. 执行此命令以重新同步控制文件和恢复目录。结果怎样?为什么?
RMAN> resync catalog;
RMAN-00571:================================================
RMAN-00569: =========== ERROR MESSAGE STACK FOLLOWS ======
RMAN-00571:================================================
RMAN-00579: the following error occurred at 03/23/2001 12:47:15
RMAN-03006: non-retryable error occurred during execution of
command: resync
RMAN-12004: unhandled exception during command execution on
channel default
RMAN-20001: target database not found in recovery catalog
该目标数据库未在目录中注册。
5. 出现 RMAN 提示符时,在恢复目录中注册目标数据库。
使用 RMAN 命令行解答
RMAN> register database;
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete

Oracle9i 数据库管理基础 II A-61


练习 17 答案(续)
使用 Oracle Enterprise Manager 解答
必须先创建一个使用恢复目录的备份配置。请按如下方式使用 “创建备份配置向
导” (Create Backup Configuration Wizard) 创建配置:
a. 在 “导航器” (Navigator) 中选择您的数据库。
b. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “备份管理” (Backup
Management) > “创建备份配置” (Create Backup Configuration)
c. 在 “常规” (General) 选项卡上提供名称。
d. 在 “通道 ” (Channels) 页上,选择 “备份集” (Backup Set) 和 “磁盘” (Disk)。
e. 提供通道名称和格式
<path>/BACKUP/RMAN/df_%d_%s_%p.bus
f. 在 “恢复目录” (Recovery Catalog) 页上,指定恢复目录所有者的用户名
(rcuser)和口令(rcuser)。此外,还要指定服务名称。单击 “创建”
(Create)。
g. 此时,就会出现一个对话框。单击 “注册” (Register) 以在恢复目录中注册数据
库。

Oracle9i 数据库管理基础 II A-62


练习 17 答案(续)
6. 用 RMAN,列出目录中注册的所有数据库副本。
RMAN> list incarnation of database;
RMAN-03022: compiling command: list
List of Database Incarnations
DB K Inc K DB Name DB ID CUR Reset SCN Reset Time
---- ----- ------- -------------- --- --------- -----------
1 2 DB01 1121888154 YES 87938 23-MAR-01
7. 在 RMAN 提示符下输入 RESET DATABASE 命令。结果怎样?
RMAN> reset database;
RMAN-00571:===============================================
RMAN-00569:=========== ERROR MESSAGE STACK FOLLOWS =======
RMAN-00571:===============================================
RMAN-03006: non-retryable error occurred during execution of
command: reset
RMAN-07004: unhandled exception during command execution on
channel default
RMAN-20009: database incarnation already registered
8. 查看 $HOME/STUDENT/LABS/lab17_08.sql 脚本。在 SQL*Plus 中,以
system/manager 的身份连接到目标数据库,并执行该脚本,以便在
$HOME/BACKUP 目录中创建 SAMPLE 表空间数据文件的联机操作系统副本。
SQL> @$HOME/STUDENT/LABS/lab17_08.sql
9. 使用 RMAN,将第 8 步中创建的备份添加到目录中。
$rman target / catalog rcuser/rcuser@<service name>
Recovery Manager: Release 9.0.0.0.0 - Beta
(c) Copyright 2000 Oracle Corporation. All rights reserved.
connected to target database: DB01 (DBID=1121888154)
connected to recovery catalog database
RMAN> catalog datafilecopy
2> '$HOME/BACKUP/sample01.cpy'
3> tag 'SAMPLECPY1';
cataloged datafile copy datafile copy
filename=/databases/db01/BACKUP/sample01.cpy recid=4 stamp=4251353

Oracle9i 数据库管理基础 II A-63


练习 17 答案(续)
10. 使用 RMAN,确认已将数据文件添加到恢复目录中。
RMAN> list copy;
List of Datafile Copies
Key File S Completion CkpSC Ckp time Name
------- ---- - ---------- ----- --------- ------------------
163 1 A 21-MAR-01 66107 21-MAR-01 /…/BACKUP/…
168 6 A 23-MAR-01 90320 23-MAR-01 /…/BACKUP/…
165 6 A 23-MAR-01 88207 23-MAR-01 /…/BACKUP/sample01.cpy
11. 使用 RMAN 命令从恢复目录中删除 SAMPLE 表空间数据文件的备份。切勿从操作系
统中删除该文件。
RMAN> CHANGE DATAFILECOPY
2> ‘$HOME/BACKUP/sample01.cpy'
3> UNCATALOG;
uncataloged datafile copy datafile copy
filename=/databases/db01/BACKUP/sample01.cpy recid=4 stamp=4251353
12. 使用 SQL*Plus 连接到恢复目录数据库并查询 RC_DATAFILE_COPY 视图,以确认已
从恢复目录中删除了该数据文件。
$ sqlplus rcuser/rcuser@<service name>;
SQL> SELECT name, db_name, file#
2> FROM rc_datafile_copy;
NAME DB_NAME FILE#
-------------------------------------------- ------- -----
/databases/db01/BACKUP/RMAN/sys0101.cpy UNKNOWN 1
/databases/db01/BACKUP/RMAN/sample01.dbf DB01 6

Oracle9i 数据库管理基础 II A-64


练习 17 答案(续)
13. 创建一个脚本以制作一份带有下列信息的整体数据库备份:
Name of script: nightback
Channel name: dbnD (n is the student account number)
Channel type Disk
Format $HOME/BACKUP/RMAN/%b%d%s%p
Level Database (No archivelogs)
tag nback
DO NOT RUN THIS SCRIPT NOW.
RMAN> CREATE SCRIPT nightback {
2> allocate channel db01D type disk;
3> backup format '$HOME/BACKUP/RMAN/%d%s%p'
4> (database);
5> release channel db01D;
6> }
created script nightback
14. 使用 PRINT 命令查询恢复目录,并验证是否创建了脚本。
RMAN> PRINT SCRIPT nightback;
printing stored script: nightback
{
allocate channel db01D type disk;
backup format '$HOME/BACKUP/RMAN/%d%s%p'
(database);
release channel db01D;
}

Oracle9i 数据库管理基础 II A-65


练习 18 答案
1. 调用导出实用程序以导出 HR 方案中的 EMPLOYEES 和 DEPARTMENTS 表。
使用 Export 命令模式解答
$ exp hr/hr file=$HOME/BACKUP/export.dmp
tables=employees,departments
Export: Release 9.0.0.0.0 - Beta on Thu Mar 29 12:48:25 2001
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to: Oracle9i Enterprise Edition Release 9.0.0.0.0 With
the Partitioning option
JServer Release 9.0.0.0.0 - Beta
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
About to export specified tables via Conventional Path ...
. . exporting table EMPLOYEES 107 rows exported
EXP-00091: Exporting questionable statistics.
. . exporting table DEPARTMENTS 27 rows exported
EXP-00091: Exporting questionable statistics.
Export terminated successfully without warnings.
使用 Oracle Enterprise Manager 解答
使用 “导出向导” (Export Wizard) 导出表:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “数据管理” ( Data
Management) > “导出” (Export)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “导出文件” (Export File) 页:在 “文件名” (File Name) 字段中更改路径。单击
“下一步” (Next)。
d. “导出类型” (Export Type) 页:选择 “表” (Table)。单击 “下一步” (Next)。
e. “表选择” (Table Selection) 页:选择所需的表。单击 “下一步” (Next)。
f. “关联对象” (Associated Objects) 页:选择给出的所有选项。单击 “下一步”
(Next)。
g. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
h. “作业信息” (Job Information) 页:提供作业名称。单击 “完成” (Finish)。
i. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。

Oracle9i 数据库管理基础 II A-66


练习 18 答案(续)
2. 以 HR 的身份进行连接,并删除 EMPLOYEES 和 DEPARTMENTS 表。
SQL>connect hr/hr
SQL> drop table employees cascade constraints;
Table dropped.
SQL> drop table departments cascade constraints;
Table dropped.

Oracle9i 数据库管理基础 II A-67


练习 18 答案(续)
3. 使用导入实用程序还原 EMPLOYEES 和 DEPARTMENTS 表。
使用 Import 命令模式解答
$ imp hr/hr file=$HOME/BACKUP/export.dmp
TABLES=employees,departments
Import: Release 9.0.0.0.0 - Beta on Thu Mar 29 20:57:30
Connected to: Oracle9i Enterprise Edition Release 9.0.0.0.0
With the Partitioning option
JServer Release 9.0.0.0.0 - Beta
Export file created by EXPORT:V09.00 via conventional path
Import in US7ASCII and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P1 character set
importing SYSTEM's objects into SYSTEM
. . importing table “EMPLOYEES" 107 rows imported
. . importing table "DEPARTMENTS" 27 rows imported
About to enable constraints...
Import terminated successfully without warnings
使用 Oracle Enterprise Manager 解答
使用 “导入向导” (Import Wizard) 导入表:
a. 选择 “工具” (Tools) > “数据库向导” (Database Wizards) > “数据管理” (Data
Management) > “导入” (Import)
b. “简介” (Introduction) 页:单击 “下一步” (Next)。
c. “导入文件” (Import File) 页:在 “文件名” (File Name) 字段中更改路径。单击
“下一步” (Next)。
d. “导入类型” (Import Type) 页:选择 “整个文件” (Entire File)。单击 “下一步”
(Next)。
e. “关联对象” (Associated Objects) 页:选择给出的所有选项。单击 “下一步”
(Next)。
f. “调度” (Schedule) 页:选择 “立即” (Immediately)。单击 “下一步” (Next)。
g. “作业信息” (Job Information) 页:提供作业名称。单击 “完成” (Finish)。
h. “概要” (Summary) 页:单击 “确定” (OK)。此时,就会将作业提交到 Oracle
Enterprise Manager 作业系统。

Oracle9i 数据库管理基础 II A-68


练习 18 答案(续)
4. 查询 EMPLOYEES 和 DEPARTMENTS 表以确定每个表的行数。
SQL> select count(*) from employees;
COUNT(*)
--------
107
SQL> select count(*) from departments;
COUNT(*)
--------
27

Oracle9i 数据库管理基础 II A-69


Oracle9i 数据库管理基础 II A-70
B

专题讨论中
出现的情况
网络专题讨论中出现的情况
情况 1:TNSNAMES.ORA 中的端口已损坏
情况 2:TNSNAMES.ORA 中 “CONNECT_DATA” 的标点符号不正确
情况 3:TNSNAMES.ORA 中存在 PROTOCOL 错误
情况 4:TNSNAMES.ORA 中存在 SERVICE_NAME 错误
情况 5:SQLNET.ORA 中 NAMES.DIRECTORY_PATH 的值不正确
情况 6:LISTENER.ORA 的监听程序定义中存在 PORT 错误
情况 7:LISTENER.ORA 的 SID_LIST 中存在 LISTENER 错误
情况 8:LISTENER.ORA 中的监听程序名称存在错误

Oracle9i 数据库管理基础 II B-2


情况 1:TNSNAMES.ORA 中的端口 “被破坏”
解决方案提纲
以下脚本在 TNSNAMES.ORA 中使用 17DD 替换原端口号,因此 “破坏” 了该端口。请使用
原先分配的端口号替换 17DD。
U01.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02.world)(PORT = 17DD))
...

Oracle9i 数据库管理基础 II B-3


情况 2:TNSNAMES.ORA 中 “CONNECT_DATA” 的标点符号不正确
解决方案提纲
在该情况中,TNSNAMES.ORA 中的标点符号 “遭破坏”。“CONNECT_DATA” 之前的那个左
括号被删除。请添加所缺失的左括号。
ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02)(PORT = 1701))
)
CONNECT_DATA = {添加左括号:(CONNECT_DATA }
(SERVICE_NAME = U01.world)
...

Oracle9i 数据库管理基础 II B-4


情况 3:TNSNAMES.ORA 中存在 PROTOCOL 错误
解决方案提纲
(netbrk_3.sh) 在该情况中,tnsnames.ora 中发生了 PROTOCOL 错误(删除了
TCP)。请在 PROTOCOL 参数定义中添加 TCP。
U01.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = )(HOST = stc-sun02)(PORT = 1701))
应为:(PROTOCOL = TCP)
...

Oracle9i 数据库管理基础 II B-5


情况 4:TNSNAMES.ORA 中存在 SERVICE_NAME 错误
解决方案提纲
在该情况中,TNSNAMES.ORA 中的 SERVICE_NAME 行被注释掉。
请取消该行的注释状态。
U01.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = )(HOST = stc-sun02)(PORT = 1701))
)
(CONNECT_DATA =
# (SERVVICE_NAME = U01.world)
...

Oracle9i 数据库管理基础 II B-6


情况 5:SQLNET.ORA 中 NAMES.DIRECTORY_PATH 的值不正确
解决方案提纲
在该情况中,SQLNET.ORA 中的 NAMES.DIRECTORY_PATH 从 TNSNAMES 更改为
NAMES。请使用 (TNSNAMES) 替换 (NAMES)。
NAMES.DEFAULT_DOMAIN = world
NAMES.DIRECTORY_PATH= (NAMES)
应为 (TNAMAMES)
...

Oracle9i 数据库管理基础 II B-7


情况 6:LISTENER.ORA 的监听程序定义中存在 PORT 错误
解决方案提纲
在该情况中,LISTENER.ORA 的监听程序定义中的 PORT 发生了拼写错误。请将其更改
为 “PORT”。
LISTENER01=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02)(PRT = 1701))
应为 (PORT =
...

Oracle9i 数据库管理基础 II B-8


情况 7:LISTENER.ORA 的 SID_LIST 中存在 LISTENER 错误
解决方案提纲
在该情况中,LISTENER.ORA 中 SID_LIST_LISTENER 的 LISTENER 发生拼写错误。
请在 LISENER 中添加 T
SID_LIST_LISENER01 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = U01.world)
...

Oracle9i 数据库管理基础 II B-9


情况 8:LISTENER.ORA 中的监听程序名称存在错误
解决方案提纲
在该情况中,LISTENER.ORA 中的监听程序名称被更改为 LISTENERX。
请将其更改为您所使用的监听程序的名称。
LISTENERX=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = stc-sun02)(PORT = 1701))
)

Oracle9i 数据库管理基础 II B-10


备份和恢复专题讨论中的情况
情况 1:INACTIVE 联机重做日志组丢失
情况 2:CURRENT 联机重做日志组丢失
情况 3:控制文件丢失
情况 4:介质丢失
情况 5:联机还原段数据文件丢失(打开的或关闭的数据库)
情况 6:系统表空间数据文件丢失
情况 7:非系统、非回退段的数据文件丢失
情况 8:从用户错误中恢复
情况 9:联机备份时失败
情况 10:丢失数据文件
情况 11:数据文件丢失并缺失归档日志文件
情况 12:当数据库关闭时次要数据文件丢失
情况 13:在没有备份的情况下恢复丢失的数据文件
情况 14:丢失镜像联机重做日志文件
情况 15:控制文件和只读表空间丢失

Oracle9i 数据库管理基础 II B-11


情况 1:INACTIVE 联机重做日志组丢失
解决方案提纲
1. 关闭例程。
2. 装载数据库。
3. 检查 V$LOG 视图以确定该文件是否已归档。
4. 检查 V$DATAFILE 以确定是否存在符合以下条件的数据文件:该数据文件处于脱机
状态,并且需要使用未归档的日志来进行联机。发出 ALTER DATABASE CLEAR
LOGFILE 命令;关键字 UNRECOVERABLE DATAFILE 是必不可少的。必须将该数
据文件及其整个表空间从数据库中删除,因为使其联机时所需的重做日志即将被清
除掉,且不存在它的副本。
5. 使用 “数据库配置核对清单” 中记录的信息添加一个新的重做日志组,如下所示:
ALTER DATABASE ADD LOGFILE GROUP 3
‘$HOME/ORADATA/u03/log03a.rdo’ SIZE 2M
6. 删除损坏的重做日志文件组:
SQL>ALTER DATABASE DROP LOGFILE GROUP n ; 其中,n 是相应的组号
7. 在日志文件组 3 中添加成员:
ALTER DATABASE ADD LOGFILE MEMBER
‘$HOME/ORADATA/u04/log03b.rdo’ TO GROUP 3;
8. 确定是否需要完全脱机备份,如需要则进行。
9. 确保例程已启动,而且数据库已打开。
10. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-12


情况 2:CURRENT 联机重做日志组丢失
解决方案提纲
1. 必要时启动例程。
2. 尝试更改数据库并删除重做日志组。您将收到一条错误消息,指明您不能删除当前
的重做日志。
3. 关闭例程。
4. 查看 alert.log 文件和所有相关的跟踪文件。
5. 将所有数据文件和丢失的重做日志文件从备份目录复制到各自的 un 目录下。
6. 装载数据库。
7. 查询 V$LOG 视图以确定 CURRENT 日志组的序列号。
8. 发出 ARCHIVE LOG LIST 命令。
9. 使用 CANCEL 选项恢复数据库。当提示使用当前日志时,取消恢复操作。
10. 恢复完成后,使用 RESETLOGS 选项打开数据库。
11. 查看 alert.log 文件以了解所应用的恢复情况。
12. 确定是否需要完全脱机备份,如需要则进行。从 ARCHIVE1 和 ARCHIVE2 目录中
删除归档重做日志文件。
13. 从 $HOME/ADMIN/BDUMP 目录中删除 alert.log 文件和跟踪文件。
14. 确保例程已启动,而且数据库已打开。
15. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-13


情况 3:控制文件丢失
解决方案提纲
1. 必要时启动例程。
2. 如果启动失败,关闭例程。
3. 登录到 SQL*Plus 并以 Nomount 模式启动例程。
4. 运行跟踪文件脚本以重新创建控制文件。
5. 确定是否需要完全脱机备份,如需要则进行。
6. 确保例程已启动,而且数据库已打开。
7. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-14


情况 4:介质丢失
解决方案提纲
1. 装载数据库。
2. 确定哪些文件需要使用 V$RECOVER_FILE 和 V$DATAFILE 进行恢复。
3. 使用 ALTER DATABASE DATAFILE OFFLINE 命令使数据文件脱机,以便能够打
开数据库。
4. 打开数据库后,立即发出 ALTER TABLESPACE <tablespace_name> OFFLINE
IMMEDIATE 命令。将丢失的文件从备份目录还原到另一个可用设备上(un 目录)。
5. 重命名文件以便将所做的更改记录到控制文件中。
6. 发出 RECOVER DATAFILE 命令单独恢复每个数据文件。或者,如果涉及表空间的
所有文件,则使用下列命令:
’RECOVER TABLESPACE <tablespace_name>’ 以恢复某一特定表空间的所有
数据文件。
7. 恢复文件后,使表空间联机。
8. 查询 V$DATAFILE 视图以检查文件的状态。
9. 查询 V$RECOVER_FILE 视图以检查受损文件的状态。
10. 在 $HOME 目录下创建之前被删除的子目录,如下所示:
mkdir $HOME/ORADATA/un
此外,切记要发出 chmod 775 $HOME/DATA/un 命令,为 Oracle 设置写入该目录
的正确权限
11. 使表空间脱机并在数据文件的原始位置处为这些数据文件创建一份物理副本。
12.使用 ALTER DATABASE RENAME FILE 命令将结构方面的更改记录到控制文件中。
13. 使表空间联机。
14. 确保例程已启动,而且数据库已打开。
15. 确定是否需要完全脱机备份,如需要则进行。
16. 运行 moreemphist.sql 脚本。
若要了解更多信息,请参阅以下出版物:
• Oracle9i Server Administrator’s Guide
• Oracle9i SQL Reference Manual
• 附录 C 中的公告板 1012943.6

Oracle9i 数据库管理基础 II B-15


情况 5:包含联机还原段的文件丢失
解决方案提纲
1. 启动例程。
2. 如果接收到错误,则关闭例程。
3. 还原数据文件。
4. 使用 Mount 选项装载数据库。
5. 执行数据库恢复,直至您收到消息:“介质恢复完成”。
6. 确定是否需要完全脱机备份,如需要则进行。
7. 打开数据库。
8. 确保例程已启动,而且数据库已打开。
9. 运行 moreemphist.sql 脚本。
回退段的解决方案提纲
1. 启动例程。如果接收到错误,则查看 alert.log 文件和所有跟踪文件。
2. 参考下面所列出的公告板,以了解如何解决恢复回退段数据文件时所遇到的问题。
3. 确定是否需要完全脱机备份,如需要则进行。
4. 确保例程已启动,而且数据库已打开。
5. 运行 moreemphist.sql 脚本。
若要了解更多信息,请参阅:
• 附录 C 中的公告板 1013221.6

Oracle9i 数据库管理基础 II B-16


情况 6:系统表空间数据文件丢失
解决方案提纲
1. 启动例程。
2. 如果接收到错误,则关闭例程。
3. 还原属于 SYSTEM 表空间的数据文件。
4. 使用 Mount 选项装载数据库。
5. 执行数据库恢复,直至您收到消息:“介质恢复完成”。
6. 确定是否需要完全脱机备份,如需要则进行。
7. 打开数据库。
8. 确保例程已启动,而且数据库已打开。
9. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-17


情况 7:非系统、非回退段的数据文件丢失
解决方案提纲
1. 必要时启动例程。
2. 查询 V$RECOVER_FILE。
3. 使丢失的数据文件脱机。
4. 打开数据库。
5. 还原数据文件。
6. 恢复数据文件。
7. 使数据文件联机。
8. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-18


情况 8:从用户错误中恢复
解决方案提纲
1. 对此类故障,有三种恢复方案。但是,切记!确定使用何种恢复方法时,目标是最
大程度地减少关机时间和数据损失。
a. 您可以使用时间点恢复来还原整个数据库,这意味着您将丢失在所恢复到的时
间点以后发生的所有事务处理。
b. 可以在其它位置还原数据库、导出表,然后将该单个的表导入主数据库。
c. 从导出文件还原表。
2. 确保例程已启动,而且数据库已打开。
3. 确定是否需要完全脱机备份,如需要则进行。
4. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-19


情况 9:联机备份时失败
解决方案提纲
1. 装载数据库。
2. 查询视图 V$RECOVER_FILE。
3. 查询视图 V$BACKUP。
4. 确定数据库崩溃时哪些文件处于备份模式。
5. 使数据文件脱离备份模式:
ALTER DATABASE DATAFILE ’file_name’ END BACKUP; 或者,
为了加快恢复速度,只需发出以下命令:
ALTER DATABASE END BACKUP;
6. 打开数据库。
7. 查询 V$RECOVER_FILE、V$BACKUP 和 V$DATAFILE 等视图。
8. 确定是否需要完全脱机备份,如需要则进行。
9. 确保例程已启动,而且数据库已打开。
10. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-20


情况 10:数据文件丢失
解决方案提纲
1. 根据所附的公告板提供的方法执行恢复操作。
2. 确定是否需要完全脱机备份,如需要则进行。
3. 确保例程已启动,而且数据库已打开。
4. 运行 moreemp.sql 脚本。
若要了解更多信息,请参阅以下出版物:
• Oracle9i Server Administrator’s Guide
• Oracle9i SQL Reference Manual
• 附录 C 中的公告板 1005254.6

Oracle9i 数据库管理基础 II B-21


情况 11:数据文件丢失并缺失归档日志文件
解决方案提纲
1. 将数据文件还原到正确的目录。
2. 启动例程并装载数据库。
3. 开始恢复数据库。您将发现丢失了归档的日志文件。
4. 关闭例程。
5. 确定丢失了哪些归档重做日志文件。查看 V$RECOVERY_LOG 以获取归档信息并检
查 LOG_ARCHIVE_DEST_n 目录。
6. 从 $HOME/BACKUP 目录还原所有数据文件。务必保留当前的控制文件。
7. 执行基于取消的恢复,即在适当的时候取消恢复操作。
8. 使用 RESETLOGS 选项打开数据库。
9. 执行完全脱机备份并删除不再需要的归档重做日志文件。
10. 确保例程已启动,而且数据库已打开。
11. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-22


情况 12:当数据库关闭时次要数据文件丢失
解决方案提纲
1. 必要时启动例程。
2. 如果接收到错误,则关闭例程。
3. 装载数据库。
4. 打开数据库。
5. 查询 V$RECOVER_FILE 视图并记下文件名。
6. 更改数据库使文件脱机并将它删除。
7. 打开数据库。
8. 删除 INDX 表空间。
9. 使用步骤 5 中所记下的那个文件名来创建大小为 500K 的 INDX 表空间,并使用
“重新使用”(reuse)选项。
10. 运行 $HOME/STUDENT/LABS/index.sql 脚本。
11. 确定是否需要完全脱机备份,如需要则进行。
12. 确保例程已启动,而且数据库已打开。
13. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-23


情况 13:在没有备份的情况下恢复丢失的数据文件
解决方案提纲
1. 使用 Mount 命令装载数据库。
2. 查询 V$RECOVER_FILE 视图。
3. 查询 V$DATAFILE 视图。
4. 更改数据库并创建作为新文件规范 (filespec) 的新数据文件。文件名为
$HOME/ORADATA/u06/new01.dbf,大小为 500K。
5. 恢复数据文件。
6. 打开数据库。
7. 查询 V$RECOVER_FILE 视图。
8. 查询 V$DATAFILE 视图。
9. 确定是否需要完全脱机备份,如需要则进行。
10. 确保例程已启动,而且数据库已打开。
11. 验证 HR.NEW_EMPHIST 表存在。

Oracle9i 数据库管理基础 II B-24


情况 14:丢失镜像联机重做日志文件
解决方案提纲
1. 必要时启动例程。
2. 查看 alert.log 文件和跟踪文件,了解是否存在异常情况。
3. 查询 V$LOGFILE 视图。
4. 切换日志文件,然后查询 V$LOGFILE 视图。只有镜像的重做日志文件已损坏。
5. 通过添加新的重做日志文件来更正该问题,添加文件时使用 “数据库配置核对清
单” 中的命名约定。
6. 确定是否需要完全脱机备份,如需要则进行。
7. 确保例程已启动,而且数据库已打开。
8. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-25


情况 15:控制文件和只读表空间丢失
解决方案提纲
1. 必要时启动例程。
2. 如果接收到错误,则关闭例程。
3. 查看 alert.log 文件。
4. 从备份中还原丢失的数据文件和控制文件。
5. 装载数据库。
6. 使用 BACKUP CONTROLFILE 选项恢复数据库。(最好应用其中一个联机重做日
志文件。)
7. 使用 RESETLOGS 选项打开数据库。
8. 将 QUERY_DATA 表空间置于 READ ONLY 模式。
9. 确定是否需要完全脱机备份,如需要则进行。
10. 确保例程已启动,而且数据库已打开。
11. 运行 moreemphist.sql 脚本。

Oracle9i 数据库管理基础 II B-26


全球支持公告板

Copyright © Oracle Corporation, 2001. All rights reserved.


公告板 1005254.6
ORA-01157 或 ORA-07368:无法启动数据库 - 数据文件丢失
问题描述:如果从操作系统目录物理删除文件,当数据库正在运行或 DBA 尝试启动数据
库时,您可能会收到错误消息。
问题说明:成功装载数据库之后,Oracle 服务器会检验控制文件中注册的每个数据文件是
否存在及其一致性。如果文件损坏或意外删除,将出现如下错误:
ORA-01157: cannot identify datafile %n - file not found
ORA-01110: datafile %n: ’%s’
尝试执行正常关机或 DBWR 试图对正在删除的文件进行写操作时,还可能出现下列错误:
ORA-01116: error in opening database file %n
ORA-01110: datafile %n: ’%s’
ORA-07368: sfofi: open error, unable to open database file.
这些错误还伴随有特定于操作系统的错误(例如,在多数 UNIX 平台上会出现错误号2)。
解决方案描述
警告:只有在被删除的数据文件不属于系统表空间或回退表空间时,方可使用此解决方案。
如果文件属于系统表空间或回退表空间,请与 Oracle 客户支持联系。
在许多情况下,DBA 会由于疏忽而从文件目录中删除数据文件,DBA 这样做可能基于一
种错误的假定,认为一旦删除该文件,Oracle 服务器对其的所有引用都将被删除。也可能
是源于这样一个事实,即由于操作系统错误或硬件问题导致该文件不可读或无法访问。
如果 Oracle 服务器无法访问该文件,DBWR 可能会强制数据文件脱机,在这种情况下,
尝试使用任一方法访问数据文件时,都将收到如下错误消息:
ORA-01135, 00000, ”file %s accessed for DML/query is offline”
// *Cause: Attempted to access a datafile that is offline
// *Action: Bring the datafile back online

Oracle9i 数据库管理基础 II C-2


公告板 1005254.6(续)
无论是哪种情况,最简单的方法是删除包含该数据文件的整个表空间。在 SQL*Plus
中执行下列步骤:
1. STARTUP MOUNT
2. 对每个被删除的数据文件发出以下命令
ALTER DATABASE DATAFILE ’full path of filename’ OFFLINE
[DROP];
注:如果数据库处于 NOARCHIVELOG 模式,则必须使用 DROP 选项,因为,
如果通过命令 ALTER DATABASE OPEN RESETLOGS 应用了不完整的介质
恢复,将无法恢复该文件。请参阅 SQL Reference 以获取详细信息。
3. ALTER DATABASE OPEN;
4. DROP TABLESPACE <tablespace> INCLUDING CONTENTS [CASCADE
CONSTRAINTS];

Oracle9i 数据库管理基础 II C-3


公告板 1012943.6
ORA-1113 文件需要介质恢复
问题描述:只要有一个数据文件与数据库中的其它数据文件不同步,即出现 ORA-1113
错误消息:
01113, 00000, ”file %s needs media recovery”
// *Cause: An attempt was made to online or open a database //
with a file that is in need of media recovery.
// *Action: First apply media recovery to the file.
通常,ORA-1113 与 ORA-1110 一起出现。ORA-1113 最常见的情况为:
1. 启动时(通常后随 ORA-1110)
– 数据文件的表空间处于热备份模式时,数据库崩溃或以 ABORT 模式关闭,
或者计算机被重新引导。启动时,您将收到 ORA-1113 错误消息。
– 您试图打开包含旧版本数据文件的数据库,而该数据文件是从没有事先更新
的备份中还原的。
2. 尝试将数据文件联机。尝试将脱机的数据文件恢复到联机状态时,将接收到 ORA-
1113 错误消息。
问题说明:当数据库打开时或在检查点结束时,所有的数据库文件、数据文件、重做日
志文件以及控制文件必须保持同步,从这一点来说,Oracle 的体系结构结合得十分
紧密。这表示所有数据文件的检查点系统提交号 (SCN) 必须相同。如果某个特定数
据文件的 SCN 不同,将生成 ORA-1113 消息。例如,将表空间置于热备份模式时,
其所有数据文件的检查点 SCN 将在当前值处冻结,直至您发出相应的结束备份命令。
如果数据库在热备份过程中崩溃,而您尝试不进行恢复就重新启动它,则对于正在
备份的表空间中的至少一个数据文件,您将收到 ORA-1113 错误消息,因为该数据
文件的 SCN 可能小于控制文件或其它表空间中数据文件的 SCN。同样,将数据文
件脱机会使其检查点 SCN 冻结。如果仅希望使文件联机而不先进行恢复,其 SCN
可能比联机数据文件的 SCN 旧,从而导致出现 ORA-1113 错误消息。

Oracle9i 数据库管理基础 II C-4


公告板 1012943.6(续)
解决方案描述:解决 ORA-1113 错误的方法是对有问题的文件使用 RECOVER
DATAFILE 命令执行介质恢复。如果您确知表空间中的多数或所有文件需要恢复,并
且数据库已打开,可使用 RECOVER TABLESPACE 命令。如果大量的表空间需要恢
复,则在已装载数据库的情况下使用 RECOVER DATABASE 命令。
根据情况的不同,所采取的方法也略有不同。
解决方案说明 从查询 V$LOG 和 V$LOGFILE 开始。如果数据库已关闭,则必须先装
载它。发出以下查询:
SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的联机重做日志文件以及各自的序列号和首次更改号。
以下执行的步骤将取决于出现 ORA-1113 的情况:
1. 在进行热备份的表空间崩溃后启动时
a. 使用 Oracle 7.1 或更低版本
i. 装载数据库。
ii. 对数据库应用介质恢复。
RECOVER DATABASE
iii. 对提示您进行确认的每个归档日志进行确认,直至您收到 “介质恢复完成”
的消息为止。如果所提示的归档日志并不存在,则说明 Oracle 服务器可能
需要一个或多个联机日志以继续进行恢复。将 ORA-280 消息中引用的序列
号与您的联机日志序列号进行比较。然后输入重做组中某成员的完整路径
名,其序列号应与要求的序列号相匹配。继续按照请求输入联机日志,直
到您收到 “介质恢复完成” 的消息为止。
iv. 打开数据库。
b. 使用 Oracle 7.2 或更高版本
i. 装载数据库。
ii. 查找当数据库崩溃或以 ABORT 模式关闭、或者计算机被重新引导时哪些
数据文件正处于热备份模式,具体方法是运行以下查询:
SELECT V1.FILE#, NAME
FROM V$BACKUP V1, V$DATAFILE V2
WHERE V1.STATUS = ’ACTIVE’ AND V1.FILE# = V2.FILE# ;
iii. 对于上述查询返回的每个文件,发出如下命令:
ALTER DATABASE DATAFILE ’<full path name>’ END BACKUP;
iv. 打开数据库。

Oracle9i 数据库管理基础 II C-5


公告板 1012943.6(续)
2. 从备份还原数据文件或表空间后启动时
a. 数据库处于 ARCHIVELOG 模式
i. 装载数据库。
ii. 恢复数据文件:
RECOVER DATAFILE ’<full path name>’
如果要恢复多个数据文件,则发出以下命令:
RECOVER DATABASE
iii. 对提示您进行确认的每个归档日志进行确认,直至您收到 “介质恢复完成”
的消息为止。如果所提示的归档日志并不存在,则说明 Oracle 服务器可能
需要一个或多个联机日志以继续进行恢复。将 ORA-280 消息中引用的序列
号与您的联机日志序列号进行比较。然后输入重做组中某成员的完整路径
名,其序列号应与要求的序列号相匹配。继续按照请求输入联机日志,直
到您收到 “介质恢复完成” 的消息为止。
iv. 打开数据库。
b. 数据库处于 NOARCHIVELOG 模式
在这种情况下,仅当要对数据文件或表空间应用的重做操作在联机日志的范
围之内时,才能成功地这些恢复数据文件或表空间。发出以下查询:
SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
将您获得的更改号与联机日志的 FIRST_CHANGE# 相比较。
如果该 CHANGE# 大于日志的 FIRST_CHANGE# 的最小值,则可以恢复该
数据文件。在这种情况下,要执行的过程与上述 II.A 情况下的过程类似,
不同的是,当出现提示时,您必须总是输入相应的联机日志,直至恢复完
成。
如果该 CHANGE# 小于日志的 FIRST_CHANGE# 的最小值,则该文件无法
恢复。此时,您有以下几种选择:
– 如果数据文件在临时表空间或索引表空间内,您可以使用 ALTER
DATABASE DATAFILE ‘<完整路径名>’ OFFLINE DROP 语句将其删除,然
后打开数据库。打开数据库后,您必须立即删除该数据文件所属的那个表空
间,然后重新创建它。
– 如果数据文件在 SYSTEM 表空间或回退表空间中,则还原该数据文件的最新
副本(如果有)或还原您最近所创建的完整备份。如果找不到一个完整而又
连续的备份,请与 Oracle 客户支持联系。
– 对此情况中的其它情形,您必须根据上述两种情况来权衡使用备份所涉及的
成本与重新创建表空间所涉及的成本。为获取详细信息或帮助您作出决定,
请与 Oracle 客户支持联系。

Oracle9i 数据库管理基础 II C-6


公告板 1012943.6(续)
3. 尝试将数据文件或表空间联机
a. 恢复数据文件:
RECOVER DATAFILE ’<full path name>’
如果要恢复表空间,请执行以下语句:
RECOVER TABLESPACE <tablespace>
b. 对提示您进行确认的每个归档日志进行确认,直至您收到 “介质恢复完成”
的消息为止。如果所提示的归档日志并不存在,则说明 Oracle 服务器可能
需要一个或多个联机日志以继续进行恢复。将 ORA-280 消息中引用的序列
号与您的联机日志序列号进行比较。然后输入重做组中某成员的完整路径
名,其序列号应与要求的序列号相匹配。继续按照请求输入联机日志,直
到您收到 “介质恢复完成” 的消息为止。

Oracle9i 数据库管理基础 II C-7


公告板 1013221.6
恢复回退表空间中丢失的数据文件
问题描述:这是一种恢复情况,其中,回退段表空间中某个数据文件已丢失或已损坏到
Oracle 服务器无法识别的程度。如果尝试启动数据库,将导致 ORA-1157、ORA-1110 错
误,甚至还可能导致操作系统级别的错误(如 ORA-7360)。如果尝试以 “正常” 或 “立即”
模式关闭数据库,将导致 ORA-1116、ORA-1110 错误,甚至还可能导致操作系统级别的
错误(如 ORA-7368)。
警告:这些简略步骤只有在 Oracle 全球支持系统的协助下才能使用。其中包括了对参数
_corrupted_rollback_segments 的使用,该参数将要求您重建数据库。在使用此参数之前请
先试试所有其它选项,看它们是否可用。
解决方案描述:进行这种恢复时要格外小心。如果遇到问题或需要帮助,请与 Oracle 客
户支持联系。
解决此问题的关键在于确保回退段中活动的事务处理没有丢失。
解决方案说明:此方法取决于是在什么具体情况下检测到回退数据文件丢失的。

Oracle9i 数据库管理基础 II C-8


公告板 1013221.6(续)
数据库已关闭
如果尝试启动数据库,将导致 ORA-1157 和 ORA-1110 错误。
此处的解决方案取决于数据库是否已彻底关闭。
数据库已彻底地关闭:如果您确信数据库已彻底关闭,即,使用 NORMAL 或
IMMEDIATE 模式关闭数据库,则最简单的解决方案是使丢失的数据文件脱机、以受限模
式打开数据库,然后删除并重新创建该文件所属的回退表空间。如果数据库是以 ABORT
模式关闭的或如果数据库已崩溃,请不要执行此过程。
这些步骤是:
1. 确保数据库上次已彻底关闭。
检查该例程的 alert.log 文件。转到文件结尾,确保上次关闭数据库时收到了下
列消息:
”alter database dismount
Completed: alter database dismount”
这也包括此类情况:彻底关闭数据库后,重新启动数据库失败。在这种情况下,
Oracle 服务器将发出错误消息并以中止模式自行关闭。就该解决方案的的而言,
这也可称为彻底关闭。
如果不是这种情况,即上次是以 ABORT 模式关闭数据库的,或数据库本身崩
溃,则继续进行操作是不安全的。您应该按照以下适合于 I.B 情况的指导操作。
2. 从该例程的 init.ora 文件的 ROLLBACK_SEGMENTS 参数中,删除丢失的数
据文件所属的那个表空间中的所有回退段。如果您不确信哪些回退段位于该表
空间中,只需注释掉整个 ROLLBACK_SEGMENTS 条目即可。
3. 按受限模式装载数据库。
STARTUP RESTRICT MOUNT
4. 脱机删除丢失的数据文件。
ALTER DATABASE DATAFILE ’<full_path_file_name>’ OFFLINE DROP;
5. 打开数据库。
ALTER DATABASE OPEN
如果接收到消息 “语句已处理”,请转到第 7 步。
反之,如果接收到 ORA-604、ORA-376 和 ORA-1110 错误,请转到第 6 步。

Oracle9i 数据库管理基础 II C-9


公告板 1013221.6(续)
6. 由于打开数据库失败,关闭数据库并编辑该例程的 init.ora 文件。
注释掉 ROLLBACK_SEGMENTS 参数并添加如下行:
_corrupted_rollback_segments = ( <rollback1>,....,
<rollbackN> )
例如,上面的列表应包括最初列在 ROLLBACK_SEGMENTS 参数中的所有回退段。
只有在此特定情况下或在 Oracle 客户支持的指导下方可使用此参数,然后以受
限模式启动数据库:
STARTUP RESTRICT
7. 删除该数据文件所属的回退表空间。
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;
8. 使用回退段重新创建回退表空间。记住,创建完毕使回退表空间联机。
9. 使数据库可供所有用户使用。
ALTER SYSTEM DISABLE RESTRICTED SESSION;
10. 使该例程的 init.ora 文件的 ROLLBACK_SEGMENTS 参数重新包括刚创建的回退
表空间。如果您以前已注释掉整个 ROLLBACK_SEGMENTS 条目,现在只需取消注释
即可。如果以前您不得不执行到第 6 步,则现在可删除损坏的
ROLLBACK_SEGMENTS 参数。

Oracle9i 数据库管理基础 II C-10


公告板 1013221.6(续)
数据库未彻底关闭:出现这种情况表明数据库上次是以 ABORT 或 CRASHED 模式关闭的。
在这种情况下,几乎可以肯定一点,即如果回退段中某些区位于丢失的数据文件中,则这
些回退段仍包含活动的事务处理。因此,该文件不能被删除或脱机。必须从备份中还原丢
失的数据文件并对其应用介质恢复。如果数据库处于 NOARCHIVELOG 模式,则仅当所
要应用的重做操作位于联机日志的范围之内时,您才能成功地恢复该数据文件。如果找不
到该数据文件的备份,请与 Oracle 客户支持联系。
步骤如下:
1. 从备份还原丢失的文件。
2. 装载数据库。
3. 发出以下查询:
SELECT FILE#, NAME, STATUS FROM V$DATAFILE;
如果刚还原的文件状态为 OFFLINE,继续之前,必须使该文件联机:
ALTER DATABASE DATAFILE ’<full_path_file_name>’ ONLINE;
4. 发出以下查询:
SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的联机重做日志文件以及它们各自的序列号和首次更改号。
5. 如果数据库处于 NOARCHIVELOG 模式,发出查询:
SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
如果该 CHANGE# 大于日志的 FIRST_CHANGE# 的最小值,则数据文件可以恢
复。请记住,要应用的所有日志都将是联机日志,然后转至第 6 步。
如果该 CHANGE# 小于日志的 FIRST_CHANGE# 的最小值,则文件无法恢复。此
时,您面临的选择有:还原完整的备份(如果有);或强制数据库在不一致的状态
下打开以将其完整地导出。为获取详细信息并帮助您作出决定,请与 Oracle 客户支
持联系。
6. 恢复数据文件:
RECOVER DATAFILE ’<full_path_file_name>’
7. 对提示您进行确认的每个日志进行确认,直至您收到 “介质恢复完成” 的消息为止。
如果所提示的归档日志并不存在,则 Oracle 服务器可能需要一个或多个联机日志以
继续进行恢复。将 ORA-280 消息中引用的序列号与您的联机日志序列号进行比较。
然后输入重做组中某成员的完整路径名,其序列号应与要求的序列号相匹配。继续
按照请求输入联机日志,直到您收到 “介质恢复完成” 的消息为止。
8. 打开数据库。

Oracle9i 数据库管理基础 II C-11


公告板 1013221.6(续)
数据库已打开
如果检测到回退数据文件已丢失,而数据库仍打开且正在运行,则不要关闭数据库。在多
数情况下,在数据库打开时解决此问题比在数据库关闭时解决它要简单一些。
在此情况下,以下两种方法是可行的:
1. 第一种方法是将丢失的数据文件脱机、从备份中还原,然后对其应用介质恢复使之
与数据库中的其它文件保持一致。该方法只能在数据库处于 ARCHIVELOG 模式时
使用。
2. 另一种方法是使丢失的数据文件所在的表空间中的所有回退段脱机、删除表空间,
然后重新创建它。您可能需要终止那些在所涉及的回退段中存在事务处理的会话,
以便强制回退段脱机。
一般来说,第一种方法应用起来更为简单。另外,如果数据文件和所需的归档日志可从备
份中快速恢复,则此方法还将更为快捷。但是,和第二种方法相比,第一种方法将有更多
的用户事务处理出错或被回退。由于读一致性,使用第一种方法查询某些表时可能会失
败,这是因为 Oracle 服务器要从中检索数据的回退区可能位于脱机的数据文件中。
方法 A:从备份还原数据文件
仅当数据库处于 ARCHIVELOG 模式时才可使用此方法。
1. 使丢失的数据文件脱机。
ALTER DATABASE DATAFILE ’<full_path_file_name>’ OFFLINE;
注:在您处理该问题时,根据当前数据库活动的数量情况,可能需要在不同的表空
间中创建其它回退段以使数据库继续运行。
2. 从备份还原数据文件。
3. 发出以下查询:
SELECT V1.GROUP#, MEMBER, SEQUENCE#
FROM V$LOG V1, V$LOGFILE V2
WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的联机重做日志文件以及它们各自的序列号。
4. 恢复数据文件:
RECOVER DATAFILE ’<full_path_file_name>’
5. 对提示您进行确认的每个日志进行确认,直至您收到 “介质恢复完成” 的消息为止。
如果所提示的归档日志并不存在,则 Oracle 服务器可能需要一个或多个联机日志以
继续进行恢复。将 ORA-280 消息中引用的序列号与您的联机日志序列号进行比较。
然后输入重做组中某成员的完整路径名,其序列号应与要求的序列号相匹配。继续
按照请求输入联机日志,直到您收到 “介质恢复完成” 的消息为止。
6. 使数据文件重新联机。
ALTER DATABASE DATAFILE ’<full_path_file_name>’ ONLINE;

Oracle9i 数据库管理基础 II C-12


公告板 1013221.6(续)
方法 B:重新创建回退表空间
无论数据库是否处于归档模式,均可使用此方法。步骤如下:
1. 尝试使丢失的数据文件所属的表空间中的所有回退段脱机。
ALTER ROLLBACK SEGMENT <rollback_segment> OFFLINE;
对于表空间中的所有回退段,重复执行此语句。
注:在您处理该问题时,根据当前数据库活动的数量情况,可能需要在不同的
表空间中创建其它回退段以使数据库继续运行。
2. 检查回退段的状态。必须先使所有回退段脱机,然后才能删除它们。发出以下查询:
SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = ’<TABLESPACE_NAME>’;
3. 删除所有脱机的回退段。对于第 2 步中的查询操作所返回的每个回退段(状态为
OFFLINE),发出下列语句:
DROP ROLLBACK SEGMENT <rollback_segment>;
4. 处理仍处于联机状态的回退。重复第 2 步中的查询。如果您试图使之脱机的回退段
仍处于 ONLINE 状态,则说明该回退段中仍有活动的事务处理。您可以发出下列查
询来进行确认:
SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = ’<TABLESPACE_NAME>’ AND SEGMENT_ID = USN;
如果以上的查询未返回任何行,则表示受影响的表空间中的所有回退段已处于脱机状态。
重复第 2 步的查询以检索刚变为脱机的回退段的名称,然后按照第 3 步中所述的方法将它
们删除。
如果上述查询返回一行或多行,它们应该显示状态 PENDING OFFLINE。
然后,检查每个回退段的 ACTIVE_TX 列。值 0 表示回退段中没有挂起的事务处理,它将
很快脱机。多重复几次第 2 步中的查询,直至显示回退段已脱机,然后按照第 3 步所述的
方法将其删除。转到第 6 步。
如果处于 PENDING OFFLINE 状态的任何回退段在 ACTIVE_TX 列中返回的值等于或大
于 1,则转到第 5 步。

Oracle9i 数据库管理基础 II C-13


公告板 1013221.6(续)
方法 B:重新创建回退表空间(续)
5. 强制将包含活动事务处理的回退段脱机。此时,继续进行操作的唯一可行方法是释
放状态为 PENDING OFFLINE 的回退段。这些回退段中的活动事务处理必须已提交
或已回退。下面的查询显示出用户的事务处理与分配到的回退段的对应情况:
SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME ”ROLLBACK”
FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
WHERE R.NAME IN
(’<PENDING_ROLLBACK_1>’, ... , ’<PENDING_ROLLBACK_N>’)
AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;
您可以与那些在 PENDING OFFLINE 回退段中有事务处理的用户直接联系,要求他
们立即提交或回退(最好提交)。如果这不可行,可以通过终止他们的会话来强制
执行。对于上述查询返回的每个条目,发出如下语句:
ALTER SYSTEM KILL SESSION ’<SID>, <SERIAL#>’;
其中,<SID> 和 <SERIAL#> 是上次查询返回的信息。终止这些会话之后,Oracle 服
务器需要花费几分钟的时间来完成回退和清除工作。请转到第 2 步并定期重复查
询,直到受影响的表空间中的所有回退段均已脱机并可删除。
6. 删除回退表空间。
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;
如果该语句失败,请与 Oracle 客户支持联系。否则,请继续执行第 7 步。
7. 重新创建回退表空间。
8. 重新创建表空间中的回退段并使它们联机。

Oracle9i 数据库管理基础 II C-14


将数据加载到数据库中

Copyright © Oracle Corporation, 2001. All rights reserved.


目标

完成这一课的学习后,您应该能达到下列目标:
• 掌握直接加载插入操作的用法
• 说明 SQL*Loader 的用法
• 执行基本的 SQL*Loader 操作
• 列出使用 SQL*Loader 和直接加载插入的原则

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II D-2


数据加载方法

其它应用程序

Oracle
数据库
导出
SQL*Loader

导入

Oracle
数据库
直接加载插入

Copyright © Oracle Corporation, 2001. All rights reserved.

加载数据
可以使用几种方法向 Oracle 数据库的表中加载数据。此处讨论其中的直接加
载插入和 SQL*Loader 这两种方法。导出和导入将在另一课中讨论。
SQL*Loader
SQL*Loader 可将数据从外部文件加载到 Oracle 数据库的表中。SQL*Loader
包含一个功能强大的数据分析引擎,该引擎对数据文件中数据的格式几乎没有
限制。
直接加载插入
直接加载插入可用于在同一数据库中将数据从一个表复制到另一个表。此方法
绕过缓冲区高速缓存直接将数据写入数据文件,从而提高了插入操作的速度。

Oracle9i 数据库管理基础 II D-3


直接加载插入

可以使用以下方法执行直接加载插入:
• 正常(串行)或并行
• 插入到分区表、非分区表或表的单个分区中
• 记录或不记录重做数据

Copyright © Oracle Corporation, 2001. All rights reserved.

直接加载插入
直接加载插入(串行或并行)只支持 INSERT 语句的 INSERT ... SELECT
语法,而不支持 INSERT ...values 语法。INSERT ... SELECT 的并行
性是由并行提示或并行表定义决定的。Oracle9i 提供了语法扩展,可扩大
INSERT ... SELECT 语句的使用范围,这样就可以将行作为单个 DML 语
句的一部分插入到多个表中。
可使用 APPEND 提示调用直接加载插入,命令如下所示:
INSERT /*+APPEND */ INTO [ schema. ] table
[ [NO]LOGGING ]
sub-query;
其中:
schema 是表的所有者
table 是表的名称
sub-query 是用于选择插入的列和行的子查询

Oracle9i 数据库管理基础 II D-4


直接加载插入(续)
LOGGING 模式
如果使用 LOGGING 选项(缺省设置)进行插入,则该操作生成重做日志条
目,使得从失败中完全恢复成为可能。如果使用 NOLOGGING 选项,则不会将
对数据所作的更改记录到重做日志缓冲区中。但对于更新数据字典的操作,仍
进行最小限度的记录。如果已为表设置 NOLOGGING 属性,则使用
NOLOGGING 模式。
如果接下来可能发生对表数据的多次联机修改,则最好在加载前设置
NOLOGGING 属性,完成加载后再重置为 LOGGING。
其它注意事项
通过直接加载插入方法加载的所有数据都将加载到高水位标记之上。如果表中
有许多块中的行已被删除,则可能会浪费空间并降低全表扫描的速度。

Oracle9i 数据库管理基础 II D-5


串行直接加载插入

INSERT /*+ APPEND */ INTO emp


NOLOGGING
SELECT * FROM t_employees;
COMMIT;

服务器
EMPLOYEES 表 进程

已使用的块 高水位标记
删除后得到的空闲空间 插入行所使用的块

Copyright © Oracle Corporation, 2001. All rights reserved.

串行直接加载插入
到非分区表、分区表或子分区表中的串行直接加载插入
将数据插入到表段或各分区段的当前高水位标记之上。高水位标记是一个分界
线,分界线以上的块不会被格式化,因而无法接收数据。执行一条语句后,就
会将高水位标记更新为一个新值,使其它段能够看到数据。当加载分区表或子
分区表时,SQL*Loader 就会对行进行分区并维护索引(索引也可进行分区)。
如果对分区表或子分区表进行直接路径加载,则可能会消耗大量的资源。

Oracle9i 数据库管理基础 II D-6


并行直接加载插入

ALTER SESSION ENABLE PARALLEL DML;


INSERT /*+PARALLEL(hr.employees,2) */
INTO hr.employees NOLOGGING
SELECT * FROM hr.old_employees;

从属 从属
EMPLOYEES 表 进程 进程

已使用的块 高水位标记
删除后得到的空闲空间 临时段

Copyright © Oracle Corporation, 2001. All rights reserved.

并行直接加载插入
可以使用下列方法之一并行执行直接加载插入操作:
• 在 INSERT 语句中使用 PARALLEL 提示,如示例中所示
• 创建表或更改表以指定 PARALLEL 子句
执行并行直接加载插入时,Oracle 服务器使用多个称为 “并行查询从属” 的进
程将数据插入到表中。分配临时段以存储各个从属进程插入的数据。提交事务
处理时,这些段中的区就成为插入了记录的那个表的一部分。
注:
• 必须在事务处理开始时执行 ALTER SESSION ENABLE PARALLEL DML
命令。
• 在同一事务处理中,不能再次查询或修改使用并行直接加载插入修改的对
象。
有关并行直接加载插入的详细讨论,请参阅 Oracle9i Reference 中的 “Parallel
Execution”。

Oracle9i 数据库管理基础 II D-7


并行直接加载插入(续)
到非分区表中的并行直接加载插入
每个并行执行服务器都分配一个新的临时段,并将数据插入到该临时段中。执
行一条语句后,并行执行协调程序就会将这些新临时段合并为主表段。
到分区表中的并行直接加载插入
给每个并行执行服务器分配一个或多个分区,其中每个分区最多只能有一个进
程在运行。并行执行服务器将数据插入到给它分配的分区段的当前高水位标记
之上。执行一条语句后,并行执行协调程序就会将每个分区段的高水位标记更
新为一个新值,使其它段可以看到数据。

Oracle9i 数据库管理基础 II D-8


SQL*Loader
加载程序控制文件
输入数据文件

参数文件 SQL*Loader
(可选) 拒绝
字段处理
废弃 接受
记录选择
坏文件
选定

Oracle 服务器
废弃文件 拒绝
(可选) 插入
日志文件

数据库数据文件

Copyright © Oracle Corporation, 2001. All rights reserved.

SQL*Loader 功能
SQL*Loader 可将数据从外部文件加载到 Oracle 数据库的表中。SQL*Loader
具有下列功能:
• SQL*Loader 可以使用一个或多个输入文件
• 可以将多个输入记录合并为一个逻辑记录以进行加载
• 输入字段的长度可以是固定的,也可以是不固定的
• 输入数据可以采用任何格式:字符、二进制、压缩十进制、日期和分段十
进制
• 可以从磁盘、磁带或命名管道等不同类型的介质加载数据
• 可以在一次运行中将数据加载到多个表中
• 可以使用替换或附加到表中现有数据的选项
• 在将行存储到数据库中之前,可以将 SQL 函数应用于输入数据
• 可基于规则自动生成列值。例如,可以生成连续键值并将其存储到列中
• 可以绕过数据库缓冲区高速缓存,将数据直接加载到表中

Oracle9i 数据库管理基础 II D-9


SQL*Loader 使用的文件
SQL*Loader 使用下列文件:
• 加载程序控制文件:指定输入格式、输出表以及可选条件(可能用于仅
加载输入数据文件中的部分记录)
• 输入数据文件:其中的数据采用控制文件中定义的格式
• 参数文件:是一个可选文件,可用于定义加载的命令行参数
• 日志文件:由 SQL*Loader 创建并包含加载记录
• 坏文件:实用程序使用该文件写入在加载过程中被拒绝的记录(在实用
程序验证输入记录期间或 Oracle 服务器插入记录期间发生。)
• 废弃文件:需要时可创建的文件,用于存储所有不满足选择标准的记录

Oracle9i 数据库管理基础 II D-10


常规和直接路径加载
例程
SGA 共享池

数组插入

常规

直接
表 数据 路径
保存

高水位标记
仅供常规加载使用的空间

Copyright © Oracle Corporation, 2001. All rights reserved.

加载方法
SQL*Loader 提供两种加载数据的方法:
• 常规路径
• 直接路径
常规路径加载
常规路径加载将需要插入的行排成一个数组,并使用 SQL INSERT 语句加载
数据。在常规路径加载期间,将基于字段说明来分析输入记录,而且将记录排
成一个数组并将其插入到控制文件所指定的表中。不符合字段说明的记录将被
拒绝,而不满足选择标准的记录则被废弃。
可通过常规路径加载将数据加载到集簇表及非集簇表中。至于重做日志的生成
情况,则受所加载表的记录属性的控制。

Oracle9i 数据库管理基础 II D-11


直接路径加载(续)
直接路径加载
直接路径加载在内存中建立数据块,并将这些块直接保存到给加载的表分配
的区内。仅当数据库处于 ARCHIVELOG 模式时,才会生成重做日志条目。
直接路径加载使用字段说明建立全部的 Oracle 数据块,并将这些块直接写入
Oracle 数据文件中。直接 路径加载绕过数据库缓冲区高速缓存,仅在需要管
理区和调整高水位标记时才会访问 SGA。
直接路径加载通常比常规路径加载速度快,但是在有些情况下不适用。在下
一部分中,将对常规路径加载与直接路径加载进行比较,还将举例说明每种
加载方法的使用情形。
注:Oracle 提供的脚本 catldr.sql 可创建供直接路径加载使用的视图。在
运行 catalog.sql 脚本时,自动调用该脚本。

Oracle9i 数据库管理基础 II D-12


直接路径加载和常规路径加载的比较

常规路径加载 直接路径加载

使用 COMMIT 使所作的更改 使用数据保存


能永久保留
始终生成重做日志条目 仅在特定条件下才生成重做
日志条目
处理所有的约束 仅处理主键约束、唯一性约束
和 NOT NULL 约束
触发 INSERT 触发器 不触发 INSERT 触发器

可以加载到集簇表中 无法加载到集簇表中

其他用户可以对表进行更改 其他用户不能对表进行更改

Copyright © Oracle Corporation, 2001. All rights reserved.

直接路径加载和常规路径加载的比较
保存数据的方法
常规路径加载使用 SQL 处理及数据库 COMMIT 来保存数据。在插入记录数组
后将执行提交操作。每次数据加载都可能涉及多个事务处理。
直接路径加载使用数据保存将数据块写入到 Oracle 数据文件中。数据保存与
COMMIT 之间存在以下区别:
• 数据保存期间,只将已满的数据库块写入数据库。
• 块写在表的高水位标记之后。
• 数据保存之后,高水位标记就会移动。
• 数据保存之后不释放内部资源。
• 数据保存并不结束事务处理。
• 每次数据保存时均不更新索引。

Oracle9i 数据库管理基础 II D-13


直接路径加载和常规路径加载的比较(续)
更改事件记录
常规路径加载就象任何 DML 语句一样生成重做日志条目。如果使用直接路
径加载,则在下列情况下将不生成重做日志条目:
• 数据库处于 NOARCHIVELOG 模式
• 数据库处于 ARCHIVELOG 模式,但禁用事件记录。通过为表设置
NOLOGGING 属性或在控制文件中使用 UNRECOVERABLE 子句,可禁用
事件记录。
处理约束
常规路径加载期间,象与任何 DML 操作期间一样处理所有启用的约束。
在直接路径加载期间,按如下方式处理约束:
• 建立数组时检查 NOT NULL 约束。
• 禁用外键约束和 CHECK 约束,可在直接路径加载结束时通过使用控制文
件中的有关命令来启用这些约束。禁用外键约束的原因在于:这些约束
引用了其它的行或
表;禁用 CHECK 约束则是因为这些约束可能使用 SQL 函数。如果只将
少数几行
插入到一个大表中,请使用常规加载。
• 直接路径加载期间和加载结束时检查主键约束和唯一性约束,如果违
反,则可能禁用这些约束。
触发 INSERT 触发器
虽然在常规加载期间会触发 INSERT 触发器,但它们在进行直接路径加载
之前被禁用,并在直接路径加载结束后重新启用。如果在直接路径加载结束
后无法访问某个引用对象,则说明这些触发器可能仍被禁用。请考虑使用常
规路径加载,通过 INSERT 触发器将数据加载到表中。
加载到集簇表中
不能通过直接加载将行加载到集簇表中。只能使用常规路径加载来加载集簇
表。
锁定
在直接路径加载期间,其它事务处理不能对正在加载的表进行更改。不过,
有一种情况例外,在同时使用多个并行直接加载会话时可以对加载的表进行
更改。

Oracle9i 数据库管理基础 II D-14


并行直接路径加载

临时段
load1.dat SQL*Loader
load1.ctl

SQL*Loader
load2.dat
load2.ctl

SQL*Loader
load3.dat
load3.ctl

高水位标记

Copyright © Oracle Corporation, 2001. All rights reserved.

并行直接路径加载
使用多个 SQL*Loader 会话可提高直接路径加载的性能。有三种并发模式可用
于最大限度地缩短数据加载所需的时间:
• 并行常规路径加载
• 在直接路径加载方法中使用段间并发
• 在直接路径加载方法中使用段内并发
并发常规路径
如果触发器或完整性约束出现问题,但又希望获得更快的加载速度,则应该考
虑使用并发常规路径加载。请在具有多个 CPU 的系统上使用多个并发执行的
加载会话。在逻辑记录边界上将输入数据文件拆分为多个单独的文件,然后使
用常规路径加载会话分别加载拆分得到的输入数据文件。
段间并发
段间并发可用于同时加载不同的对象。在直接路径加载中,这种技术可用于同
时加载不同的表或同时加载同一表中的不同分区。
段内并发
并行直接路径加载允许多个直接路径加载会话将数据同时加载到同一表中,或
者加载到某个允许进行段内并发操作的分区表的同一分区中。
Oracle9i 数据库管理基础 II D-15
使用 SQL*Loader

$sqlldr hr/hr \
> control=case1.ctl \
> log=case1.log direct=Y

case1.ctl

SQL*Loader

EMPLOYEES 表
case1.log

Copyright © Oracle Corporation, 2001. All rights reserved.

使用 SQL*Loader
命令行
在调用 SQL*Loader 时,可以指定一些参数以确定会话的特性。可以按任意顺
序输入参数,并用逗号将它们隔开(可选)。可以指定参数值;在某些情况
下,也可接受缺省值而不输入任何值。
如果调用 SQL*Loader 时未指定任何参数,则 SQL*Loader 显示帮助屏幕,其
中列出了可用的参数及其缺省值。

Oracle9i 数据库管理基础 II D-16


使用 SQL*Loader(续)
Oracle Enterprise Manager
“加载向导” (Load Wizard) 可基于指定的控制文件中的指令将数据从外部文
件加载到 Oracle 数据库中。
1. 启动 “Oracle Enterprise Manager 控制台” (Oracle Enterprise Manager
Console),并登录到 Oracle Management Server。
2. 选择节点和目标数据库。
3. 单击鼠标右键,从弹出的菜单中选择 “数据管理” (Data Management) >
“加载” (Load)。
4. 在 “控制文件” (Control File) 页上,输入加载程序控制文件的名称。
5. 在 “数据文件” (Data File) 页上,输入 “输入数据文件” 的名称。
6. 在 “加载方法” (Load Method) 页上指定加载方法。
7. 在 “调度” (Schedule) 页上指定调度详细信息。
8. 在 “作业信息” (Job Information) 页上指定作业输入信息,然后单击 “完
成”
(Finish)。
9. 验证 “概要” (Summary) 页上的说明是正确的,然后单击 “确定” (OK)。

Oracle9i 数据库管理基础 II D-17


SQL*Loader 控制文件

加载程序控制文件告知 SQL*Loader 以下信息:

• 加载数据所在的位置
• 数据格式
• 配置详细信息
– 内存管理
– 有关记录拒绝情况
– 与处理被中断的加载有关的详细信息

• 操纵数据的方式

Copyright © Oracle Corporation, 2001. All rights reserved.

SQL*Loader 控制文件
SQL*Loader 控制文件是一个文本文件,其中包含一些数据定义语言 (DDL) 指
令。DDL 用于控制 SQL*Loader 会话的以下方面:
• SQL*Loader 到何处查找要加载的数据
• SQL*Loader 希望数据采用什么格式
• SQL*Loader 在加载数据时如何配置(内存管理、拒绝记录、处理被中断的
加载等)
• SQL*Loader 如何操纵正在加载的数据
虽然并未明确定义,但是可以将加载程序控制文件划分为三个部分。
• 第一部分包含会话范围内的信息,例如:
– 全局选项(如绑定大小、行、要跳过的记录等)
– 指定输入数据所在位置的 INFILE 子句
– 加载数据的方式
• 第二部分包含一个或多个 INTO TABLE 块。每个块都包含一些与要在其中
加载数据的那个表有关的信息,如表的名称以及表中各列。
• 第三部分是可选的。如果该部分存在,其中将包含输入数据。
Oracle9i 数据库管理基础 II D-18
SQL*Loader 控制文件(续)
以下示例为一个典型的 SQL*Loader 控制文件:
1 -- This is a sample control file
2 LOAD DATA
3 INFILE ’SAMPLE.DAT’
4 BADFILE ’sample.bad’
5 DISCARDFILE ’sample.dsc’
6 APPEND
7 INTO TABLE emp
8 WHEN (57) = ’.’
9 TRAILING NULLCOLS
10 (hiredate SYSDATE,
deptno POSITION(1:2) INTEGER EXTERNAL(3)
NULLIF deptno=BLANKS,
job POSITION(7:14) CHAR TERMINATED BY WHITESPACE
NULLIF job=BLANKS "UPPER(:job)",
mgr POSITION(28:31) INTEGER EXTERNAL
TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
ename POSITION(34:41) CHAR
TERMINATED BY WHITESPACE "UPPER(:ename)",
empno POSITION(45) INTEGER EXTERNAL
TERMINATED BY WHITESPACE,
sal POSITION(51) CHAR TERMINATED BY WHITESPACE
"TO_NUMBER(:sal,’$99,999.99’)",
comm INTEGER EXTERNAL ENCLOSED BY ’(’ AND ’%’
":comm * 100"
)
以下是对示例控制文件的说明:
1. 此行显示在控制文件中输入注释的方法。注释可以出现在文件的命令部
分中的任何地方,但不能出现在数据中。
2. LOAD DATA 语句通知 SQL*Loader 将要开始一个新的数据加载。如果要
继续执行已中断的加载进程,应该使用 CONTINUE LOAD DATA 语句。
3. INFILE 关键字指定一个数据文件的名称,其中包含要加载的数据。
Oracle9i 数据库管理基础 II D-19
SQL*Loader 控制文件(续)
4. BADFILE 关键字指定一个文件的名称,用于保存被拒绝的记录。
5. DISCARDFILE 关键字指定一个文件的名称,用于保存废弃的记录。
6. APPEND 关键字是将数据加载到非空表中时使用的选项之一。要将数据
加载到空表中,请使用 INSERT 关键字。
7. INTO TABLE 关键字用于标识表、字段和数据类型。它定义了数据文件
中的记录与数据库中的表之间的关系。
8. WHEN 子句指定了一个或多个字段条件。在 SQL*Loader 加载数据之前,
每条记录都必须满足这些条件。在此示例中,仅当第 57 个字符是小数点
时,SQL*Loader 才会加载这条记录。该小数点用于分隔字段中的美元和
美分,如果 SAL 没有值,就会拒绝这条记录。
9. TRAILING NULLCOLS 子句告知 SQL*Loader 将任何处于相对位置的列
(即不在该记录中的列)作为空列处理。
10. 控制文件的剩余部分包含字段列表,该列表提供了有关要加载的表中列
格式的信息。

Oracle9i 数据库管理基础 II D-20


与控制文件的语法有关的注意事项

• 控制文件的语法在格式方面没有任何限制
• 控制文件的语法不区分大小写
• 注释是从标记注释开始的两个连字符 (--) 开始,
一直延续到行尾
• CONSTANT 关键字是系统保留字

Copyright © Oracle Corporation, 2001. All rights reserved.

与控制文件的语法有关的注意事项
• 控制文件的语法在格式方面没有任何限制(语句可以长达数行)。
• 它不区分大小写。但是,单引号或双引号内的字符串必须完全保留原样
(包括大小写在内)。
• 在控制文件的语法中,注释从标记注释开始的两个连字符 (--) 开始一直延
续到行尾。控制文件的第三部分(可选)被认为是数据(而非控制文件的
语法),因此,在此部分中不支持注释。
• 对 SQL*Loader 来说,CONSTANT 关键字具有特殊含义,因此系统将该关
键字加以保留。为避免出现潜在的冲突,建议不要将 CONSTANT 用作任何
表或列的名称。

Oracle9i 数据库管理基础 II D-21


输入数据和数据文件

• SQL*Loader 从控制文件所指定的一个或多个文件中读
取数据
• 从 SQL*Loader 的角度看,数据文件中的数据是以记录
的形式出现的
• 数据文件可以采用以下三种格式之一:
– 固定记录格式
– 可变记录格式
– 流式记录格式

Copyright © Oracle Corporation, 2001. All rights reserved.

数据文件格式
固定记录格式
如果数据文件中的所有记录具有相同的字节长度,则文件采用的是固定记录格
式。虽然这种格式最为死板,但是采用后的系统性能比采用可变记录格式或流
式记录格式要好。此外,指定固定记录格式的语法十分简单。例如:
INFILE <datafile_name> "fix n"
在此示例中,告知 SQL*Loader 特定数据文件采用的是固定记录格式,其中每
条记录具有 n 个字节。
以下示例显示这样的控制文件:它指定数据文件采用固定记录格式。该数据文
件包含四条物理记录。第一条记录是 [0001, abcd],数据长度刚好是 9 个字节
(使用单字节字符集),回车符是第 10 个字节。
load data
infile ’example.dat’ "fix 10"
into table example
fields terminated by ’,’
(col1, col2)
example.dat:
0001,abcd
0002,fghi
0003,klmn Oracle9i 数据库管理基础 II D-22
数据文件格式(续)
可变记录格式
如果数据文件中每条记录的开头都包含了该记录在字符字段中的长度,则文件
采用的是可变记录格式。这种格式与固定记录格式相比具有更大的灵活性,与
流式记录格式相比具有更高的系统性能。例如,可以按以下方法指定一个采用
可变记录格式的数据文件:
INFILE "datafile_name" "var n"
在此示例中,n 指定记录长度字段中的字节数。如果未指定 n,则 SQL*Loader
假定记录长度为 5 个字节。如果指定的 n 大于 40,就会出现错误。以下示例
显示的是一个控制文件说明,它告知 SQL*Loader 在数据文件 example.dat
中查找数据,并且指明该数据文件采用可变记录格式,记录长度字段为 3 个字
节的字符。example.dat 数据文件包含三条物理记录。其中,第一条记录的
长度为 009(即 9)个字节,第二条记录的长度为 010 个字节(包括一个字符
的新行符),第三条记录的长度为 012 个字节。此示例还假定该数据文件使用
单字节字符集。
load data
infile ’example.dat’ "var 3“
into table example
fields terminated by ’,’ optionally enclosed by ’"’
(col1 char(5),col2 char(7))
example.dat:
009hello,cd,
010world,im,
012my,name is,
流式记录格式
如果不是按大小来指定记录,而是让 SQL*Loader 通过扫描记录结束符 来判断
记录的起始和结束,则文件采用的是流式记录格式。流式记录格式是最灵活的
格式,但可能会使系统性能下降。要使数据文件采用流式记录格式,请使用类
似以下语句来加以说明:
INFILE <datafile_name> ["str terminator_string"]
将 terminator_string 指定为 ’char_string’ or X’hex_string’ 其
中:
’char_string’ 是一个用单引号或双引号引起来的字符串
X’hex_string’ 是一个采用十六进制格式的字节字符串

Oracle9i 数据库管理基础 II D-23


数据文件格式(续)
如果 terminator_string 中包含特殊字符(即不可打印的字符),应该将
它指定为 X’hex_string’。但是,通过使用反斜杠,可以将某些不可打印
的字符指定为 (’char_string’)。例如:
\n 换行符(新行符)
\t 横向制表符
\f 换页符
\v 纵向制表符
\r 回车符
如果通过 NLS_LANG 参数给会话指定的字符集与数据文件的字符集不相同,
则将字符串转换为数据文件的字符集。
系统假定十六进制字符串在数据文件的字符集范围之内,因此不会进行转换。
如果未指定 terminator_string,则它采用缺省值:新行(行尾)符。在
基于 UNIX 的平台上,新行符为换行符,而在 Microsoft 平台上则为回车符加
上换行符。新行符将放在数据文件的字符集后面。
以下示例说明了如何加载采用流式记录格式的数据,在此格式中使用字符
串 ’|\n’ 来指定结束符字符串。通过在该字符串中使用反斜杠,可指定不可
打印的换行符:
load data
infile ’example.dat’ "str ’|\n’“
into table example
fields terminated by ’,’ optionally enclosed by ’"’
(col1 char(5),
col2 char(7))
example.dat:
hello,world,|
james,bond,|

Oracle9i 数据库管理基础 II D-24


逻辑记录

以下是两种生成逻辑记录的策略。可以指示 SQL*Loader
采用其中一种策略:
• 将固定数量的物理记录合并为一条逻辑记录
• 当满足某种条件时,将物理记录合并为逻辑记录

Copyright © Oracle Corporation, 2001. All rights reserved.

逻辑记录
SQL*Loader 按照指定的记录格式,以物理记录的形式来组织输入数据。缺省
情况下,一条物理记录就是一条逻辑记录。但是为了增加灵活性,可以指示
SQL*Loader 将大量的物理记录合并为一条逻辑记录。SQL*Loader 可以使用以
下两种方法之一完成该操作:
• 将固定数量的物理记录合并为一条逻辑记录
• 当满足某种条件时,将物理记录合并为逻辑记录
使用 CONCATENATE 来组装逻辑记录
如果 SQL*Loader 应该始终将相同数量的物理记录组合成一条逻辑记录,请使
用 CONCATENATE。以下是 CONCATENATE 的一个使用示例,其中 integer 用
于指定要合并的物理记录数:
CONCATENATE integer
使用 CONTINUEIF 来组装逻辑记录
如果要合并的物理记录数不是固定的,必须使用 CONTINUEIF。在
CONTINUEIF 关键字后面跟有一个条件。读取每条物理记录时,都会对该条
件进行判定。例如,如果第一条记录在字符位置为 80 的地方有一个镑字符
Oracle9i 数据库管理基础 II D-25
(#),则可以将两条记录合并。如果该字符位置上是其它字符,则不能将第二
条记录加到第一条记录上。
数据转换

在常规路径加载过程中,分两步将数据文件中的数据字段转
换为数据库中的列:
• 控制文件中的字段说明用于解释数据文件的格式,并使
用该数据将数据文件转换为 SQL INSERT 语句
• Oracle 数据库服务器接受该数据,并执行 INSERT 语句
将数据存储到数据库中

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II D-26


被废弃或拒绝的记录

• 坏文件
– 如果记录的输入格式无效,SQL*Loader 将拒绝记录
– 如果 Oracle 数据库发现某行无效,则拒绝该条记录,并且
SQL*Loader 将该记录放到坏文件中

• 废弃文件
– 该文件只有在启用之后方能使用
– 该文件包含被过滤掉的记录,因为这些记录不满足控制文件
中指定的任何记录选择标准

Copyright © Oracle Corporation, 2001. All rights reserved.

处理被废弃或拒绝的记录
坏文件
坏文件包含被 SQL*Loader 或 Oracle 数据库拒绝的记录。
SQL*Loader 拒绝的记录
如果记录的输入格式无效,SQL*Loader 将拒绝记录。例如,如果记录的右引
号分隔符丢失或者其中某个受限制的字段超过其最大长度,SQL*Loader 将拒
绝该记录。系统将被拒绝的记录放入坏文件中。
Oracle 拒绝的记录
在 SQL*Loader 接受一条记录以进行处理后,就会向 Oracle 发送一行以进行插
入。如果 Oracle 确定该行有效,就会将该行插入到数据库中。否则,将拒绝
这条记录,并且 SQL*Loader 将这条记录放到坏文件中。如果出现以下情况,
该行就可能被拒绝:某个键不是唯一的、某个所需的字段为空,或者字段中包
含的数据对于 Oracle 来说属于无效的数据类型。

Oracle9i 数据库管理基础 II D-27


处理被废弃或拒绝的记录(续)
废弃文件
执行 SQL*Loader 时,它可能会创建一个称为 “废弃文件” 的文件。仅在确实
需要废弃文件并且已指定应该启用废弃文件时,才会创建该文件。废弃文件包
含在加载过程中被过滤掉的记录,因为这些记录不满足控制文件中指定的任何
记录选择标准。因此,废弃文件包含那些未插入到数据库任何表中的记录。可
以指定废弃文件所能接受的此类记录的最大数量。

Oracle9i 数据库管理基础 II D-28


日志文件的内容

• 标头信息
• 全局信息
• 表信息
• 数据文件信息
• 表加载信息
• 概要统计信息
• 直接路径加载的其它统计信息和多线程信息

Copyright © Oracle Corporation, 2001. All rights reserved.

日志文件的内容
“标头信息” 部分包含以下条目:
• 运行日期
• 软件版本号
“全局信息” 部分包含以下条目:
• 所有输入/输出文件的名称
• 命令行参数的回显
• 续行符说明
“表信息” 部分为加载的每个表提供以下条目:
• 表名
• 加载条件(如有)。即指出是加载所有的记录,还是只加载那些满足
WHEN 子句标准的记录。
• INSERT、APPEND 或 REPLACE 说明
• 以下列信息:
– 位置、长度、数据类型和分隔符(如果能在数据文件中找到)。
– RECNUM、SEQUENCE、CONSTANT 或 EXPRESSION(如果指定)
– DEFAULTIF 或 NULLIF
Oracle9i(如果指定)
数据库管理基础 II D-29
日志文件的内容(续)
如果 SQL*Loader 控制文件包含任何可用于加载日期时间或时间间隔等数据类
型的指令,则日志文件将在数据类型标题下面包含 DATETIME 或 INTERVAL
关键字。如果适用的话,还将在 DATETIME 或 INTERVAL 关键字后面加上相
应的掩码。
仅当数据文件中的数据有错误时,才会显示 “数据文件信息” 部分。该部分包
含以下条目:
• SQL*Loader 和 Oracle 数据记录错误
• 被废弃的记录
“表加载信息” 部分为加载的每个表提供以下条目:
• 加载的行数
• 满足加载条件但由于数据错误而被拒绝的行数
• 由于未通过 WHEN 子句测试而被废弃的行数
• 相关字段均为空的行数
“概要统计信息” 部分显示以下数据:
• 占用的空间量:
– 用于绑定数组(实际使用量基于指定的 BINDSIZE)
– 用于其它开销(始终需要,与 BINDSIZE 无关)
• 累积加载统计信息。即对于所有的数据文件而言跳过、读取或拒绝的记录

加载表时,将记录以下统计信息:
• 如果对分区表进行直接路径加载,则报告每个分区的统计信息。
• 常规路径加载无法报告每个分区的统计信息。
如果没有启用介质恢复,则不对加载进行记录。即:如果禁用介质恢复,则忽
略记录操作请求。

Oracle9i 数据库管理基础 II D-30


SQL*Loader 原则

• 使用参数文件来指定常用的命令行选项
• 仅当涉及小型、一次性加载时,才将数据放在控制
文件中
• 提高性能的方法包括:
– 分配充足的空间
– 将数据按最大索引排序
– 为临时段指定不同的文件(针对并行加载而言)

Copyright © Oracle Corporation, 2001. All rights reserved.

SQL*Loader 使用原则
使用 SQL*Loader 时应遵循下列原则,以最大限度地减少错误并提高性能:
• 使用参数文件来指定常用的命令行选项。例如,如果每周都要将数据加载
到数据仓库中,则除文件名外,其它所有选项可能保持不变。
• 将控制文件与数据文件分开,这样可以在多个加载会话中重用控制文件。
• 基于预期的数据量预先分配空间,从而防止在加载期间动态分配区并提高
加载速度。
• 对于直接加载,将使用临时段来生成新数据的索引。加载结束时,这些索
引将与现有索引合并。通过按最大索引的关键字对输入数据进行排序,可
以最大限度地减少排序使用的空间。
• 在并行直接加载中,可指定用于插入数据的临时段的位置。对于每个加载
会话,可指定不同的数据库文件以获得最佳性能。

Oracle9i 数据库管理基础 II D-31


小结

在这一课中,您应该能够掌握:
• 说明 SQL*Loader 的用法
• 执行基本的 SQL*Loader 操作

• 熟练使用直接加载插入操作
• 列出使用 SQL*Loader 和直接加载插入的原则

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II D-32


练习 19 概览

此练习涉及以下主题:
• 使用 SQL*Loader 还原数据
– 使用控制文件
– 使用数据文件

• 使用直接加载插入操作来加载数据

Copyright © Oracle Corporation, 2001. All rights reserved.

Oracle9i 数据库管理基础 II D-33


练习附录 C
对该练习中的所有问题都使用帐户 HR。查看文件 case1.ctl、
case2.ctl 和 case2.dat 以熟悉控制文件和数据文件的格式。

以用户 HR 的身份执行下列步骤,以熟悉 SQL*Loader 的用法。


1. 创建 DEPARTMENTS2 表作为 DEPARTMENTS 表的副本。
2. 删除 DEPARTMENTS2 表中的所有记录。
3. 运行 SQL*Loader 将数据加载到 DEPARTMENTS2 表中(使用 LABS 目
录下的控制文件 case1.ctl)。查看生成的日志文件,并查询
DEPARTMENTS2 表以检查是否正确加载了所有的数据。
4. 删除 DEPARTMENTS2 表中的所有记录。
5. 在直接路径模式下运行 SQL*Loader,将数据加载到 DEPARTMENTS2
表中(使用控制文件 case2.ctl)。注意,此次是使用一个输入数据
文件来加载数据。查看生成的日志文件,并查询 DEPARTMENTS2 表以
检查所加载的数据。
6. 创建 EMPLOYEES2 表作为 EMPLOYEES 表的副本。创建完成后,截断
EMPLOYEES2,然后使用直接加载插入方法从 EMPLOYEES 表中还原数
据。
7. 再次截断 EMPLOYEES2,然后从 EMPLOYEES 表执行并行直接加载插
入来还原数据。将并行度指定为 2。加载完成后验证数据是否正确。

Oracle9i 数据库管理基础 II D-34

You might also like