oracle实验和代码

专业:网络工程本科

制 定 人: 郭东恩

教 研 室:数据库技术教研室

2011 年1 月

前言

大型数据库ORACLE是属于数据库开发软件及应用领域的专业课,是面向计算机专业本科生开设的一门数据库应用普及型计算机专业课程。

ORACLE数据库是当前应用最为广泛的数据库系统,ORACLE数据库是针对高年级学生的实践性较强的课程。通过实训,并结合典型系统进行分析,使学生较为系统地掌握ORACLE数据库的基本开发和管理方法,运用数据库设计理论设计出满足一定规范的ORACLE数据库应用系统,了解掌握oracle大型数据库的管理。

随着计算机数据库技术的迅速发展和在当今信息社会中的广泛应用,给《大型数据库技术》课程的教学提出了新的更高的要求。由于ORACLE数据库是一门实践性较强的技术,课堂教学应该与实践环节紧密结合。

我们重新编写了实验指导书,加大了实践力度。希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。

希望同学们在使用本实验指导书和进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《大型数据库技术》成为对学生的就业和学习非常有实用价值的一门课程。

实验要求

计算机数据库技术是现代信息社会最重要的应用之一。在过去十几年里得到了迅速的发展和应用。《Oracle数据库技术》课程的目的是为了使学生在课程学习的同时,通过在ORACLE这个大型的数据库软件中的实际操作,对ORACLE的基本功能有一个初步的了解;通过对SQL*PLUS的简单使用,掌握其基本操作命令和技术;通过PL/SQL编程语言的使用与程序设计的分析,加深学生对SQL*PLUS和PL/SQL技术的理解和掌握,进而为今后再涉及到难度较大的实际应用打下扎实的基础。通过多oracle常用工具的学习和使用,对oracle大型数据库的管理和应用有所了解,为以后从事DBA工作奠定坚实的基础。总之,通过上述实验环节,使学生加深了解和更好地掌握《大型数据库技术》课程教学大纲要求的内容。

在《大型数据库技术》的课程实验过程中,要求学生做到:

(1)预习实验指导书有关部分,认真做好实训内容的准备,就实验可能出现的情况提前做出思考和分析。

(2)仔细观察上机操作时出现的各种现象,记录主要情况,作出必要说明和分析。

(3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。对需编程的实验,写出程序设计说明,给出源程序框图和清单。

(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。

(5)实验课程不迟到。

目   录

实验一  Oracle 的安装与配置 5

实验二 Oracle SQL*PLUS环境与查询 8

实验三  oracle对象管理及使用 19

实验四  PL/SQL编程 24

实验五 oracle安全管理及备份恢复 28

附录:员工医疗保险系统表 21

实验一  Oracle 的安装与配置

一、实验目的及要求

掌握Oracle的基本安装方法。掌握Oracle 10g的网络配置。能够使用DBCA创建数据库。

二、实验主要内容

1、Oracle 10g的安装。

2、Oracle 10g的网络配置。

3、使用DBCA创建数据库。

三、实验仪器设备

在局域网环境下,有一台服务器和若干台客户机。服务器成功安装Oracle 10g数据库服务器(企业版),客户机成功安装Oracle 10g客户端软件,网络服务配置正确,数据库和客户端正常工作。

四、实验步骤

1、Oracle 10g的安装

(1)打开安装程序后,选择Oracle 10 g要安装的目录,输入数据库名及数据库口令。

(2)检查安装Oracle前的先决条件,如果失败的项继续点重试检查或手动检查。

(3)查看安装Oracle 10g时系统反馈的信息包括系统磁盘空间是否够用是否有旧版本的残留,一切条件符合继续点安装。

(4)安装程序已大致安装结束,下面点口令管理,修改数据库基本帐户口令(可选)。

(5)此是最后一个步骤标志着安装程序已经安装完成,一些重要的URL地址要记住,以便日后之需,点击退出。

2、Oracle 10g的网络配置

配置Oracle服务器端与客户端都可以在其自带的图形化Oracle网络配置助手(Net Configuration Assistant)里完成(强烈建议在图形化的工具下完成Oracle服务端或客户端的配置)。

(1) Oracle监听器配置(LISTENER)

注意:如果正常安装了数据库,又没有人为地结束相关进程,此步操作可省。

①选择Oracle-OraDb10g_home1à配置和移植工具àNet Configuration Assistant。

②在随后出现的窗口中选择“监听程序配置”,默认新加的监听器名称是LISTENER(该名称也可以由任意合法字符命名)。

③选中该名称,选中窗口右侧栏下拉选项中的“监听位置”,点击添加地址按钮。在出现的网络地址栏的协议下拉选项中选中 “TCP/IP”,主机文本框中输入主机名称或IP地址(如果主机即用作服务端也作为客户端,输入两项之一均有效;如果主机作为服务端并需要通过网络连接,建议输入IP地址。此处,由于网络上的IP地址需要重新配置,所以我输入的是主机名319-200,请同学们在建立客户端连接的时候注意与此保持一致),端口文本框中输入数字端口,默认是1521,也可以自定义任意有效数字端口。

④输入全局数据库名,如test。注意这里的全局数据库名与数据库SID有所区别,全局数据库名实际通过域名来控制在同一网段内数据库全局命名的唯一性,就如Windows下的域名控制器,如这里可以输入 myoracle.192.168.1.5。Oracle主目录可以不填写,输入SID,如myoracle。

至此,Oracle服务端监听器配置已经完成。

(2)本地服务名配置(Tnsnames)

本地服务名是基于Oracle客户端的网络配置,所以,如果客户端需要连接数据库服务器进行操作,则需要配置该客户端。

此处使用Oracle Net Configuration Assistant配置本地服务名。

①选择Oracle-OraDb10g_home1à配置和移植工具àNet Configuration Assistant。

②在随后出现的窗口中选择“本地Net服务名配置”,单击下一步。

③在“选择要做的工作”一栏选择“添加”,单击下一步。

④在服务名中输入(1)中配置的服务名,单击下一步。

⑤选中TCP/IP(Internet协议),点击下一步。

⑥输入主机名与端口号。注意这里的主机名与端口号必须与数据库服务器端监听器配置的主机名和端口号相同。点击下一步。

⑦如果数据库服务器端相关服务启动了,可以点击“是,进行测试”,下一步,单击“更改登陆”输入相应的用户名和密码,进行连接测试。

如果这里测试连接不成功,也不要紧,先点完成按钮结束配置。 

(3)连接数据库服务器

① 启动服务器端监听器与数据库服务

Windows下,启动监听器:

C:lsnrctl start

启动Oracle实例服务:

C:oradim –startup –sid myoracle 

关闭Oracle实例服务:

C:oradim –shutdown –sid myoracle

以上服务必须同时启动,客户端才能连接数据库。由于默认配置的监听器名称是Listener,上述命令可以正常启动监听器。

② 测试连接数据库服务器

测试的方法多种多样,可以在上面配置本地服务名时进行测试,也可以是第三方客户端工具,如PL/SQL Developer,最方便的是用Oracle自带的sqlplus工具,以下利用sqlplus进行测试:

C:sqlplus /nolog

SQL>conn system@test

已连接。

3、使用DBCA创建数据库

限于机房的安装环境,请同学们课后在自己的机器上实现此操作。 

(1)选择开始菜单中的Database Configuration Assistant(DBCA),单击下一步。

(2)选择创建数据库,单击下一步。

(3)“数据库模板”窗口,单击常规用途模板,然后单击下一步。

(4)输入全局数据库名和SID,保持configure the Database with Enterprise Manager被选中。

(5)“数据库连接选项”窗口,选择在缺省情况下您需要您的数据库工作的模式。单击未用模式或分享服务器模式并单击下一步。

(6)“初始化参数”窗口的字符集选项卡上,单击使用 Unicode (AL32UTF8)。

(7)从“数据库存储器”窗口,单击下一步。

(8)“创建选项”窗口,单击完成。

(9)从“摘要”窗口,单击确定来启动创建数据库。

(10)当数据库创建过程完成时,单击完成。

五、拓展题

使用命令方式创建数据库

实验二 Oracle SQL*PLUS环境与查询

一.实验目的及要求

1. 熟悉Oracle的基本知识。

2. 熟悉Oracle的命令操作环境SQL*PLUS及常用命令。

3. 熟悉并掌握oracle常用的查询语句。

二、实验主要内容

1、Oracle SQL*PLUS环境及常用命令

2、Oracle查询。

三、实验仪器设备

在局域网环境下,有若干台服务器。服务器成功安装Oracle 10g数据库服务器(企业版),网络服务配置正确,数据库和客户端正常工作。

四、实验步骤

1. SQL*Plus的启动

当登录到操作系统后,有三种方法启动SQL*Plus。

1)  SQLPLUS

(或 SQLPLUSW,下同)

将看到如下的信息:

SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 9月 13 14:27:51 2005

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

请输入用户名:

输入你的用户名字并按回车。

SQL*Plus将提示:请输入口令:

输入你的密码并按回车。

那么,将看到SQL*Plus的提示符:

SQL>

例如:

SQLPLUS

SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 9月 13 14:27:51 2005

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

Enter Username:scott

Enter Password:tiger

SQL>

2) SQLPLUS Username

再提示你输入密码。

例如:

SQLPLUS scott

Enter Password: tiger

SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 9月 13 14:27:51 2005

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

SQL>

3) SQLPLUS username/password

例如:

SQLPLUS scott/tiger

SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 9月 13 14:27:51 2005

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

SQL>

4) 断开与数据库的连接

    SQL>DISCONNECT

5) 退出SQL*Plus

SQL>EXIT

或:

SQL>Quit

2. SQL命令

SQL命令包括数据定义语言(如CreateAlter等)和数据操作语言(Select Insert Update Delete等),这些都可在SQL*Plus中使用。

如:

SQL>SELECT EMPNO, ENAME, JOB, SAL 

2 FROM EMP WHERE SAL < 2500;

3. SQL*Plus命令

1) 列出缓冲区的内容:

SQL>LIST

SQL*Plus显示当前缓冲区中的SQL命令(注意:不缓存SQL Plus命令):

1 SELECT EMPNO, ENAME, JOB, SAL 

2 FROM EMP WHERE SAL < 2500 ;

2) 编辑当前行

如果上面的例子错误的输入为:

SQL>SELECT EPNO, ENAME, JOB, SAL 

2 FROM EMP WHERE SAL < 2500;

在屏幕上显示:

SELECT EPNO, ENAME, JOB, SAL 

*

ERROR at line 1:

ORA-0904:invalid column name

分析错误可以发现EMPNO错为EPNO

则用CHANGE命令修改编辑当前行。

如:

SQL>CHANGE /EPNO/EMPNO

修改的行在屏幕上显示:

1* SELECT EMPNO, ENAME, JOB, SAL 

再用RUN命令运行当前命令。

SQL>RUN(或 /

SQL*PLUS列出其命令然后运行它。

1 SELECT EMPNO, ENAME, JOB, SAL 

2 FROM EMP WHERE SAL < 2500;

3) 增加一行

在当前行之后插入一新行,使用INPUT命令。例如对上面例子增加第3行到该SQL命令中。形式如下:

SQL>INPUT

3

接着可进入新行,然后按ENTER键,SQL*PLUS再次提示新行:

3 ORDER BY SAL

4

ENTER键,表示不进入任何行,然后用RUN检验和重新运行查询。

4) 在一行上添加一原文

APPEND命令,将一原文加到缓冲区中当前行的末端:

SQL>LIST

3* ORDER BY SAL

SQL>APPEND DESC

3* ORDER BY SAL DESC

使用RUN检验和重新运行查询。

5) 删除一行

l 用LIST命令列出要删除的行。

l 用DEL命令删除。

SQL>LIST

3* ORDER BY SAL DESC

SQL>DEL

6) 用系统编辑程序编辑命令

SQL*PLUS中运行操作系统缺省的文本编辑程序(EDIT),命令形式为:

SQL>EDIT

EDIT将缓冲区中的内容装入系统缺省的文本编辑器,然后用文本编辑器的命令编辑文本。完成后保存编辑的文本,然后退出。该文本保存到当前的缓冲区。

7) 保存SAVE命令

SQL>SAVE 文件名

例如:SQL>LIST

1 SELECT EMPNO, ENAME, JOB, SAL 

2 FROM EMP WHERE SAL < 2500;

然后用SQVE保存到EMPINFO文件中:

SQL>SAVE empinfo

Created file empinfo

8) 运行命令文件

可用命令START 文件名或者@ 文件名的命令格式。

如上例:

SQL>START EMPINFO

SQL>@  EMPINFO

9) 清缓冲区

SQL>CLEAR BUFFER

10) DESCRIBE列出表的结构

如:

SQL>DESC EMP

  Name

Null?

Type

EMPNO

NOT NULL

NUMBER(4)

ENAME

VARCHAR2(10)

JOB

VARCHAR2(10)

MGR

NUMBER(4)

HIREDATE

DATE

SAL

NUMBER(7,2)

COMM

NUMBER(7,2)

DEPTNO

NOT NULL

NUMBER(2)

4. Oracle查询

1. 显示EMP表中所有的部门号、职工名称和管理者号码:

SELECT DEPTNO,ENAME,MGR 

FROM EMP;

2. 算术运算符在SQL中的使用

SELECT ENAME, SAL+250*12 FROM EMP;

3. 连字符的使用

把职工号和职工名字连接起来,如下:

SELECT EMPNO||ENAME EMPLOYEE FROM EMP;

把职工号和职工名字中间用‘-’连接起来,并输出‘WORKS IN DEPARTMENT’,如下:

SELECT EMPNO||’-‘||ENAME EMPLOYEE, ‘WORKS IN DEPARTMENT’, DEPTNO

FROM  EMP;

4. 禁止重复

如果列举出EMP表中所有部门号:

Select deptno from emp;

从上表中可以看出部门号之间存在着许多的相同的,可以用DISTINCT子句来消除重复的。

SELECT DISTINCT deptno from emp;

5. 排序

按单个字段排序,如按照ENAME排序,

SELECT ENAME, JOB, SAL*12, DEPTNO

FROM EMP

ORDER BY ENAME;

按多个字段排序:

如按部门号升序,按工资降序排序

SELECT DEPTNO, JOB, ENAME

FROM EMP

ORDER BY DEPTNO, SAL DESC;

6. 带条件的查询

1)查询工作是CLERK的所有职工的姓名,职工号和部门号

SELECT ENAME, EMPNO, JOB, DEPTNO

FROM EMP

WHERE JOB = ‘CLERK’;

2)从DEPT表中查询出部门号大于20的部门名称

SELECT  DNAME, DEPTNO

FROM  DEPT

WHERE  DEPTNO > 20;

3)复合条件查询

查询工作是MANAGER并且工资大于1500,或者工作是SALESMAN的职工信息:

SELECT EMPNOENAME, JOBSALDEPTNO

FROM EMP

WHERE SAL>1500 AND JOB = ‘MANAGER’ OR JOB = ‘SALESMAN’;

7. 操作符的应用

1) BETWEEN的应用

查询工资在10002000之间的职工名字和工资信息。

SELECT ENAME, SAL

FROM EMP

WHERE SAL BETWEEN 1000 AND 2000

2) IN

查询有790275667788三个MGR号之一的所有职工:

SELECT EMPNO, ENAME, SAL, MGR

FROM EMP

WHERE MGR IN 790275667788);

3) LIKE

通配符%代表任意0或多个字符。

通配符_代表任意单个字符。

查询名字以“S”开始的所有职工:

SELECT ENAME

FROM  EMP

WHERE ENAME LIKE S%’;

查询名字只有4个字符的所有职工:

SELECT ENAME

FROM  EMP

WHERE ENAME LIKE _ _ _ _’;

4) IS NULL

查询没有管理者的所有职工:

SELECT ENAMEMGR

FROM  EMP

WHERE MGR IS NULL

8. &号替代变量

1) 数字变量输入:

SELECT EMPNOENAMESAL

FROM EMP

WHERE DEPTNO = &DEPARTMENT_NUMBER;

Enter value for department_number:10

2) 字符串变量输入:

SELECT EMPNOENAMESAL*12

FROM EMP

WHERE JOB = ‘&JOB_TITLE’;

Enter  value for  job_title: MANAGER

9. 字符函数的应用

见表4-5

10. 数字函数的应用

见表4-4

11. 日期函数的应用

见表4-64-7

12. 数据类型转换

1) TO_CHAR 数字数据转换为字符串

select to_char(8897) from dual;

2) TO_NUMBER字符串数据转换为数字

select to_number(‘8897’) from dual;

3) TO_DATE字符串数据转换为日期数据

select to_date(‘12-DEC-02’) from dual;

13. 分组函数的应用

1) 分组函数见表4-8

2) 分组函数应用

求平均值

SELECT AVG(SAL) FROM EMP;

求最小值

SELECT MIN(SAL) FROM EMP WHERE JOB = ‘CLERK’;

求数目

SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20;

3) GROUP BY子句

求每个部门中的平均工资:

SELECT JOBAVGSAL) FROM EMP

GROUP BY JOB

4) HAVING子句

查询人数超过3人的部门中的平均工资:

SELECT DEPTNOAVGSAL) FROM EMP

GROUP BY DEPTNO

HAVING COUNT*>3;

14. 连接

EMPDEPT中查询出职工名字、工作和部门名称:

SELECT ENAMEJOBDNAME FROM  EMP, DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO;

15. 子查询的应用

EMP中查询出工资最低的职工:

SELECT ENAMEJOBSAL FROM EMP

WHERE SAL = SELECT MINSALFROM EMP );

EMP中查询出每个部门工资最低的职工:

SELECT ENAMESALDEPTNO FROM EMP

WHERE SAL IN 

SELECT MINSAL) FROM EMP GROUP BY DEPTNO);

五、拓展题

复杂查询的不同格式的实现及增删改操作。

实验三  oracle对象管理及使用

一、实验目的及要求

掌握Oracle的常用对象的操作方法。会使用常用对象解决一些实际问题。

二、实验主要内容

(1)表结构的建立、修改、查看、删除操作。

(2) 索引的建立、修改、查看、删除操作。

(3) 视图的建立、查询、修改、删除操作。

  (4) 同义词的建立、查询、修改、删除操作,比较对同义词的操作与对原数据库对象的操作是否一致。

  (5) 掌握序列的建立、查询、修改、删除操作,利用序列向数据库表中插入数据。

三、实验仪器设备

在局域网环境下,有一台服务器和若干台客户机。服务器成功安装Oracle 10g数据库服务器(企业版),客户机成功安装Oracle 10g客户端软件,网络服务配置正确,数据库和客户端正常工作。

四、实验步骤

1.创建表结构

利用命令行方式将下列各表建立到员工医疗保险系统数据库中。表结构如附录员工医疗保险系统表1-7所示。

2.查看表结构

(1) 利用OEM查看员工医疗保险系统所有表的字段信息和约束信息。

(2) 利用SQL*Plus或iSQL*Plus从数据字典DBA_TAB _COLUMNS查看员工医疗保险系统所有表的字段信息。

(3) 利用SQL*Plus或iSQL*Plus从数据字典DBA_ CONSTRAINTS查看员工医疗保险系统所有表的约束信息。  

3.修改表结构

(1) 利用SQL*Plus或iSQL*Plus将表“staff_sql”重新命名为“staff_sql0”。

(2) 利用企业管理器为“staff_sql0”表添加“age INT”字段,利用DESC命令查看“staff_sql0”表的字段信息。

(3) 利用SQL*Plus或iSQL*Plus为“staff_sql0”表添加“salary NUMBER(5,2)”、“salary_add NUMBER(3,1)”两个字段,利用DESC命令查看“staff_sql0”表的字段信息。

(4) 利用SQL*Plus或iSQL*Plus向“staff_sql0”表添加“sname”字段惟一性约束,从数据字典DBA_CONSTRAINTS查看“staff_sql0”表的约束信息。

(5) 利用SQL*Plus或iSQL*Plus删除“staff_sql0”表上“sname”字段惟一性约束,从数据字典DBA_CONSTRAINTS查看“staff_sql0”表的约束信息。

(6) 利用企业管理器从“staff_sql0”表删除“age”字段,利用DESC命令查看“staff_sql0”表的字段信息。

(7) 利用SQL*Plus或iSQL*Plus从“staff_sql0”表删除“salary”、“salary_add”两个字段,利用DESC命令查看“staff_sql0”表的字段信息。

(8) 利用SQL*Plus或iSQL*Plus将“staff_sql0”表“sname”字段长度修改为30,利用DESC命令查看“staff_sql0”表的字段信息。

4. 删除表结构

(1) 利用SQL*Plus或iSQL*Plus删除员工表3,看能否成功。从原理上解释原因,同时记录外键约束表删除顺序的影响。

(2) 利用企业管理器删除员工表2,看能否成功。从原理上解释原因。

索引、视图、同义词及序列操作

1.创建索引

  (1) 利用企业管理器为医院表的医院名称创建索引,并以降序排列,索引名为“hospital_name_index”。

  (2) 利用SQL*Plus或iSQL*Plus为员工表的员工姓名、员工性别、出生年月排序,以员工姓名升序、员工性别降序、出生年月降序排列,索引名为“staff_info_index”。

  2.查看索引

  (1) 利用企业管理器查看“ygbx_user”方案下有几个隶属于该方案的索引,有几个系统创建的索引,有几个用户创建的索引。

  (2) 利用SQL*Plus或iSQL*Plus从DBA_INDEXES数据字典中查看员工医疗保险系统所有索引的信息。

  (3) 利用SQL*Plus或iSQL*Plus从DBA_INDEXES数据字典中查看“staff_info_index”索引的信息,并查看该索引列的顺序及状态。

  3.删除索引

  (1) 利用企业管理器删除“hospital_name_index”索引。

  (2) 利用SQL*Plus或iSQL*Plus将“staff_info_index”索引删除。

  4.创建视图

  (1) 利用企业管理器为实现显示医保卡信息创建视图,该视图中包括医保卡信息、医保卡所属人信息和所属人单位信息,视图名为“ygbx_card_view”。

  (2) 利用SQL*Plus或iSQL*Plus为实现员工持医保卡到医院消费的功能创建视图,该视图中包括员工的信息、医保卡信息、医保信息和消费等信息,视图名为“consume_view”。

  (3) 利用SQL*Plus或iSQL*Plus为企业医保缴费信息功能创建视图,该视图中包括医保缴费的企业信息,医保卡信息和企业医保缴费费用等信息,视图名为“insurnce_view”。

  (4) 利用SQL*Plus或iSQL*Plus为企业表创建视图,视图名为“business_view”。

  5.查看视图

  (1) 利用企业管理器查看“ygbx_user”方案下的视图。

  (2) 利用企业管理器查看“consume_view”视图的信息。

  (3) 利用SQL*Plus或iSQL*Plus查看“card_view”视图的子查询语句。

  (4) 利用SQL*Plus或iSQL*Plus显示“insurance_view”视图的信息。

  6.视图数据的更新

  (1) 利用SQL*Plus或iSQL*Plus向“business_view”插入一个记录,企业编号为“B1997010287”,企业名称为“格林制药”,企业类型为“企业”,企业地址为“鸭绿江街98号”,联系电话为“84692315”。

  (2) 利用SQL*Plus或iSQL*Plus查看“business”表是否有变化。

  7.删除视图

  (1) 利用企业管理器删除“business_view”视图。

  (2) 利用企业管理器删除“card_view”视图。

  (3) 利用SQL*Plus或iSQL*Plus删除“consume_view”视图。

  (4) 利用SQL*Plus或iSQL*Plus删除“insurnce_view”视图。

  8.创建同义词

  (1) 利用企业管理器创建企业表同义词,名为“qyb”。

  (2) 利用SQL*Plus或iSQL*Plus创建医保卡表的同义词,名为“ybk”。

  9.查询同义词

  (1) 利用企业管理器查看同义词“qyb”。

  (2) 利用SQL*Plus或iSQL*Plus查看同义词“ybk”。

  10.删除同义词

  (1) 利用企业管理器删除同义词“qyb”。

  (2) 利用SQL*Plus或iSQL*Plus删除同义词“ybk”。

  11.创建序列

  (1) 利用企业管理器创建序列,该序列最大值为“28000”,最小值为“60”,步长为“1”,可循环,序列名为“ygbx_seq1”。

  (2) 利用SQL*Plus或iSQL*Plus创建序列,该序列最大值无限制,最小值为“1”,步长为“10”,序列名为“ygbx_seq2”。

  12.查询序列

  (1) 利用企业管理器查看序列“ygbx_seq1”。

  (2) 利用SQL*Plus或iSQL*Plus查看同义词“ygbx_seq2”。

  13.修改序列

  (1) 利用企业管理器修改序列“ygbx_seq1”,将该序列最大值设为“82000”,最小值设为“100”,步长设为“5”。

  (2) 利用SQL*Plus或iSQL*Plus修改序列“ygbx_seq2”,将该序列最大值设为“1000”。

  14.删除序列

  (1) 利用企业管理器删除序列“ygbx_seq1”。

  (2) 利用SQL*Plus或iSQL*Plus删除序列“ygbx_seq2”。

常见问题分析

 1.“名称已由现有对象使用”错误

数据库中已存在同名对象,修改数据库对象名称即可。

2.查看数据字典信息时,SELECT命令正确,却查不到数据

虽然Oracle的命令中是不区分大小写的,但查看Oracle系统数据字典信息时所有的字母均需大写,即便是用户定义的表名。

例如,正确的命令是:SELECT * FROM  DBA_TABLES WHERE TABLE_NAME= 'STAFF';错误的命令是:SELECT * FROM  DBA_TABLES WHERE TABLE_NAME='staff'; 

3.插入数据时,出现“值过多”、“没有足够的值”或“插入的值对于列过大”的错误

插入数据时,要求字段列表和值列表是按顺序一一对应的,即字段的个数、类型、长度与值的个数、类型、长度必须一致。如果字段的个数多,则出现“没有足够的值”的错误;如果字段的个数少,则出现“值过多”的错误;如果字段的类型与值列表中值的类型不一致,或值的长度超出了字段的长度,则出现“插入的值对于列过大”的错误。

4.插入数据时,出现“未找到父项关键字”错误

外键关联的两个表输入的数据必须满足参照完整性,即子表中外键字段的值或为空,或为父表中外键关联的主键值中的一个。出现“未找到父项关键字”错误可能有多种情况:

(1) 在子表中输入的外键字段的值在父表中外键关联的主键值中不存在,应修改为父表中主键已经存在的值。

(2) 可能是外键关联的父表和子表中字段的类型、长度不一致,父表中主键的长度大于子表中外键的长度,应修改子表,使子表中外键的类型、长度与父表一致。

(3) 可能是外键关联的父表中未创建主键,应在父表中定义外键关联的字段为主键。

(4) 外键关联的表的数据插入顺序是先插入父表数据,再插入子表数据。例如,先在“business”表插入某企业记录,才能在“staff”表中插入该企业的员工记录。

5.删除数据时,出现“已找到相关子记录”错误

删除表中数据时,外键关联的父表与子表,在没有指定数据删除方式为级联删除时,数据删除顺序是先删除子表数据,再删除父表数据。如果在子表中仍存在父表中要删除记录相关的记录时,出现“已找到相关子记录”错误,那么解决的方法为先删除子表中相关记录,再删除父表中记录。

6.创建外键约束时,出现“此列列表的惟一或主键不匹配”错误

在创建外键约束时,由于参照完整性要求子表的外键与父表的主键建立外键关联,而当父表上外键关联的字段不是主键时,出现“此列列表的惟一或主键不匹配”错误,解决的方法是在父表外键关联的字段上创建主键约束。另外,主键约束相当于惟一性和非空两个约束的作用,但主键约束不能定义成惟一性和非空约束,即就诊表中员工编号、医院编号和就诊日期联合作主键,正确的定义方法为“PRIMARY KEY (sno,hno,sdata)”,但如果定义成“sno UNIQUE NOT NULL,hno UNIQUE NOT NULL”,要求“sno”的值不能重复,“hno”的值也不能重复,这样就起不到联合作主键的作用了,所以在定义表的约束时,要注意主键约束的正确使用。

7.表创建存在先后顺序

创建表时,如果存在外键约束,则应先创建无外键关联的父表,再创建子表,因为外键约束是建立在子表上的。如果先创建子表,那么建立外键约束时选择不到外键关联的父表。

8.外键建立在子表上

在Oracle数据库中外键约束建立在子表上。

9.名称已被一现有约束条件占用

在Oracle数据库中,约束的名称在一个方案中必须是惟一的,所以一般情况下用户不自己定义约束的名称,而由系统给定约束名称,用户自己定义时要注意在同一方案中约束的名称不要相同。

10.表只能具有一个主键

在Oracle数据库中,一个表的主键约束是惟一的,但这并不表明一个表的主键字段是惟一的,一个表的主键可以是一个字段,也可以多个字段联合作主键。例如,员工表主键是员工编号,医院主键是医院编号,但消费表主键则是员工编号、医院编号和消费日期3个字段。如果是多个字段联合作主键,则定义成表级约束。

11.无法减小列长度, 因为一些值过大

在Oracle数据库中,要改变表中字段的类型或缩小字段长度,该字段的所有记录值必须为空,如果该字段存在记录值,则字段长度只能扩大,不能缩小。

12.表删除存在先后顺序

删除存在外键关联的表的顺序与创建表的顺序正好相反,应先删除子表,再删除父表,否则会出现“表中的惟一/主键被外部关键字引用”错误,所以本书案例中应先删除“staff”表,再删除“business”表。

13.插入或修改数据时,违反主键等各种约束错误

在插入数据或修改数据时,插入的数据或修改后的数据应满足创建表时的约束条件。解决方法视违反约束的具体情况而定。首先查看违反了什么约束,再查看约束的具体内容,如果是主键约束,则主键的值不能为空,不能重复;如果是检查约束,则应符合检查条件;如果是外键约束,则应符合参照完整性;如果是惟一性约束,则字段的值不能重复;如果是非空约束,则字段不能不赋值。

14.分组查询时,出现“不是GROUP BY表达式”错误

分组查询时,显示列表项中只能出现分组字段和利用聚集函数得到的统计结果,例如:

  SELECT bno,sno, COUNT(sno) FROM staff GROUP BY bno;

在显示列表项中出现非分组信息“sno”,这时就会提示“不是GROUP BY表达式”的错误信息,解决方法为在显示列表项中删除非分组、非聚集信息,正确的命令为

  SELECT bno, COUNT(sno) FROM staff GROUP BY bno;

15.多表查询时出现结果不正确

多表查询时,必须带WHERE子句,因为多表查询时必须带表间连接条件,即外键关联条件。如果没有外键关联条件,那么查询的结果为多表间的笛卡儿积运算,而关系是笛卡儿积的子集,因此要想得到正确的多表查询结果,必须写明表间的外键关联条件。

16.为表主键创建索引发生错误

  创建数据表时,系统自动为表的主键创建升序索引,如果用户再为该表的主键创建升序索引,那么系统就会出错。如果用户为该表的主键创建降序索引,那么该索引可以被创建。

17.视图中常见的问题

  创建一个视图之后,查看视图发现视图中有重复出现的列值,这时,请查看视图连接中WHERE条件是否正确。

五、拓展题

数据库链接的创建及使用

实验四  PL/SQL编程

一、实验目的及要求

  (1) 掌握PL/SQL块结构、PL/SQL的基本语法、PL/SQL的控制结构。

  (2) 掌握PL/SQL块中使用复合数据类型和游标的方法。

(3) 掌握PL/SQL异常处理技术。

(4) 掌握存储过程、存储函数、触发器高级数据库对象的基本作用。

(5) 掌握存储过程、存储函数、触发器的建立、修改、查看、删除操作。

二、实验主要内容

 (1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。

(2) 记录利用SQL*Plus或iSQL*Plus编写、执行PL/SQL程序的命令。

(3) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。

  (4) 记录利用企业管理器管理存储过程、存储函数、触发器的方法。

(5) 记录利用SQL*Plus和iSQL*Plus管理存储过程、存储函数、触发器的命令。

三、实验仪器设备

在局域网环境下,有一台服务器和若干台客户机。服务器成功安装Oracle 10g数据库服务器(企业版),客户机成功安装Oracle 10g客户端软件,网络服务配置正确,数据库和客户端正常工作。

四、实验步骤

1.在SQL*Plus中使用PL/SQL块处理

EMP表中职工号7788的职工,如果工资小于3000那么把工资更改为3000

SQL>DECLARE

X  NUMBER(7,2);

BEGIN

    SELECT sal INTO x FROM emp  WHERE empno = 7788;

    IF x < 3000 THEN  UPDATE emp  SET sal = 3000

                           WHERE  empno = 7788;

    END IF;

END;

如果想运行缓冲区的内容,那么可以用RUN命令或者/命令。请参阅第一章有关内容。

2.无参数的存储过程

CREATE OR REPLACE PROCEDURE proc_execution

IS

BEGIN

UPDATE EMP SET ENAME = ‘yourname’ 

where EMPNO = 9010;

END proc_execution;

存储过程的在SQL*Plus中运行

SQL>EXECUTE proc_execution

3.带输入参数的存储过程:

解雇给定职工号的职工,并调用proc_execution:

SQL>CREATE OR REPLACE PROCEDURE fire_emp

(v_emp_no  IN  emp.empno%type)

IS

BEGIN

  proc_execution;

DELETE FROM EMP WHERE empno = v_emp_no;

END fire_emp;

/

Procedure created.

SQL>EXECUT fire_emp(7654)

PL/SQL procedure successfully completed.

存储过程删除了职工号7654的职工。

4.带输入输出的存储过程

查询EMP中给定职工号的姓名、工资和佣金。

SQL> CREATE OR REPLACE PROCEDURE query_emp

  (v_emp_no  IN  emp.empno%type,

   v_emp_name  OUT  emp.ename%type,

   v_emp_sal  OUT  emp.sal%type,

   v_emp_comm  OUT  emp.comm%type)

IS

  BEGIN

    SELECT ename, sal, comm

    INTO v_emp_name, v_emp_sal, v_emp_comm 

    FROM EMP WHERE empno = v_emp_no;

END query_emp;

/

Procedure created.

SQL> VARIABLE emp_name varchar2(15);

SQL> VARIABLE emp_sal number;

SQL> VARIABLE emp_comm number;

SQL> EXECUTE query_emp(7654,:emp_name, :emp_sal, :emp_comm);

PL/SQL procedure successfully completed.

SQL> PRINT emp_name;

EMP_NAME

-------------------

MARTIN

5.用Function查询出EMP中给定职工号的工资:

SQL> CREATE OR REPLACE FUNCTION get_sal

  (v_emp_no  IN  emp.empno%type)

  RETURN number

  IS

    V_emp_sal  emp.sal%type := 0;

    BEGIN

      SELECT sal INTO v_emp_sal 

      FROM EMP WHERE empno = v_emp_no;

      RETURN (v_emp_sal);

    END get_sal;

   /

Procedure created.

SQL>VARIABLE emp_sal number

SQL>EXECUTE :emp_sal := get_sal(7654)

PL/SQL procedure successfully completed

.

SQL>PRINT emp_sal

  EMP_SAL

-------------------

     1250

6.用异常处理完善程序

如例3中:解雇给定职工号的职工,并调用proc_execution:

SQL> CREATE OR REPLACE PROCEDURE fire_emp

  (v_emp_no  IN  emp.empno%type)

IS

  BEGIN

    proc_execution;

    DELETE FROM EMP WHERE empno = v_emp_no;

  END fire_emp;

Procedure created.

SQL>EXECUT fire_emp(7654)

如果职工号7654的职工不存在则出错。为了避免出错我们使用了EXCEPTION语句。

SQL> CREATE OR REPLACE PROCEDURE fire_emp

  (v_emp_no  IN  emp.empno%type)

IS

  BEGIN

    proc_execution;

    DELETE FROM EMP WHERE empno = v_emp_no;

    IF SQL%NOTFOUND THEN

      RAISE_APPLICATION_ERROR

      (-20202,'Employee does not exists.');

    END IF;

  END fire_emp;

Procedure created.

SQL>EXECUT fire_emp(7654)

就不会出错了。

7创建存储过程,实现功能为:删除scott.emp表中任意给定职工号的职工记录;

8创建函数,实现功能为:在scott.emp表和scott.dept表中查询出任意给定职工号的职工姓名及职工所在部门的名称。

9创建触发器,实现更新dept表中的deptno值,级联更新emp表中相应值。

10对存储过程、函数及触发器实现查看、修改、删除等基本操作。

五、拓展题

使用命令方式创建数据库

实验五 oracle安全管理及备份恢复

一、实验目的及要求

掌握Oracle的安全管理方法。掌握oracle数据库常用的备份和恢复方法。

二、实验主要内容

(1) 概要文件的建立、修改、查看、删除操作。

(2) 用户的建立、修改、查看、删除操作。

(3) 权限的建立、修改、查看、删除操作。

(4) 角色的建立、修改、查看、删除操作。

5数据备份与恢复的方法

6Oracle备份方案的制定

三、实验仪器设备

在局域网环境下,有一台服务器和若干台客户机。服务器成功安装Oracle 10g数据库服务器(企业版),客户机成功安装Oracle 10g客户端软件,网络服务配置正确,数据库和客户端正常工作。

四、实验步骤

1、安全管理

 (1) 创建概要文件。

① 利用企业管理器创建概要文件“ygbx+学号_pro”,要求在此概要文件中CPU/会话为1000,读取数/会话为2000,登录失败次数为3,锁定天数为10。

② 利用SQL*Plus或iSQL*Plus,创建概要文件“ygbx+学号_pro_sql”,其结构与“ygbx+学号_pro”一致。

(2) 查看概要文件。

① 利用企业管理器查看概要文件“ygbx+学号_pro”的信息。

② 利用SQL*Plus或iSQL*Plus,从DBA_PROFILES数据字典中查看“ygbx+学号_pro_sql”概要文件的资源名称和资源值等信息。

③ 利用SQL*Plus或iSQL*Plus,从查看“ygbx+学号_pro_sql”概要文件中锁定天数的值。

(3) 修改概要文件。

① 利用企业管理器,修改“ygbx+学号_pro”概要文件,将CPU/会话改为4000,连接时间为60。

② 利用SQL*Plus或iSQL*Plus,修改“ygbx+学号_pro_sql”概要文件,将并行会话设为20,读取数/会话设为DEFAULT。

(4) 创建用户。

① 利用企业管理器,创建“ygbxuser+学号”用户,密码为“user+学号”,默认表空间为“ygbx_tbs”。

② 利用SQL*Plus或iSQL*Plus,创建“ygbxuser+学号_sql”用户,密码为“user+学号+sql”,该用户处于锁状态。

③ 利用SQL*Plus或iSQL*Plus,将“ygbx+学号_pro”概要文件赋予 “ygbxuser+学号”用户。

④ 利用SQL*Plus或iSQL*Plus,将“ygbx+学号_pro_sql”概要文件赋予 “ygbxuser+学号_sql”用户。

(5) 查看用户。

① 利用企业管理器,查看“ygbxuser+学号”用户的信息。

② 利用SQL*Plus或iSQL*Plus,查看“ygbxuser+学号_sql”用户的信息,并查看该用户验证的方式。

③ 利用SQL*Plus或iSQL*Plus,从DBA_USERS数据字典中查看“ygbxuser+学号_sql”用户的默认表空间和临时表空间的信息。

(6) 修改用户。

① 利用企业管理器,修改“ygbxuser+学号”用户,验证方式为外部。

② 利用SQL*Plus或iSQL*Plus,修改“ygbxuser+学号_sql”用户,将该用户解锁,并将密码改为“sql+学号+user”。

(7) 权限管理。

① 利用企业管理器,授予“ygbxuser+学号”用户“CREATE ANY TABLE”、“CREATE ANY INDEX”、“ALTER ANY TABLE”、“ALTER ANY INDEX”、“DROP ANY TABLE”和“DROP ANY INDEX”系统权限。

② 利用SQL*Plus或iSQL*Plus,授予“ygbxuser+学号_sql”用户“SYSOPER”系统权限。

③ 利用企业管理器,将“ygbxuser+学号”用户增加到“SYSTEM”方案中对“help”表的查看、修改、删除等对象权限。

④ 利用SQL*Plus或iSQL*Plus,收回“ygbxuser+学号_sql”用户在“SYSTEM”方案中对“help”表的查看、修改、删除等对象权限。

⑤ 利用SQL*Plus或iSQL*Plus,收回“ygbxuser+学号_sql”用户的“SYSOPER”系统权限。

(8) 创建角色。

① 利用企业管理器,创建“ygbxrole+学号”角色,赋予该角色能对表、索引、存储过程、序列、同义词进行基本操作的权限。

② 利用SQL*Plus或iSQL*Plus,创建“ygbxrole+学号_sql”角色,该角色具有 “SYSDBA”系统权限,并将该角色赋予“ygbxuser+学号_sql”用户。

(9) 查看角色。

① 利用企业管理器,查看“ygbxrole+学号”角色所具有的所有权限。

② 利用SQL*Plus或iSQL*Plus,查看“ygbxrole+学号_sql”角色所具有的所有权限。

(10) 修改角色。

① 利用企业管理器,修改“ygbxrole+学号”角色,增加对角色的基本操作,并收回存储过程和序列的操作权限。

② 利用SQL*Plus或iSQL*Plus,修改“ygbxrole+学号_sql”角色,收回“SYSDBA”系统,而授予“SELECT ANY TABLE”系统权限。

(11) 删除角色。 

① 利用企业管理器,删除“ygbxrole+学号”角色。

② 利用SQL*Plus或iSQL*Plus,删除“ygbxrole+学号_sql”角色。

(12) 删除概要文件。

① 利用企业管理器,删除“ygbx+学号_pro”概要文件,查看“ygbxuser+学号”用户的概要文件。

② 利用SQL*Plus或iSQL*Plus,删除“ygbx+学号_pro_sql”概要文件,查看“ygbxuser+学号_sql”用户的概要文件。

(13) 删除用户。

① 利用企业管理器,删除“ygbxuser+学号”用户。

② 利用SQL*Plus或iSQL*Plus,删除“ygbxuser+学号_sql”用户。

2、数据库备份与恢复

1Oracle物理备份与恢复

.0.准备工作:

(1) 查看数据库是否运行于归档模式下:

请给出查询的结果:

(2) 干净的关闭数据库,做一个完全的冷备份。

提示:a.使用showdown命令;  b.复制数据文件、日志文件和控制文件到安全地方

(3) 把数据库改为归档模式

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database open;

设置成自动归档

SQL> alter system set log_archive_start = true scope=spfile;

注意:本实验中的很多命令路径参数需根据自己的实现环境作出修改!!

1.实验1

数据库系统数据文件和回退段遭破坏的情况下的恢复。此时数据库的状态是关闭的。

(1) 先启动数据库,用scott用户建立test表,并插入两条数据。

SQL> create table scott.test (id int);

表已创建。

SQL> insert into scott.test values(1);

已创建 行。

SQL> insert into scott.test values(2);

已创建 行。

SQL> commit;

提交完成。

(2)模拟数据库遭意外被迫关闭,并且系统数据文件丢失。

SQL> shutdown abort

oracle服务停掉,移除SYSTEM01.dbfUNDOTBS01.DBF文件(即将这两个文件移到其他文件夹下)。

(3)启动服务,启动数据库, 提示如下错误

a. 启动服务

b. 启动数据库

SQL> startup

请给执行结果:

(4)把备份的SYSTEM01.dbfUNDOTBS01.DBF文件复制回去

a. 执行以下命令:

请给执行结果:

然后就可以打开数据库,查看scott用户的test表。

SQL> alter database open;

SQL> select * from scott.test;

   请给执行结果:

实验2

数据库是打开的,这时损坏的文件是用户的数据文件而不是systemundo文件。

(1)scott用户在users表空间建立test1

SQL> create table scott.test1(id int)

  2  tablespace users;

表已创建。

(2) 插入两条数据

SQL> insert into scott.test1 values(1);

已创建 行。

SQL> insert into scott.test1 values(2);

已创建 行。

SQL> commit;

提交完成。

(3)当前日志归档

SQL> alter system archive log current;

系统已更改。

(4)现在破坏users表空间,使其离线,然后移除users01.dbf到一个指定文件夹(备份)

SQL> alter tablespace users offline;

表空间已更改。

执行:SQL> alter tablespace users online;

 请给执行结果:

此时出现错误,users表空间不能在线了。这时把备份的users01.DBF还原回去。

然后,执行:SQL> recover tablespace users;

(5)完成介质恢复。

SQL> alter tablespace users online;

表空间已更改。

SQL> select * from scott.test1;

      请给执行结果:

实验3数据文件没有备份(不能使systemundo文件)的恢复。

(1)创建表空间testspace

SQL Plus中依次执行以下语句,给出最后的执行结果:

SQL>  create tablespace testspace  datafile 'C:\oracle\product\10.1.0\db_1\TestDB\testspace.dbf' size 10m;

SQL> create table scott.test3(id int)

       tablespace testspace;

SQL> commit;

SQL> alter system switch logfile;

SQL> insert into scott.test3 values(1);

SQL> commit;

SQL> alter tablespace testspace offline;

SQL> select * from scott.test3;

 请给执行结果:

(2)由于没有备份数据文件,需重新创建一个

SQL> alter database create datafile

       'C:\oracle\product\10.1.0\db_1\TestDB\testspace.dbf';

SQL> recover tablespace testspace;

(3) 完成恢复

SQL> alter tablespace testspace online;

表空间已更改。

SQL> select * from scott.test3;

请给执行结果:

2)逻辑备份:导入导出实验

实验4:模式的导入导出

案例:将scott/tiger用户对应的模式导出,通过导出文件将其导入到Test用户(为一个空用户)对应的模式中,包括该模式中的所有对象的定义和数据。

1.准备工作

(1)创建用户:

Create user test

Identified by test;

(2)授权:

注:这儿做了简化处理,实际工作中,尽量不要授DBA权限给一般用户

2.数据的导出与导入

(1)数据准备

scott身份登录: conn scott/tiger

①创建测试用表:

create table  jobs(

  name  varchar2(20),

job    varchar2(40),

  sales   number);

加入数据:

insert into jobs values('IT_Test','software testing',3000);

提交:

 commit;

②创建测试用表scott_test

 create table scott_test(

 name  varchar2(10),

 age    number);

加入数据:

 insert into scott_test values('manager','40');

(2)以管理员身份登录:

 conn as sysdba;

 alter system enable restricted session;

 (3)导出数据库:

 在DOS提示符下执行:

exp system/ testdb full=y file=test.dmp

执行时,会要求输入system的口令,请根据实际情况输入。

 (4)恢复数据库运行状态

 conn as sysdba;

 alter system disable restricted session;

 (5)进行数据库的导入:

以下是一示例:

imp system/testdb fromuser=scott touser=test tables=(scott_test,jobs) file=test.dmp ignore=y;

请给执行结果:

3.结果检验

对导入的数据进行查询,以确定导入是否成功,给出结果截图:

(1)test身份登录到数据库

(2)查询刚才导出(导入)表中的某个表(Jobs):

请给执行结果:

3RMAN使用基础

测试说明

测试目的

验证RMAN备份与恢复全过程。记录整个过程的操作细节。

利用RMAN的备份与恢复可完成如下工作:

(1) 数据库备份/恢复;

(2) 同一主机,不同磁盘阵列,相同数据存储路径(模式)的数据迁移;(在恢复过程中改变数据存储路径/模式过程待验证)

(3) 不同主机,相同操作系统、同一数据库版本之间的的数据库迁移。(不同数据库版本之间是否可利用RMAN 备份与恢复进行数据迁移待验证。)

测试环境说明

· OS:Windows XP

· ORACLE VERSION: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – Prod

· ORACLE运行模式:归档模式

ORACLE数据存储:文件系统,存储于D:\oracle\product\10.1.0\oradata\orcl 

数据备份过程

1.连接本地数据库: rman target /

通过rman连接本地数据库非常简单,进入到命令提示符界面:

2.RMAN 数据库全备份

rman nocatalog target /

run 

{

allocate channel c1 type disk;

allocate channel c2 type disk;

allocate channel c3 type disk;

backup database format 'C:\db_full_%U' include current controlfile;

sql 'alter system archive log current';

#crosscheck archivelog all;

backup format 'c:\arch_full_%U' archivelog all delete input;

release channel c1;

release channel c2;

release channel c3;

}

【注意】

l RMAN采用无恢复目录模式

l 备份数据库过程包含当前控制文件备份

l 数据库处于归档模式,备份过程包含所有归档日志的备份

l 数据库必须处于mount或者open状态,才能进行数据库备份

3.数据库在数据全备份后继续操作

1)在RMAN全备份后继续数据库的操作。即在测试表中插入数据。

SQL> conn kfzjd/kfzjd

已连接。

SQL> insert into t values(100);

已创建 1 行。

SQL> insert into t values(200);

已创建 1 行。

SQL> insert into t values(300);

已创建 1 行。

SQL> insert into t values(400);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

        ID

----------

         1

         2

         3

       100

       200

       300

       400

已选择7行。

2)正常关闭数据库。并删除原数据库所有文件,包括:控制文件、数据文件、日志文件。以模拟更换磁盘阵列或者文件丢失的情况。

SQL> conn / as sysdba

已连接。

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> host move D:\oracle\product\10.1.0\oradata\orcl D:\oracle\product\10.1.0\oradata\orcl.bak

【注意】

l 删除文件过程,将以更目录名称的方式,用以模拟新盘阵上的文件存储路径与原系统不同。

此时,重新启动数据库过程必然失败。

SQL> conn / as sysdba

已连接。

SQL> startup

ORACLE instance started.

Total System Global Area  171966464 bytes

Fixed Size                   787988 bytes

Variable Size             145750508 bytes

Database Buffers           25165824 bytes

Redo Buffers                 262144 bytes

ORA-00205: ?????????, ??????, ???????

【注意】此时由于实例存在,但是database全部丢失,则INSTANCE启动成功,但是database启动失败。即可,NOMOUNT状态(只启动INSTANCE)成功;进入MOUNT状态时,由于控制文件丢失,MOUNT 失败。数据库启动过程不能继续。

数据库恢复过程

当前情况下,所有的控制文件、数据库文件、联机日志文件均全部丢失。按照数据库恢复/启动过程,应按照先恢复数据库控制文件,再恢复数据文件的步骤进行。

1. 从RMAN备份中恢复控制文件

在本例子中,RMAN备份脚本进行了控制文件的备份。所以,控制文件的恢复过程可以利用RMAN的备份完成。

此时,也存在两种情况。

· RMAN设置了控制文件自动备份。

· RMAN未设置控制文件自动备份,而由RMAN脚本进行控制文件备份。如本例所示。

对于此两种情况,分别说明如下。

(1) RMAN未设置控制文件自动备份

C:\>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle.  All rights reserved.

连接到目标数据库: ORCL (DBID=1158376346)

正在使用目标数据库控制文件替代恢复目录

RMAN> show all;

RMAN 配置参数为:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP OFF;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # 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 ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S

NCFORCL.ORA'; # default

【注意】RMAN 未设置控制文件自动备份。此时如果RMAN 的直接恢复将不成功。如下所示。

RMAN> startup  nomount;

Oracle 例程已启动

系统全局区域总计     171966464 字节

Fixed Size                      787988 字节

Variable Size                145750508 字节

Database Buffers              25165824 字节

Redo Buffers                    262144 字节

RMAN> restore controlfile from autobackup;(由于没有设置自动备份控制文件所以出错)

启动 restore 于 15-8月 -07

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area

用于搜索的数据库名 (或锁定名称空间): ORCL

通道 ORA_DISK_1: 在恢复区域中找到自动备份

通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\

ORCL\AUTOBACKUP\2007_08_14\O1_MF_S_630614292_3D31JOHN_.BKP

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of restore command at 08/15/2007 09:54:16

ORA-19504: 无法创建文件"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"

ORA-27040: 文件创建错误, 无法创建文件

OSD-04002: 无法打开文件

O/S-Error: (OS 3) 系统找不到指定的路径。

RMAN> restore controlfile;(语法就错误了)

启动 restore 于 15-8月 -07

使用通道 ORA_DISK_1

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of restore command at 08/15/2007 09:54:31

RMAN-06563: controlfile or SPFILE must be restored using FROM AUTOBACKUP

RMAN> restore database;(数据库未到MOUNT状态,不能进行^_^)

启动 restore 于 15-8月 -07

使用通道 ORA_DISK_1

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of restore command at 08/15/2007 09:56:57

ORA-01507: 未装载数据库

RMAN> recover database using backup controlfile;(曾经见过ITPUB上有人怎么写,但是无法通过)

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-00558: error encountered while parsing input commands

RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, aux

iliary, allow, check, delete, from, high, noredo, noparallel, parallel, ;, skip,

 tablespace, test, until"

RMAN-01008: the bad identifier was: using

RMAN-01007: at line 1 column 18 file: standard input

RMAN> restore database using backup controlfile; (数据库未到MOUNT状态,不能进行^_^)

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-00558: error encountered while parsing input commands

RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, cha

nnel, check, controlfile, clone, database, datafile, device, from, force, high,

(, preview, ;, skip, spfile, standby, tablespace, until, validate"

RMAN-01008: the bad identifier was: using

RMAN-01007: at line 1 column 18 file: standard input

RMAN>

由于RMAN未设置控制文件自动备份。则可以利用程序包,从备份集中恢复。如下:

SQL> startup nomount

ORACLE 例程已经启动。

Total System Global Area  171966464 bytes

Fixed Size                   787988 bytes

Variable Size             145750508 bytes

Database Buffers           25165824 bytes

Redo Buffers                 262144 bytes

SQL> alter session set nls_language=american;

Session altered.

SQL> declare  

  2   devtype varchar2(256);

  3   done   boolean;

  4  begin  

  5   devtype := dbms_backup_restore.deviceallocate(NULL);  

  6   dbms_backup_restore.restoresetdatafile;  

  7   dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'

);

  8   dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);

  9  end;

 10  /

declare

*

ERROR at line 1:

ORA-19624: operation failed, retry possible

ORA-19504: failed to create file

"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"

ORA-27040: file create error, unable to create file

OSD-04002: ????????????

O/S-Error: (OS 3) ??????????????????????

ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 4772

ORA-06512: at line 8

【注意】由出错了!报告无法创建指定的控制文件,是过程有错误吗?不是,是由于文件目录并不存在。(此时是测试时,故意留下的问题。还记得前面采用修改目录名的方式启动删除所有文件的步骤吗?)

创建D:\oracle\product\10.1.0\oradata\orcl目录后继续。此时该目录下无任何文件。(再留下一个问题,文件存储采用裸设备呢?)

SQL> 

declare  

  2   devtype varchar2(256);

  3   done   boolean;

  4  begin  

  5   devtype := dbms_backup_restore.deviceallocate(NULL);  

  6   dbms_backup_restore.restoresetdatafile;  

  7   dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'

);

  8   dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);

  9  end;

 10  /

PL/SQL 过程已成功完成。

此时在D:\oracle\product\10.1.0\oradata\orcl目录中,可看到一个控制文件。D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL

此时启动数据库试验一下。

SQL> startup nomount

ORACLE 例程已经启动。

Total System Global Area  171966464 bytes

Fixed Size                   787988 bytes

Variable Size             145750508 bytes

Database Buffers           25165824 bytes

Redo Buffers                 262144 bytes

SQL> alter database mount;

alter database mount

*

第 1 行出现错误:

ORA-00205: ?????????, ??????, ???????

有出错了!看看ORA-00205的说明

ORA-00205 error in identifying controlfile, check alert log for more info

Cause: The system could not find a control file of the specified name and size.

Action: One of the following:

Check that the proper control file name is referenced in the CONTROL_FILES initialization parameter in the initialization parameter file and try again. 

When using mirrored control files, that is, more than one control file is referenced in the initialization parameter file, remove the control file name listed in the message from the initialization parameter file and restart the instance. If the message does not recur, remove the problem control file from the initialization parameter file and create another copy of the control file with a new file name in the initialization parameter file.

明白了!原来是缺少控制文件。检查一下spfile的设置。

SQL> show parameter control_files

NAME                                 TYPE                  VALUE

------------------------------

control_files                        string                 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL

果然如此。简单,复制controlfile即可。复制该名后继续。

SQL> alter database mount;

数据库已更改。

SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

OK!数据库可以MOUNT了,但是不能OPEN。和预期目标一样。此时D:\oracle\product\10.1.0\oradata\orcl目录下文件如下。

2007-08-15  10:45    

          .

2007-08-15  10:45    

          ..

2007-08-15  10:37         2,867,200 CONTROL01.CTL

2007-08-15  10:37         2,867,200 CONTROL02.CTL

2007-08-15  10:37         2,867,200 CONTROL03.CTL

该目录下只有三个控制文件。和预计的一样。

至此,控制文件恢复完成,可以进行下一步了。

【注意】遗留一个问题。此时是由RMAN备份的控制文件中恢复。那么如果RMAN没有备份控制文件,同时RMAN没有设置自动备份控制文件,那么该如何恢复呢?当然,如果完全没有控制文件的备份,那么就彻底歇菜了!

对于控制文件的手工备份,可以采用

l Alter database backup controlfile to trace;(此恢复有点难度)

l Alter database backup control to ‘c:\control.bak’;(此恢复简单)

(2) RMAN设置了控制文件自动备份

建议开启RMAN 自动备份控制文件选项。操作如下:

RMAN> show all;

RMAN 配置参数为:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP OFF; (未开启控制文件自动备份)

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # 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 ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S

NCFORCL.ORA'; # default

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; (设置控制文件自动备份)

旧的 RMAN 配置参数:

CONFIGURE CONTROLFILE AUTOBACKUP OFF;

新的 RMAN 配置参数:

CONFIGURE CONTROLFILE AUTOBACKUP ON;

已成功存储新的 RMAN 配置参数

RMAN> show all;

RMAN 配置参数为:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP ON; (开启控制文件自动备份)

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # 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 ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S

NCFORCL.ORA'; # default(控制文件自动备份存储位置)

RMAN>

经过以上设置后,会在数据库的结构发生变化的时候自动备份控制文件。

RMAN设置了控制文件自动备份后,恢复控制文件的过程如下:

RMAN> startup nomount

Oracle 例程已启动

系统全局区域总计     171966464 字节

Fixed Size                      787988 字节

Variable Size                145750508 字节

Database Buffers              25165824 字节

Redo Buffers                    262144 字节

RMAN> restore controlfile from autobackup;(从控制文件的自动备份集合中恢复控制文件)

启动 restore 于 15-8月 -07

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area

用于搜索的数据库名 (或锁定名称空间): ORCL

通道 ORA_DISK_1: 在恢复区域中找到自动备份

通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2007_08_15\O1_MF_S_63070

8486_3D5XJB9R_.BKP

通道 ORA_DISK_1: 从自动备份复原控制文件已完成

输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL

输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL

输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL

完成 restore 于 15-8月 -07

RMAN> alter database mount;将数据库启动到MOUNTED状态继续后续的文件恢复

数据库已装载

释放的通道: ORA_DISK_1

利用以上语句完成控制文件自从控制文件自动备份集中恢复。完成控制文件的恢复操作。将在D:\oracle\product\10.1.0\oradata\orcl目录中生成新的控制文件。注意,此时恢复的控制文件为全部的控制文件。本例中为3个控制文件。

2. 从手动控制文件备份中恢复

手动备份控制文件的方式有两种。

控制文件备份方式(1)

SQL> alter database backup controlfile to 'c:\contrilfile.bak';

数据库已更改。

方式(1)相当于为控制文件进行了一份COPY。在恢复时间,参看spfile中的control_files参数的设置进行恢复即可。

控制文件备份方式(2)

SQL> alter database backup controlfile to trace;

数据库已更改。

方式(2)将在user_dump_dest目录中生成一个trace文件。该文件中将生成控制文件的生成脚本。

本例中user_dump_dest路径为D:\oracle\product\10.1.0\admin\orcl\udump。控制文件生成脚本如下:

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 454

LOGFILE

  GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG'  SIZE 10M,

  GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG'  SIZE 10M,

  GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG'  SIZE 10M,

  GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG'  SIZE 10M

-- STANDBY LOGFILE

DATAFILE

  'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',

  'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',

  'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',

  'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'

CHARACTER SET ZHS16GBK

;

下面将对利用方法(2)生成的控制文件脚本进行控制文件恢复的步骤说明如下:

SQL> conn  / as sysdba

已连接到空闲例程。

SQL> startup nomount(只是启动INSTANCE)

ORACLE 例程已经启动。

Total System Global Area  171966464 bytes

Fixed Size                   787988 bytes

Variable Size             145750508 bytes

Database Buffers           25165824 bytes

Redo Buffers                 262144 bytes

SQL> select status from v$instance;

STATUS

------------------------

STARTED

利用trace中的创建控制文件脚本,创建控制文件。注意,此时创建的控制文件为所有控制文件,本例中为3个控制文件。创建控制文件位置、数量均由spfile指定。

SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

  2      MAXLOGFILES 16

  3      MAXLOGMEMBERS 3

  4      MAXDATAFILES 100

  5      MAXINSTANCES 8

  6      MAXLOGHISTORY 454

  7  LOGFILE

  8    GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG'  SIZE 10M,

  9    GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG'  SIZE 10M,

 10    GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG'  SIZE 10M,

 11    GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG'  SIZE 10M

 12  -- STANDBY LOGFILE

 13  DATAFILE

 14    'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',

 15    'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',

 16    'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',

 17    'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'

 18  CHARACTER SET ZHS16GBK

 19  ;

控制文件已创建

注意:控制文件一旦创建,则数据库将启动到MOUNTED状态。

SQL> select status from v$instance;

STATUS

------------------------

MOUNTED

SQL> alter session set nls_language=american;

Session altered.

根据实际情况,看是否需要进行介质恢复

SQL> recover database;

ORA-00283: recovery session canceled due to errors

ORA-00264: no recovery required

SQL> alter database open;

Database altered.

3.恢复数据库数据文件

在控制文件恢复后,可以开始数据库文件的恢复。

D:\oracle\product\10.1.0>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle.  All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount

Oracle 例程已启动

系统全局区域总计     171966464 字节

Fixed Size                      787988 字节

Variable Size                145750508 字节

Database Buffers              25165824 字节

Redo Buffers                    262144 字节

RMAN> alter database mount;

数据库已装载

RMAN> restore database;

启动 restore 于 15-8月 -07

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=160 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件

正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF

正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF

通道 ORA_DISK_1: 已恢复备份段 1

段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417

通道 ORA_DISK_1: 恢复完成

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件

正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF

正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF

通道 ORA_DISK_1: 已恢复备份段 1

段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417

通道 ORA_DISK_1: 恢复完成

完成 restore 于 15-8月 -07

至此数据库恢复存储完成但是注意并非数据库恢复完成。)

检查D:\oracle\product\10.1.0\oradata\orcl目录内容多了各数据库文件。

2007-08-15  11:34         2,867,200 CONTROL01.CTL

2007-08-15  11:34         2,867,200 CONTROL02.CTL

2007-08-15  11:34         2,867,200 CONTROL03.CTL

2007-08-15  11:40       220,209,152 SYSAUX01.DBF

2007-08-15  11:40       461,381,632 SYSTEM01.DBF

2007-08-15  11:40        26,222,592 UNDOTBS01.DBF

2007-08-15  11:40         5,251,072 USERS01.DBF

               7 个文件    721,666,048 字节

但是注意,此时并没有应有的连接日志文件?那么难道日志文件并非CONTROLFILE文件创建?的确如此!那么日志文件的创建,在什么时候呢?后面有所交代。

如果此时强行打开数据库则报告需要介质恢复。(正常)

SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-01113: 文件 1 需要介质恢复

ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF'

继续进行RMAN数据库恢复操作

RMAN> recover database;

启动 recover 于 15-8月 -07

使用通道 ORA_DISK_1

正在开始介质的恢复

无法恢复介质

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of recover command at 08/15/2007 11:40:38

ORA-00283: recovery session canceled due to errors

RMAN-11003: failure during parse/execution of SQL statement: alter database reco

ver if needed

 start

ORA-00283: 恢复会话因错误而取消

ORA-00313: 无法打开日志组 6 (用于线程 1) 的成员

ORA-00312: 联机日志 6 线程 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

出错了?!不应该呀。检查以上过程发现,其实是数据库日志组丢失了。是这样吗?回想以上过程,的确如此,因为在进行了RMAN全备份后,进行了kfzjd用户表t中插入数据的操作,并且此过程,我们假设了所有的文件均丢失,那么意味着日志文件也丢失了。那么是否会丢失数据呢?结果是必然丢失数据,待验证吧。

既然此时日志组不存在,那么只能进行不完全恢复了。

SQL> recover database until cancel;

ORA-00279: 更改 361912 (在 08/15/2007 09:05:30 生成) 对于线程 1 是必需的

ORA-00289: 建议:

D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1_

14_%U_.ARC

ORA-00280: 更改 361912 (用于线程 1) 在序列 #14 中

指定日志: {=suggested | filename | AUTO | CANCEL}

auto

ORA-00308: 无法打开归档日志

'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1

_14_%U_.ARC'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开归档日志

'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1

_14_%U_.ARC'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open resetlogs;

数据库已更改。

SQL> conn kfzjd/kfzjd

已连接。

SQL> select * from t;

        ID

----------

         1

         2

         3

SQL>

检查D:\oracle\product\10.1.0\oradata\orcl目录,所有文件均得到恢复。

2007-08-15  12:36         2,867,200 CONTROL01.CTL

2007-08-15  12:36         2,867,200 CONTROL02.CTL

2007-08-15  12:36         2,867,200 CONTROL03.CTL

2007-08-15  12:32        10,486,272 REDO03.LOG

2007-08-15  12:32        10,486,272 REDO04.LOG

2007-08-15  12:32        10,486,272 REDO05.LOG

2007-08-15  12:32        10,486,272 REDO06.LOG

2007-08-15  12:32       220,209,152 SYSAUX01.DBF

2007-08-15  12:32       461,381,632 SYSTEM01.DBF

2007-08-15  12:32        26,222,592 UNDOTBS01.DBF

2007-08-15  12:32         5,251,072 USERS01.DBF

              11 个文件    763,611,136 字节

               2 个目录  5,616,484,352 可用字节

【注意】自此数据库成功打开。但是,由于在数据库恢复过程中,由于日志文件全部丢失。那么自上一次数据库全备份后的所有数据必然全部丢失。由此看到如果需要数据库完全恢复,日志文件是多么的重要。

附加的测试过程

1.假设:日志文件没有丢失

修改以上的测试条件。假设除日志文件外,其他文件均丢失。在完成restore database后,将日志文件复制到原路径,之后进行数据恢复测试。

D:\oracle\product\10.1.0\oradata\orcl>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle.  All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup mount

Oracle 例程已启动

数据库已装载

系统全局区域总计     171966464 字节

Fixed Size                      787988 字节

Variable Size                145750508 字节

Database Buffers              25165824 字节

Redo Buffers                    262144 字节

RMAN> restore database;

启动 restore 于 15-8月 -07

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=160 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件

正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF

正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF

通道 ORA_DISK_1: 已恢复备份段 1

段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417

通道 ORA_DISK_1: 恢复完成

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件

正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF

正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF

通道 ORA_DISK_1: 已恢复备份段 1

段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417

通道 ORA_DISK_1: 恢复完成

完成 restore 于 15-8月 -07

RMAN> recover database;

启动 recover 于 15-8月 -07

使用通道 ORA_DISK_1

正在开始介质的恢复

完成介质的恢复

完成 recover 于 15-8月 -07

RMAN> alter database open;

数据库已打开

RMAN>

SQL> conn kfzjd/kfzjd

已连接。

SQL> select * from t;

        ID

----------

         1

         2

         3

       100

       200

       300

       400

已选择7行。

【注意】由于日志文件并没有丢失,那么数据库可进行完全恢复(数据均可恢复,不会丢失)。数据库打开时,不需要进行日志重置。

常用系统权限

常用系统权限如表1所示。

常见问题分析

(1) 授权重复的问题。

A用户本身具有了对A表的创建、删除的操作权限,而B用户同时具有对A表的创建、删除的操作权限。这时,B用户授予A用户对A表的创建、删除的操作权限时,系统不报重复授权的错误。

(2) 收回系统权限的问题。

当A用户授权B用户对A表的操作系统权限,B用户又授予C用户对A表的操作系统权限时,如果A用户收回B用户对A表的操作系统权限,那么C用户对A表的操作系统权限不会被级联收回。

(3) 收回对象权限的问题。

当A用户授权B用户对A对象的操作对象权限,B用户又授予C用户对A对象的操作对象权限时,如果A用户收回B用户对A对象的操作对象权限,那么C用户对A表的操作对象权限会被级联收回。

附录:员工医疗保险系统表

企业(business)表结构

2医院(hospital)表结构

3医保卡(card)表结构

4员工(staff)表结构

5就诊表(see)结构

6消费(consume)表结构

7医保(insurance)表结构

要求:

1、课程名称:大型数据库技术

2、实验时间:

实验序号

1班实验时间

2班实验时间

3班实验时间

4班实验时间

地点

1

2011.3.3

2011.3.2

2011.3.3

2011.3.2

2-415号楼19号实验室,11号实验室

2

2011.4.7

2011.4.6

2011.4.7

2011.4.6

2-415号楼19号实验室,11号实验室

3

2011.4.21

2011.4.20

2011.4.21

2011.4.20

2-415号楼19号实验室,11号实验室

4

2011.5.12

2011.5.11

2011.5.12

2011.5.11

2-415号楼19号实验室,11号实验室

5

2011.6.2

2011.6.1

2011.6.2

2011.6.1

2-415号楼19号实验室,11号实验室

3、实验报告中各项不能空缺,如果空缺打回重写

4、最后一页  实验课程小结必须要完成。

6、课程设计结束上交(各班收缴时请按照学号顺序整理好后交15102办公室)

你可能感兴趣的:(大学软件工程)