作者:empty 出版社:empty |
课程 IL001100
ORACLE数据库基础知识
ISSUE1.0
目录
课程说明1
课程介绍1
课程目标1
相关资料1
第1章 ORACLE数据库概述2
1.1 产品概述2
1.1.1 产品简介2
1.1.2 基本概念3
1.2 ORACLE系统结构4
1.2.2 ORACLE物理结构4
1.2.3 系统全局区6
1.2.4 进程8
1.3 存储管理9
1.3.2 逻辑结构10
1.3.3 表(Table)14
1.3.4 视图(View)18
1.3.5 索引(Index)18
1.3.6 同义词(Synonym)19
1.3.7 序列(Sequence)19
1.3.8 数据库链(Database Link)20
第2章 管理ORACLE数据库21
2.1 基本概念21
2.1.1 数据字典21
2.1.2 事务管理23
2.1.3 数据库管理员(DBA)24
2.1.4 ORACLE的四种状态25
2.2 SQL*Plus方式的ORACLE数据库启动和关闭26
2.2.1 启动数据库26
2.2.2 关闭数据库26
2.3 svrmgrl方式的ORACLE数据库启动和关闭28
2.3.1 启动数据库28
2.3.2 关闭数据库30
2.4 应用开发工具(SQL * Plus)31
2.4.1 SQL32
2.4.2 PL/SQL33
2.4.3 数据库管理工具36
2.5 ORACLE用户及权限管理36
2.5.1 ORACLE的用户管理37
2.5.2 ORACLE的权限管理38
2.6 ORACLE数据库的备份与恢复39
2.6.1 Export 转入程序40
2.6.2 Import 转入程序42
2.6.3 增量卸出/装入44
第3章 ORACLE数据库的网络应用46
3.1 SQL*Net产品介绍46
3.2 配置客户机/服务器结构47
3.2.1 配置listener.ora47
3.2.2 配置tnsnames.ora文件48
第4章 常用任务示例51
4.1 如何恢复被误删的数据文件51
4.2 如何杀掉吊死session51
4.3 如何修改字符集51
4.4 如何追加表空间51
4.5 如何加大表的maxextents值52
4.6 如何查询无效对象52
4.7 怎样分析SQL语句是否用到索引52
4.8 怎样判断是否存在回滚段竞争53
4.9 怎样手工跟踪函数/存储过程执行情况54
4.10 多种业务使用同一数据库如何分配回滚段54
4.11 怎样倒出、倒入文本数据54
4.11.1 倒出54
4.11.2 倒入55
4.12 如何更新当前数据库日志备份方式为archive56
4.13 Unix环境下如何实现自动备份56
4.13.1 设置运行环境56
4.13.2 倒出数据56
4.13.3 异地备份57
4.13.4 启动备份进程58
4.14 怎样分析ORACLE故障59
小结61
附录A ORACLE数据字典与视图62
附录B 动态性能表68
附录C SQL语言运算符与函数70
课程说明
课程介绍
本课程对应的产品版本为:Oracle 8.1.7。
课程目标
完成本课程的学习后,您应该能够:
掌握ORACLE数据库系统结构中物理结构、系统全局区和进程的概念
掌握ORACLE数据库的存储管理知识
掌握管理ORACLE数据库的方法
了解ORACLE数据库的网络应用
相关资料
ORACLE公司发布的相关资料。
第1章 ORACLE数据库概述
1.1 产品概述
1.1.1 产品简介
数据库技术产生于60年代末70年代初,到现在比较知名的大型数据库系统有ORACLE、Sybase、Informix、DB2(IBM公司的)、Ingress、RDB、SQL Server等。
ORACLE公司于1979年,首先推出基于SQL标准的关系数据库产品,可以在100多种硬件平台上运行(包括微机、工作站、小型机、中型机和大型机),支持多种操作系统。1986年,ORACLE推出具有分布式结构的版本5,可将数据和应用驻留在多台计算机上,而相互间的通信是透明的。1988年,推出版本6(V6.0)可带事务处理选项,提高了事务处理的速度。1992年推出了版本7,可带过程数据库选项、分布式数据库选项和并行服务器选项,称为ORACLE7数据库管理系统,它释放出了开放的关系型系统的真正潜力。目前,新版本为ORACLE9i,通用版本为ORACLE8i。版本Oracle 8i 是在企业内和因特网上开发、布署和管理应用高移动性和可伸缩性的数据库。Oracle 8i 最主要的新特性是在数据库中包括J a v a 和因特网能力。Oracle 8i 还包括能够管理和访问多媒体(视频、音频、图像、文本、空间)的Oracle interMedia 。Oracle 8i 还包括Oracle We b D B ,这个We b 开发环境使开发者能建立使用标准的We b 浏览器和Oracle 8i 数据库的动态的、数据驱动的We b 网站。ORACLE8i是一种通用叫法,它包括许多更细版本,如ORACLE8.1.5、ORACLE8.1.6、ORACLE8.1.7,华为公司TELLIN U-NICA产品使用版本ORACLE8.1.7序列。
说明:
“i”表示ORACLE数据库与internet的结合。
ORACLE用多达5个号码来完全识别一个版本,如“8.1.7.2.3”,命名方法如下:
序号值含义
第一位8版本号(Version),是主要的标识符,表示软件的主要版本,包含显著的新功能,例如:版本8(也标识为版本8.0)。
第二位1新特征版本号(New Features Release Number),该位表示新特征版本级,例如:版本8.1。
第三位7维护版本号(Maintenance Release Number),该位表示一个维护版本级。也可能包含一些新特征,例如:版本8.0.4、8.1.7。
第四位2通用补丁级号(Generic Patch Set Number),该位表示一个通用补丁级。补丁级可以跨越所有操作系统和硬件平台使用,例如:补丁级版本8.1.7.2
第五位3专用平台补丁级(Platform Specific Patch Set Number),该位表示一个只能应用到特定的操作系统和硬件平台的补丁级,例如:补丁级8.1.7.2.3。
可以用如下的SQL语句得到ORACLE版本信息:
SQL> select * from product_component_version;
1.1.2 基本概念
要了解ORACLE数据库,需要先了解以下基本概念:
数据库:是一个数据集合,我们大多数情况下讲的数据库概念不仅是指物理数据,还指内存、进程对象的组合。ORACLE数据库都将数据存储在文件中,在其内部,数据库结构提供了数据对文件的逻辑映射,允许不同类型的数据分开存放。这些逻辑划分称为表空间。关于表空间的概念将在下文中介绍。
表空间(Tablespace):是数据库的逻辑划分,每个数据库至少有一个表空间(system表空间)。
数据文件(DataFile):每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件。建立新表空间需要建立新的数据文件。
实例(Instance):也称为服务器(server),是存取和控制数据库的软件机制,它由系统全局区SGA和后台进程组成。
ORACLE数据库启动时,实际是启动ORACLE实例,(安装并打开数据库)。一个数据库可以被多个实例访问(这是ORACLE的并行服务器选项)。决定实例的大小及组成的参数存储在init.ora文件中,实例启动时需要读这个文件,并且在运行时可以由数据库管理员修改,但要在下次启动实例时才会起作用。
说明:
实例名字可以由环境变量ORACLE_SID来定义。
实例的init.ora文件名通常包含该实例的名字,格式为initSID.ora:如一个实例的名字(SID)为ora817,则init.ora文件名通常为initora817.ora。
1.2 ORACLE系统结构
任何硬件平台或操作系统下的ORACLE体系结构是相同的,包括如下三个方面:
(1) 物理结构:数据文件,日志文件,控制文件,参数文件。
(2) 系统全局区(SGA):共享池,数据缓冲区,日志缓冲区,字典缓冲区。
(3) 进程:用户进程,服务器进程,后台进程。
具体结构如图1-1所示。
图1-1 ORACLE数据库体系结构
1.2.2 ORACLE物理结构
一个ORACLE数据库是数据的集合,被处理成一个单位。一个ORACLE数据库有一个物理结构和一个逻辑结构。数据库物理结构是由构成数据库的操作系统文件所决定。每一个ORACLE数据库是由四种类型的文件组成:数据文件、日志文件、控制文件和参数文件。数据库的文件为数据库信息提供真正的物理存储。
ORACLE数据库的物理结构由四类文件组成
1. 数据文件
数据文件是物理存储ORACLE数据库数据的文件,每一个ORACLE数据库有一个或多个物理的数据文件(data file)。一个数据库的所有数据文件包含了全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:
每一个数据文件只与一个数据库联系
一个表空间可包含一个或多个数据文件
图1-2给出数据库、表空间及数据文件之间关系。
图1-2 数据库、表空间及数据文件之间关系
2. 日志文件
每一个数据库有两个或多个日志文件(redo log file)的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所做的修改,所以对数据库做的全部修改是记录在日志中。日志文件的主要作用是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored redo log),可以在不同磁盘上维护两个或多个日志副本。日志文件中的信息仅在系统故障或介质故障时用来恢复数据库。
3. 控制文件
每一个ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型:
数据库名。
数据库数据文件和日志文件的名字和位置。
数据库建立日期。
为了安全起见,允许控制文件被镜象。每一个ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
4. 参数文件
是一个文本文件,可直接使用文本编辑器对其内容进行修改,该文件只在建立数据库和启动实例时被访问,修改该文件后必须重启实例才生效。
系统初始参数文件:init .ora
生成的参数文件为:initSID.ora
参数文件作用如下:
设置SGA的大小。
设置数据库的全部缺省值。
设置数据库的范围。
在数据库建立时定义数据库的物理属性。
指定控制文件名和路径。
通过调整内存结构,优化数据库性能。
说明:
ORACLE8.1.7版本数据库实例参数文件“initSID.ora”是在安装ORACLE数据库过程中产生的,一般情况下不需要手工修改。
1.2.3 系统全局区
SGA(System Global Area)是ORACLE系统为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作,图2-3给出实例与SGA及数据库关系。
图1-3 实例与SGA及数据库关系
SGA分为以下几个部分:
(1) 共享池。
(2) 数据块缓冲区。
(3) 日志缓冲区。
(4) 字典缓冲区。
下面分别介绍:
说明:
SGA的尺寸应小于物理内存的一半。
在ORACLE系统中,所有用户与ORACLE数据库系统的数据交换都要经过SGA区。
1.共享池(Shared Pool)
由共享SQL区和数据字典区组成,参数shared_pool_size确定共享池大小,共享SQL区包括:
(1) SQL或PL/SQL语句的文本。
(1) SQL或PL/SQL语句的语法分析形式。
(2) SQL或PL/SQL语句的执行方案。
说明:
shared_pool_size=物理内存×(15~20)%
对于OPS取下限。
2.数据块缓冲区
用于存储从数据文件中读出的数据,其大小由以下两个参数决定:
DB_BLOCK_SIZE确定数据块的大小,一般为2K或4K。
DB_BLOCK_BUFFERS确定数据块的数目。
DB_BUFFERS=DB_BLOCK_BUFFERS×DB_BLOCK_SIZE=物理内存×(15~25)%, 对于OPS取上限。该值应尽量大。
3.日志缓冲区
以记录项的形式备份数据库缓冲区中被修改的缓冲块,这些记录项将被写到日志文件中。日志缓冲区大小由参数LOG_BUFFER确定
4.字典缓冲区
用于存放数据字典信息行。
5.SGA设置大小总原则
在设置各参数调整SGA大小时,应保证其小于物理内存的一半。
SGA的计算方法如下:
SGA=DB_BLOCK_BUFFERS×DB_BLOCK_SIZE+SHARE_POOL_SIZE+SORT_AREA_SIZE+1M+3×DB_BLOCK_SIZE×(CPUs+2)×PARALELL_MAX_SREVERS
说明:
OPS才有最后一项。
SORT_AREA_SIZE:排序区,并发用户数较多,需要排序时该值宜大。
PARALELL_MAX_SREVERS:2×CPU个数×4×并发用户数。对单CPU不能修改此值。
1.2.4 进程
进程是操作系统中的一种机制,它可执行一系列的操作步骤(在有些操作系统中使用作业(JOB)或任务(TASK)的术语来表示进程)。一个进程通常有它自己的专用存储区。
ORACLE实例有两种类型:单进程实例和多进程实例。通常用的是多进程实例。
单进程ORACLE(又称单用户ORACLE)是一种数据库系统,一个进程执行全部ORACLE代码。由于ORACLE部分和客户应用程序不能分别以进程执行,所以ORACLE的代码和用户的数据库应用是单个进程执行。在单进程环境下的ORACLE 实例,仅允许一个用户可存取。例如在MS-DOS上运行ORACLE 。
多进程ORACLE实例(又称多用户ORACLE)使用多个进程来执行ORACLE的不同部分,对于每一个连接的用户都有一个进程。在多进程系统中,进程分为两类:用户进程和ORACLE进程。当一用户运行一应用程序,如PRO*C程序(Pro*C是一种开发工具, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。)或一个ORACLE工具(如SQL*PLUS),为用户运行的应用建立一个用户进程。ORACLE系统进程又分为服务器进程和后台进程。
1. 服务器进程
用于处理用户请求的进程。处理过程如下:
(1) 分析SQL命令并生成执行方案。
(2) 从数据缓冲区或磁盘中读取数据。
(3) 将执行结果返回给用户。
2. 后台进程
为所有数据库用户异步完成各种任务,主要包括如下进程(ora817表示实例名):
ora_reco_ora817恢复进程:该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。
当一数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。
RECO后台进程仅当在允许分布式事务的系统中出现,而且DISTRIBUTED – TRANSACTIONS参数是大于0。
ora_dbw0_ora817数据库写进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个ORACLE后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,此进程的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。
ora_pmon_ora817进程监控进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
ora_lgwr_ora817日志写进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个ORACLE后台进程。
ora_ckpt_ora817检查点写进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。
ora_smon_ora817系统监控进程:该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
1.3 存储管理
前面已经提到过,ORACLE数据库都将数据存储在数据文件中,在其内部,数据库结构提供了数据对数据文件的逻辑映射,允许不同类型的数据分开存放。这些逻辑划分称为表空间,图1-4给出了详细的ORACLE数据库存储结构图。
图1-4 ORACLE存储结构图
对于用户,通常关心的是ORACLE的逻辑结构,是在逻辑上是如何组成的,是如何存储数据的,下面详细介绍。
1.3.2 逻辑结构
ORACLE的逻辑结构是由一个或多个表空间组成,一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间(tablespace)。一个表空间可将相关的逻辑结构组合在一起。
一个表空间由一组分类段组成。
一个段由一组范围组成。
一个范围由一批数据库块组成。
一个数据库块对应一个或多个物理块。
每一个ORACLE数据库包含有一个名为SYSTEM的表空间,在数据库建立时自动建立。在该表空间中包含有整个数据库的系统信息数据,最小的数据库可只需要SYSTEM表空间。表空间利用增加数据文件可扩大表空间,表空间的大小为组成该表空间的数据文件的大小的和。ORACLE数据库中一表空间是由一个或多个物理数据文件组成,一个数据文件只可与一个表空间相联系。当为一表空间建立一数据文件时,ORACLE建立该文件,分配指定的磁盘空间容量。在数据文件初始建立后,所分配的磁盘不包含有任何数据。
一个模式(schema)为模式对象(schema object)的一个集合,每一个数据库用户对应一个模式。模式对象为直接引用数据库数据的逻辑结构,模式对象包含如表、视图、索引、同义词等结构。模式对象是逻辑数据存储结构,每一种模式对象在磁盘上没有一个相应文件存储其信息。一个模式对象逻辑地存储在数据库的一个表空间中,每一个对象的数据物理地包含在表空间的一个或多个数据文件中。例如:表、索引等模式对象,在指定表空间的数据文件上为该对象分配多少空间。图1-5说明模式对象、表空间和数据文件之间的关系。
图1-5 模式对象、表空间和数据文件之间的关系
模式与表空间之间的关系为:一个表空间可包含不同模式的对象,而一个模式中的对象可包含在不同的表空间中。
1. 数据库块
数据库块(database block)是ORACLE逻辑分配空间的最底层,又称逻辑块、页或ORACLE块。
数据库块是数据库使用和分配空间的最小单元,也可以说是使用的最小I/O单元,一个数据块与磁盘上指定的物理空间大小相一致,一个数据库块对应一个或多个物理块,块的大小由参数db_block_size确定。
PCTFREE和PCTUSED是开发人员用来控制数据块中可用插入和更新数据的空闲空间大小的参数。
PCTFREE:设置数据块中保持空闲的百分比。
PCTUSED:当数据块空闲空间达到PCTFREE时,此块不允许插入数据,只能修改或删除块中的行,更新时可能使数据块空闲空间变大,已用数据空间变小,当已用空间低于PCTUSED时,则可以重新插入数据。
PCTFREE及PCTUSED的选择:
经常做查询(select)的表,应使PCTFREE小些,尽量减少存储空间浪费。
经常做插入(insert)的表,应使PCTUSED大一些。
经常做更新(update)的表,应使PCTFREE大一些,给更新留出更大的空间,减少行移动。
说明:
这两个参数只能在创建、修改表和聚簇(数据段)时指定。另外,在创建、修改索引(索引段)时只能指定PCTFREE参数。
经常做插入的表设置举例:
create table COMMINFOR
( SERIALNUMBER VARCHAR2(20) not null,
ENTERHISTIME DATE not null,
ACCEPTBEGINTIME DATE null ,
ACCEPTDURATION NUMBER(10) null ,
ACCEPTERNO VARCHAR2(4) null ,
CALLINGPHONENO VARCHAR2(20) null ,
ACCEPTID NUMBER(10) null ,
OPERATIONTYPE VARCHAR2(10) null ,
APPELLANTNAME VARCHAR2(16) null ,
CONTACTID NUMBER(10) null ,
)
pctfree 10
pctused 90
initrans 2
maxtrans 255
TABLESPACE SERVICE_RPT_DAT;
经常做查询的表设置举例:
create table AUTH
(
AUTHID NUMBER(10) not null,
DESCRIPTION VARCHAR2(50) null
constraint PK_AUTH primary key (AUTHID)
)
pctfree 10
pctused 40
TABLESPACE SERVICE_RPT_DAT;
2. 范围(Extent)
数据库存储空间分配的逻辑单位,一个范围由一组数据块组成,范围是由段分配的,分配的第一个范围称初始范围,以后分配的范围称增量范围。
Extent是段中分配空间的逻辑单元。它有如下特性:
一个或多个范围构成一个段。
当段增长时,范围自动添加到段中。
DBA可以手工把范围加到一个段中。
一个范围不能跨数据文件,即一个扩展只属于一个数据文件。
一个范围由一片连续的ORACLE block构成。
每个段在定义时有许多存储参数来控制范围的分配,主要是STORGAE参数,主要包括如下几项:
INITIAL :分配给段的第一个范围的字节数,缺省为5个数据块。
NEXT:分配给段的下一个增量范围的字节数,缺省为5个数据块。
MAXEXTENTS :最大扩展次数。
PCTINCREASE:每一个增量范围都在最新分配的增量范围上增长,这个百分数缺省为50%,建表时通常设置为0,建表空间时为1%。
范围在分配时,遵循如下分配方式:
初始创建时,分配INITIAL指定大小的区。
空间不够时,按NEXT大小分配第二个区。
再不够时,按NEXT + NEXT *PCTINCREASE分配。
可以对表、聚集、索引、回滚段、表空间等实体设置存储参数。
3. 段
是表空间中一个指定类型的逻辑存储结构,它由一个或多个Extent组成,段将占用并增长存储空间,但是一个段不能跨越表空间,ORACLE中有数据段、索引段、临时段、回滚段和自举段(包含打开数据库时要装入的数据字典表)。
当执行建表命令时,系统将自动创建一个段,若没有指定存储参数子句storage,则系统会用相应表空间的storage,当初始区用完后,系统会按next和pctincrease的值分配新的区。
在这里要讲一个比较重要的概念:回滚段。回滚段是当某事务修改一个数据块时,用以存放数据以前映像信息的数据段。回滚段中的信息用以保存读连续性,并进行事务回滚和事务恢复。例如,如果事务通过把一列的关键值从10改为20来修改数据块,则原值10要存放于回滚段中,而数据块将具有新值20。如果事务被回滚,则值10从回滚段拷回数据块。事务产生的重做记录保证在事务提交或回滚之前保持在回滚段中,而一个事务只能用一个回滚段存放其所有的重做记录,因此,如果回滚段大小配置不恰当,当ORACLE执行一个大的事务时,就会出现回滚段溢出的错误。所以设置回滚段大小是一个比较重要的问题,这取决于数据库应用的主要事务模式(稳定的平均事务速度、频繁大型事务、不频繁大型事务),并可通过一些测试来确定。
这里还有另外一个概念:临时段。用于以下SQL操作:
CREATE INDEX
带DISTINCT,ORDER BY,GROUP BY,UNION,INTERSECT和MINUS子句的SELECT语句
无索引的JION语句
某些相互关联的子查询
了解了逻辑结构后,下面介绍数据库中存储对象。
1.3.3 表(Table)
1. 表的组成
表是数据库的最基本的逻辑结构,一切数据都存放在表中,一个ORACLE数据库就是由若干个数据表组成。其它数据库对象都是为了用户很好地操作表中的数据。表是关系模型中反映实体与属性关系的二维表格,它由列和行组成,通过行与列的关系,表达出了实体与属性的关系,如图1-6所示。
图1-6 表(Table)的组成
表的组成部分有:
列/域/字段:表的内容,也就是实体的各个属性,组成了表的各个列。
列名:列的名称。
长度:该列所能容纳的最大数据位数。
类型:该列存储的数据类型,常用数据类型如0.0.0 0. 所示。
关键字:该列能唯一表示一行内容,则称该列为关键字。
非空列:该列值是不能为空的。
常用数据类型
数据类型说明串长度
Char(长度)定长字符串255
Varchar(长度)变长字符串2000
Number(精度,比例)数字
Date日期时间
Long(长度)大型可变长字符串21亿
行/记录:表中所有列组合在一起形成的一条信息,称之为一行或一条记录。
所属表:记录一定是归属于某一张表的。
行号:每条记录在数据库中的一个定位位置。在ORACLE数据库中,每张表有一系统提供的伪列来定位每条记录。
记录长度:该记录所有非空列的长度求和得出的字节数。
2. 建表命令
建表命令如下:
CREATE TABLE tablename
(column1 datatype [DEFAULT expression] [constraint],
column1 datatype [DEFAULT expression] [constraint],
……)
[STORAGE子句]
[其他子句];
建表举例:
create table AUTOCALLLOG
( ID VARCHAR2(20) not null ,
CityId NUMBER(4) NULL
)
TABLESPACE SERVICE_HIST_DAT
PCTFREE 10
PCTUSED 90
STORAGE
( INITIAL 10M
NEXT 10M
MINEXTENTS 2
MAXEXTENTS 500
pctincrease 0
);
3. 删除表中数据
删除表中数据有以下两种方式:
Delete :删除数据时,数据库需要写日志,ORACLE数据库还需要占用回滚段,每次事务越大,对数据库的冲击越大,所以在删除或者更新数据时,一定要注意控制事务的大小。ORACLE数据库在删除或更新数据时,where条件中加rownum控制每次删除或更新的数量,如:
delete from t_my_table where ... and rownum 2000;
Truncate:删除表中所有数据,并回收空间。
说明:
用Delete删除数据时,只删除数据,但不释放空间,并且产生碎片。
可以采用导出后truncate 表,然后再导入的方法解决碎片的问题。
4. 删除表
删除表命令为DROP,利用DROP命令删除表注意:
删除表中全部行。
删除表中全部索引。
如果它不是聚集的成分,系统将收回该表的所有存储空间。
如果该表为视图的基表,或在存储过程、函数或包中被引用,ORACLE将使这些对象无效但没有被删除,在表恢复后,这些对象仍可使用。
5. 建表约束
建表约束包括:
(1) 非空完整性约束。
(2) 唯一完整性约束。
(3) 主码完整性约束。
(4) check完整性约束。
(5) 引用完整性约束。
例如:在下面语句中包括了除“唯一完整性约束”外的所有约束。
SQL>create table emp
(eno char(4) constraint e1 primary key ,
ename char(8) not null,
sal number(8,2) constraint ck1
check (sal between 5000 and 10000),
mgr char(4),
dno char(2) constraint d2
references dep(dno)
on delete cascade
) ;
引用完整性约束时需要注意以下几点:
(1) 先建主表,后从表。
(2) 从表引用的必须是主表的主码或定义了唯一性约束的列。
(3) 从表的外来码值必须匹配与主表的引用码的值
(4) 当删除主表记录时,从表指定了ondelete cascade子句,连带删除从表记录,否则,若从表中有对应记录,则不能删除主表记录。
1.3.4 视图(View)
视图,数据中表的窗口,在表上的查询所形成的一个数据集体。通过视图,你将看到你所需要的信息,而排除其它不关心的内容。
将表中所需要的列和行选取出来传递给用户。
不是真正将数据重新复制一遍,不占用存储空间。
不仅在表的基础上建立,还可在视图的基础之上再建立视图。
建立视图主要基于:
保护数据安全,防止机密数据泄露。
简化数据查询方式,建立有效的查询。
保持数据独立性,保证程序不会随着数据的位置变化、名称变化而需要修改。
说明:
ORACLE数据库的视图请参考“附录A ORACLE数据字典与视图”。
1.3.5 索引(Index)
索引是与表相关的一种选择结构。索引可建立在一表的一列或多列上,一旦建立,由ORACLE自动维护和使用,对用户是完全透明的。索引是逻辑地和物理地独立于数据,它们的建立或删除对表没有影响,所有应用可继续处理。
关于索引需要注意以下几点:
(1) 索引是一种数据库对象,并不改变表的逻辑结构,而是在物理存储结构上增加一些辅助信息,以提高查询速度。
(2) 当表中记录增加或删除时,索引结构均要发生变化,因此,当有大量数据装入数据库时,应该先装入数据,后建立索引,以提高数据装入速度。
(3) 只有当按指定的索引列的值查找或按索引列的顺序存取表时,才可利用索引提高性能。
说明:
当索引被删除后,原分配给索引的数据块将全部返回给索引所在的表空间.
建立索引可以:
加快查询速度。
确保唯一性特征。可以为表中某一列建一个唯一性索引,那么如果有人企图向表中插入这样一行记录,即它在这个有索引的列的数值与以前已有值重复,则这个操作就会失败。
1.3.6 同义词(Synonym)
同义词是表、视图或其它数据库实体的一个别名。可以用与存取表、视图等实体同样的方法来存取别名。
简单性(用户名.表名→同义词名)。
表的独立性(只需修改同义词的定义,避免修改大量应用程序)。
1.3.7 序列(Sequence)
序列是一个数据库对象,利用它可以生成唯一的整数,序列的值是由ORACLE程序自动生成。
创建序列:
SQL>create sequence zxk increment by 10
start with 10 maxvalue 1000 cycle ;
上例说明:
increment by 10 增量值为10。
start with 10 指定生成的第一个序列号为10。
maxvalue 1000 指定序列可生成的最大值。
cycle 序列上升到最大值1000后,继续由开始值10开始生成。
引用序列:
序列当前值:zxk.currval
序列下一个值: zxk.nextval
1.3.8 数据库链(Database Link)
数据库链是本地数据库中的一个对象,利用它可以存取远程数据库上的对象。
在远程表或视图之后附加@db链名,即可在SQL语句中引用远程表或视图。
有专用数据库链和公用数据库链之分,专用数据库链仅为建立者使用;公用数据库链必须用关键字public定义,公用数据库链可为全部用户使用。
创建数据库链:
对由连接串“icd_main”指定的数据库上的用户icdmain,口令为icd,建立一名为icdmainold的数据库链。
SQL>create database link icdmainold
>connect to icdmain
>identified by icd
>using 'icd_main' ;
下面给出使用数据库链进行查询、插入、修改、删除举例:
SQL>select * from emp@icdmainold;
SQL>insert into emp@icdmainold
>values('0001','zxk',5000,'0010','00');
SQL>update emp@icdmainold
>set sal=sal+1000;
SQL>delete from emp@icdmainold
>where ename='aaaa';
第2章 管理ORACLE数据库
本章主要讲述管理ORACLE数据库的一些必备知识。
2.1 基本概念
2.1.1 数据字典
数据字典是ORACLE数据库的最重要的部分之一,是由一组只读的表及其视图所组成。这些表和视图是数据库被建立同时由数据库系统建立起来的,起着系统状态的目录表的作用。数据字典描述表、列、索引、用户、访问权以及数据库中的其它实体,当其中的一个实体被建立、修改或取消时,数据库将自动修改数据字典。因此,数据字典总是包含着数据库的当前描述。数据字典提供有关该数据库的信息,可提供的信息如下:
ORACLE用户的名字。
每一个用户所授的特权和角色。
模式对象的名字(表、视图、索引、同义词等)。
关于完整性约束的信息。
列的缺省值。
有关数据库中对象的空间分布信息及当前使用情况。
审计信息(如谁存取或修改各种对象)。
其它一般的数据库信息。
可用SQL存取数据字典,由于数据字典为只读,只允许查询。数据字典中全部基本表和用户可存取视图为ORACLE用户SYS所持有,所有对象包含在SYS模式中,安全管理员对该帐号要严格控制。
当ORACLE数据库系统启动后,数据字典总是可用,它驻留在SYSTEM表空间中。数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以前缀相区别,前缀为USER、ALL和DBA。
前缀为USER的视图,为用户视图,是在用户的模式内。
前缀为ALL的视图为扩展的用户视图(为用户可存取的视图)。
前缀为DBA的视图为DBA的视图(为全部用户可存取的视图)。
常用数据字典与视图
ORACLE数据库有三个可查看系统数据库字典的用户:system、internal、sys,其它用户只能查看授权表空间的数据库字典,以某一用户登录数据库后可查看一些数据字典,了解数据库的资源情况,对日常维护的故障定位能起很大的帮助,下面就一些常用的数据表(视图)进行简单的说明:
(1) dba_tablespaces(user_tablespaces)
除三个系统用户以外的用户登录可查看user_tablespaces表。
dba_tablespaces(user_tablespaces)表可查看本数据库的表空间,它存放各个表空间的属性,包括:表空间名、表空间宿主、以及存储参数(initial、next、maxextents、minextents、blocks等)等。
(2) dba_data_files(user_data_files)
该表可查看数据库所有数据库数据文件,它存放了各个数据文件的属性,包括:表空间名、宿主、数据文件名、大小、可用空间以及ID号等。
(3) dba_segments(user_segments)
该表可查看数据库所有段,它存放了各个段的属性,包括:段名、表空间名、宿主、大小、第一个区间的块号等。
(4) dba_rollback_segs
该表可查看数据库所有回滚段,它存放了各个数据库回滚段的属性,包括:回滚段名、表空间名、宿主、存储参数(initial、next、maxextents、minextents等)、第一个区间的块号、占用数据库文件ID号。
(5) dba_extents
该表可查看数据库所有区间,它存放了各个区间的属性,包括:区间ID、使用段ID、所属对象(object)名、宿主、占用数据库文件ID(对应dba_data_files中的ID号)、块号等。
常见应用:查看各对象的区间是否已达到了最大区间数量(maxextents)。
select object_name,sum(*) from dba_extents group by object_name;
(6) dba_free_spaces
可查看数据库表空间的使用情况,如查看各数据库表空间的可用空间:
select tablespace_name,sum(bytes) from dba_free_spaces group by talbespace_name;
以上为常用的数据字典,可在维护中灵活应用。在维护过程中,第一步应查看数据库管理系统的运行日志,日志文件的存放路径应版本不同而不同,一般:ORACLE workgroup版,日志文件存放路径为:$ORACLE_HOME/rdbms/alert_'SID'.log,OPS版,日志文件存放路径为:$ORACLE_HOME/../../admin/bdump/alert_'SID'.log。可用命令:tail logfilename查看,或用vi logfilename,按shift+g到文件尾进行查看。
说明:
附录A详细列出了ORACLE的数据字典与视图,供参考。
2.1.2 事务管理
1. 事务(transaction)
数据库是多用户的共享资源,在多个用户并行地存取数据时,应对数据做并发控制,以免存取不正确的数据,破坏数据库的一致性。
数据库的任何状态变化都要能反映客观世界的某种真实存在的合理状态,反映到数据库中,就是数据要满足一定的约束条件,这种约束条件就是一致性约束。
有时,为了完成复杂的修改动作,往往需要临时破坏数据库的状态一致性。因此,就有必要把这种对数据库复杂修改的一连串动作序列合并起来,这就是事务。
事务是数据库维护数据一致性的单位,它将数据库从一致性状态转换成新的一致性状态。
2. 事务提交
提交事务:即将在事务中由SQL语句所执行的改变永久化。数据库数据的更新操作提交以后,这些更新操作就不能再撤消。ORACLE的提交命令如下:
SQL>COMMIT;
3. 事务回退
事务回退的含义是:撤消未提交事务中的SQL语句所作的对数据修改。ORACLE允许撤消未提交的整个事务,也允许撤消部分(需设置保存点)。回退之后,数据库将恢复事务开始时的状态或保留点状态。回退命令如下:
SQL>ROLLBACK;
4. 保存点
保存点就是将一个事务划分成为若干更小的部分,以便在必要时,使当前事务只回退一部分,而其余工作得到保留。其格式为:
SAVEPOINT 保存点名;
ROLLBACK TO 保存点名;
2.1.3 数据库管理员(DBA)
任何一个系统都需要一个负责管理和维护的人员,负责管理和维护ORACLE数据库的人就是数据库管理员(DataBase Administrator,简称DBA)。
每个ORACLE数据库至少要有一名专职的数据库管理员,其职责如下:
保证数据的完整性和一致性。
提高执行速度,调整系统性能。
管理数据库存储,减少数据冗余。
安装、升级ORACLE Server 和应用工具。
定期对数据进行备份。
DBA为做好上述工作,需要了解以下知识:
ORACLE产品结构。
DBA工具。
数据库备份和恢复。
数据字典用途。
在ORACLE系统初始安装后,存在以下三个具有DBA特权的数据库用户:
internal用户。
sys用户。
system用户。
1. DBA的操作系统帐户
在进行许多数据库的管理任务时,必须能够执行操作系统命令,所以需要有个操作系统帐户,以便能完成操作系统的操作,此时要求此帐户具有比一般数据库用户更多的操作系统权限或存取特权。
数据库的启动(startup)和关闭(shutdown)是重要的管理任务,只有通过internal用户连接到ORACLE数据库,才能执行启动和关闭。对于不同的操作系统,必须完成下列要求之一,才能用internal登录ORACLE。
你的操作系统帐户有允许你作为internal登录ORACLE操作系统权限。
你有权限用internal登录ORACLE。
若数据库用internal登录ORACLE时需要口令,你必须知道口令。
2. DBA角色和用户
每个数据库总是自动创建一个预先定义的角色“DBA”,该角色包括所有数据库系统权限,具有很强的特权,只应授予数据库管理员。
在数据库创建时,自动创建了两个用户,并授予DBA角色,具体如下:
SYS:初始口令为“CHANGE_ON_INSTALL”,所有数据字典基表和视图被存储在SYS用户中。
SYSTEM:初始口令为“MANAGER”,附加的表和视图(一些ORACLE选择件使用)以及被ORACLE工具使用的表和视图存放在SYSTEM用户中。
安装完毕后,建议立即修改初始口令。
DBA用户通常工具如下:
Sql * DBA
Sql * Loader
EXP和IMP
2.1.4 ORACLE的四种状态
ORACLE数据库任何时候可以处于四种状态之一:
SHUTDOWN:数据库关闭
NOMOUNT:例程启动
MOUNT:例程启动,控制文件打开
OPEN:例程启动,所有数据文件打开
数据库可以在几种状态之间转变:
NOMOUNT到MOUNT
ALTER DATABASE MOUNT
MOUNT到OPEN
ALTER DATABASE OPEN
ALTER SYSTEM ENABLE RESTRICTED SESSION
2.2 SQL*Plus方式的ORACLE数据库启动和关闭
说明:
对TELLIN U-NICA产品的维护建议用SQL*Plus方式来启动和关闭ORACLE数据库。
2.2.1 启动数据库
数据库启动包括的步骤:准备启动实例、启动数据库选项。
1. 准备启动实例
用户在准备启动数据库实例前需要执行的预备步骤为以系统DBA来连接数据库:
$ sqlplus user_name/user_password
说明:
使用具有系统DBA角色的用户连接ORACLE数据库管理系统。如:sys用户、system用户、unica用户等。
2. 启动数据库选项
SQL>START database_name;
这个命令启动实例装入并打开数据库。
说明:
如果不指定database_name,如:“SQL> START;”系统将启动.bash_profile中定义的缺省的数据库实例。
2.2.2 关闭数据库
关闭数据库的种类:
用IMMEDIATE选项关闭。
用NORMAL选项关闭。
用TRANSACTIONAL选项关闭。
用ABORT选项关闭。
关闭数据库及数据库实例要用系统DBA角色的用户来连接数据库,然后用SHUTDOWN命令来关闭数据库。
$ sqlplus user_name/user_password
SQL>
1. 用IMMEDIATE选项关闭
在下面情况下使用立即关闭数据库:
当很快就要关电源时。
数据库或其他应用程序功能不正常时。
立即关闭数据库通过下面的情况进行:
未授权的事务退回(如果长期有未授权的事务存在,这种关闭的方法可能不会完成得很快)。
ORACLE不等待用户当前的数据库连接断开,ORACLE不问原因地退回激活事务,并断开所有的连接用户。
数据库下次启动将不要求任何实例恢复程序。
命令如下:
SQL> SHUTDOWN IMMEDIATE;
2. 用NORMAL选项关闭
在下面情况下使用此方式:
在语句发生后不允许新的连接。
在数据库关闭前,ORACLE等待当前所有与数据库连接的用户断开连接。
数据库的下一次启动将不需要任何实例恢复程序。
命令如下:
SQL> SHUTDOWN NORMAL;
3. 带有TRANSACTIONAL选项关闭
当用户希望在允许活动事务首先完成时进行一个计划中的事务关闭时应用此种方式。
命令如下:
SQL> SHUTDOWN TRANSACTIONAL;
4. 带有ABORT选项关闭
在如下情况下执行:
数据库或它的应用程序不正常,并且其他形式的关闭不起作用。
用户需要立即关闭数据库时(例如用户知道一分钟内就要停电时)。
用户在启动数据库实例遇到问题时。
退出实例关闭数据库会产生如下的后果:
ORACLE处理的当前客户端SQL语句立即中断。
未递交的事务将不会退回。
ORACLE将不等待当前与数据库的连接断开,即ORACLE将断开所有的连接用户。
数据库的下一次启动将要求实例恢复程序。
如果正常与立即关闭选项都不能工作,要立即退出当前的数据库实例。命令如下:
SQL> SHUTDOWN ABORT;
2.3 svrmgrl方式的ORACLE数据库启动和关闭
2.3.1 启动数据库
打开数据库的前提条件如下所示:
# su - ORACLE(取得ORACLE用户权限)
$ svrmgrl (进入ORACLE数据库服务器管理交互界面)
ORACLE Server Manager Release 3.1.7.0.0 - Production
Copyright (c) 1997, 1999, ORACLE Corporation. All Rights Reserved.
ORACLE8i Enterprise Edition Release 8.1.7.0.0 - Production
JServer Release 8.1.7.0.0 - Production
SVRMGR> connect internal(通过internal用户连接ORACLE数据库,如有口令需要输入口令,即connect internal/口令)
说明:
退出ORACLE数据库交互界面命令为:
SVRMGR> quit
1. 启动例程不装载数据库
SVRMGR> startup nomount
启动一个实例而没有安装(mount)数据库,这步操作一般在创建数据库和重新创建控制文件时才会用到,到这一步为止,数据库做的操作有:
读初始化参数文件initSID.ora。
创建SGA。
启动后台进程。
打开告警文件和跟踪文件。
2. 启动例程并装载数据库,但不打开。
SVRMGR> startup mount
为执行一些特定的维护操作,经常需要启动一个实例并安装(mount)数据库,但不打开数据库。例如,如下操作就需要启动数据库到这一步:
为数据文件改名。
增加、删除或改名重做日志文件。
启动或停止数据库到归档模式。
进行完整的数据库恢复。
mount一个数据库包括如下几步:
把数据库与已经启动(nomount)的实例联系起来。
定位并打开初始化参数CONTROL_FILE指定的控制文件(获取实例锁)。
读控制文件获取数据文件和重做日志文件的名字和状态(此时,数据库并不检查这些数据文件和联机重做日志文件是否存在)。
3. 启动例程,装载并打开数据库
SVRMGR> startup open
数据库正常表明实例已经启动,并且数据库已经安装(mount)和打开,这时所有合法的数据库用户才可连到数据库,并执行典型的数据访问操作。打开一个数据库包括:
打开联机数据文件。
打开联机重做日志文件。
用此种方式打开数据库,则允许所有合法用户对数据库做联接并执行各种数据库存取操作。
这一步中,ORACLE检查所有的数据文件和联机重做日志文件是否可以被打开,并检查数据库的一致性。对于一些可以自动恢复的错误,后台进程SMON在数据库打开之前将执行恢复操作,对于那些不能自动恢复的错误,打开数据库将失败并报错。
4. 启动例程并限制对数据库访问
SVRMGR> startup restrict
用此种方式打开数据库,只允许管理员使用,而不允许一般用户访问,即只有具有create session权限和restricted session系统权限的用户才可以联接到数据库上(只有管理员才有此权限),利用该种方式启动,通常用于执行如下操作:
进行结构维护,例如重建索引。
进行数据库exp或imp。
进行数据装入(sql * loader)。
5. 强制数据库启动
SVRMGR> startup force
在用Normal和Immediate选项无法成功关闭数据库,或启动时出错,通常用此种方式打开数据库。
2.3.2 关闭数据库
关闭一个数据库分以下三步:
(1) Closing the database
ORACLE首先把高速缓冲区和重做日志缓冲区中的内容分别写入数据文件和联机日志文件,然后关闭所有联机数据文件和日志文件,这时控制文件仍处于打开状态。
(2) Dismounting the database
从一个实例卸装数据库,之后ORACLE关闭控制文件,但实例依然存在。
(3) Shutdown the Instance
ORACLE关闭ALERT文件和跟踪文件,释放SGA,终止后台进程,彻底关闭数据库。
ORACLE在关闭数据库时有三个常用选项:normal、immediate、abort。三个选项的关闭过程如下所示:
# su - ORACLE(取得ORACLE用户权限)
$ svrmgrl
SVRMGR> connect internal
1. 在正常情况下关闭数据库
SVRMGR> shutdown normal
用该种方式关闭数据库,关闭进程取消所有用户访问数据库,等待直至所有用户完成请求并与服务器脱离,清除缓冲区和重做日志文件并更新数据文件和联机重做日志文件,打开文件锁,完成正在进行的事务,更新文件头,关闭线程、打开数据库实例锁,使控制文件和数据文件同步。简言之,使用normal选项关闭数据库,卸装数据库,并完全关闭实例。该选项是关闭数据库时经常建议的选项。
2. 立即关闭数据库
SVRMGR> shutdown immediate
在特定条件下,关闭数据库时可能要选择immediate选项。例如,DBA可能决定在初始化文件中增加PROCESSES参数,如果这需要立即完成,则DBA使用immediate选项。如果使用该选项关闭数据库,则ORACLE正在处理的当前SQL语句立即被终止,任何未提交的事务被回滚,数据库被关闭。使用这一选项的唯一缺点是ORACLE不等待当前用户断开与数据库的连接,但数据库是连续的,且在下次启动时不需要恢复。
3. 异常中止例程
SVRMGR> shutdown abort
当紧急情况发生时,可以用abort选项关闭数据库。如当某个后台进程死掉后,可能导致无法用normal或immediate选项关闭数据库,要用到abort选项。当使用abort选项关闭数据库时,当前SQL语句立即停止,且未提交的事务不回滚,下次启动时要进行实例恢复。
2.4 应用开发工具(SQL * Plus)
SQL * Plus是ORACLE的交互查询工具,允许执行SQL语句和PL/SQL块。
SQL:是一种灵活高效的查询语言,其主要功能是对关系数据库中的数据进行操作和处理。
PL/SQL:是ORACLE对SQL规范的扩展,是一种块结构语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。
表2-1 下面给出SQL * Plus常用命令
进入SQL * Plus命令$sqlplus username/pass@servername
获取帮助命令help 命令字。例如:sql > help accept
查看表结构desc tablename
运行命令@ 例如: SQL>@icdmain.sql
终止符/
表2-2 命令行编辑命令
a text text行尾增加
c / old/new在当前行中将old改为new
c/text从当前行删除text
cl buff 删除SQl缓冲区所有行
Del 删除当前行
L *显示当前行
2.4.2 SQL
1. 基本查询命令
select colummn_name from tablename
where
group by
having
order by
where字句可使用运算符:=、 >、!=、>=、 =、in、between、like(%_)、is null 或is not null、not、or、and。
order by:asc(升序)或desc(降序),缺省升序。
group by:将查询结果分组,在包含group by 子句的查询中,select 子句的列表中的所有个体值(除聚组函数avg、count等外)必须是groub by子句中的表达式或常量。
having:如果需要对各个组返回的结果进行筛选,查询满足一定条件的分组值,可以使用having。例如:
select deptno,sum(sal)
from emp
group by deptno
having sum(sal)>9000;
2. 插入记录及数据更新
插入记录
insert into tablename(l1,l2)
values(v1,v2); 可以带&
insert into tablename(列表)
select 语句;
更新数据
update tablename
set 列名1=,列名2=
where
delete from tablename where
3. 事务控制
commit
set autocommit on
rollback
savepoint 保存点
2.4.3 PL/SQL
是ORACLE对SQL规范的扩展,是一种块结构语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。
1. 主要优点
(1) 模块化结构。
(2) 定义标识符(常量、变量、游标等)。
(3) 用过程化语言控制结构进行程序设计。
(4) 错误处理。
(5) 提高操作性能。
2. PL/SQL语句种类
表2-3 PL/SQL语句种类
DDL(数据定义语言)create(创建)、alter(修改结构)、drop(删除)、truncate(截 断)、(其他:rename)。
DML(数据操纵语言) insert(增)、delete(删)、select(查询)、update(改)。
DCL(数据控制语言) grant(授权)、revoke(回收权限)、set role(角色)。
事务控制 commit、rollback、savepoint(其他:lock table、set constraint(s)、set transaction)。
审计控制 audit、noaudit。
系统控制alter system。
会话控制alter session。
其他语句comment(添加注释)、explain plan、analyze(收集统计)、validate、call。
3. PL/SQL块的基本结构
分三部分:
声明部分(declarative section)(可选)。
执行部分(executable section)(必须)。
异常处理部分(exception section)(可选)。
例如:
DECLARE
tmp_dt date;
.....
BEGIN
select sysdate into tmp_dt from dual;
…
EXCEPTION
…
END;
4. PL/SQL常见的类型转换函数
表2-4 PL/SQL常见的类型转换函数
函数说明转换可使用的类型
TO_CHAR按照可选的格式将参数转换为字符类型数字型、日期型
TO_DATE按照可选的格式将参数转换为日期类型字符型
TO_NUMBER按照可选的格式将参数转换为NUMBER类型字符型
例如:
To_char(sysdate,’yyyy-mm-dd hh24:mi:ss’)
To_date(‘20020908','yyyymmdd')
To_number(‘20020911’)
to_number('123.4')
5. PL/SQL控制结构
分以下几类:
条件控制:IF-THEN-ELSE
循环:LOOP、FOR、WHILE
跳转控制:GOTO
(1) IF-THEN-ELSE语法
IF boolean_expression1 THEN
.....
[ ELSIF boolean_expression2 THEN
..... ]
[ ELSE
.......]
END IF
(2) LOOP
LOOP
……;
IF condition THEN
EXIT;
END IF;
END LOOP;
(3) WHILE
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
(4) FOR
FOR counter IN lower_bound..higher_bound LOOP
Sequence_of_statements;
END LOOP;
(5) GOTO
goto labelname;
labelname>>
说明:
可以是同一块中语句之间的跳转、可以从子块跳转到父块、不能从父块跳转到子块。
2.4.4 数据库管理工具
主要有以下几个工具:
SQL Worksheet:功能类似SQL Plus。
Instance Manager:可启动、关闭数据库,修改初始化参数,查看会话信息。
Schema Manager:可直接管理数据库对象,例如:表、存储过程、函数等。
Security Manager:对用户、角色进行管理。
Storage Manager:对表空间、数据文件、控制文件等进行管理。
2.5 ORACLE用户及权限管理
合理的用户和权限管理对于数据库系统的高效、安全、可靠是很关键的。ORACLE在用户及权限管理上有许多新的概念和特性。
说明:
对用户及权限的管理需要进入SQL*Plus交互工具。每一个SQL语句后要以分号“;”结束。退出交互工具命令为:quit
SQL命令语句及可选项不区分大小写,本文中出现大写的地方是强调作用。
2.5.1 ORACLE的用户管理
每个ORACLE数据库都有许多合法用户,这些用户可以根据用户名和口令登录数据库,并使用SQL语言存取数据。
(1) 创建用户
创建用户命令格式说 明
create user 用户名;创建用户的操作必须由DBA来做,一般用户无权创建用户。用户名必须是唯一的,即同一数据库中不能有两个相同的用户。
identified by 口令;为用户设置口令
default tablespace 表空间名;表示该用户存放数据的缺省表空间
temporary tablespace 表空间名;表明用户使用的缺省临时表空间名
quota 大小 on 表空间名;quota 可以限制用户在某个表空间上最多可使用多少字节
profile 资源文件;profile 为用户指定各种资源的使用
下面是一个创建用户的完整例子:
create user scott;
identified by tiger;
default tablespace data_ts;
temporary tablespace temp_ts;
quota 500K on data_ts;
profile newprofile;
(2) 修改用户
对用户的修改包括:口令字、缺省表空间、临时表空间、表空间限量、profile、缺省角色。角色是ORACLE7的一个新概念,我们在“权限管理”里再讨论。在这里可把角色看成具有某些权限的一个特殊用户。修改用户的缺省角色也就是为用户指明另一个权限的集合。下面举例说明修改用户的操作:
任 务命 令
将scott的口令改为helloALTER USER scott IDENTIFIED BY hello;
将scott的缺省表空间改为data2_tsALTER USER scott DEFAULT TABLESPACE data2_ts;
将scott的临时表空间修改为temp2_tsALTER USER scott TEMPORARY TABLESPACE temp2_ts;
将scott的资源文件改为otherprofileALTER USER scott PROFILE otherprofile;
将scott的缺省角色改为DEVELOPERALTER USER scott DEFAULT ROLE DEVELOPER;
将当前系统所有角色都授予scott,除Payroll外 ALTER USER scott DEFAULT ROLE ALL EXCEPT Payroll;
(3) 删除用户
删除用户的命令为:
DROP USER 用户名 [CASCADE];
若不使用CASCADE选项,则必须在该用户的所有实体都删除之后,才能删除该用户。使用CASCADE后,则不论用户实体有多大,都一并删除。
2.5.2 ORACLE的权限管理
ORACLE的安全机制,是由系统权限、实体权限和角色权限这三级体系结构组成的。
权限类型说 明
系统权限是指对数据库系统及数据结构的操作权,例如创建/删除用户、表、同义词、索引等等
实体权限是指用户对数据的操作权,如查询、更新、插入、删除、完整性约束等等
角色权限是把几个相关的权限组成角色,角色之间可以进一步组合而成为一棵层次树,以对应于现实世界中的行政职位。角色权限除了限制操作权、控制权外,还能限制执行某些应用程序的权限。
这样的安全控制体系,使得整个系统的管理人员及程序开发人员能控制系统命令的运行、数据的操作及应用程序的执行。
(1) 系统权限
系统权限的授予命令为GRANT,例如把创建任何表视图的权限授予scott用户:
GRANT create any view TO scott;
系统权限的回收命令为REVOKE,例如将create any view 权限从scott用户手中收回:
REVOKE create any view FROM scott;
(2) 实体权限
每种类型的实体有与之相关的实体权限。
授予实体权限的命令举例(将EMP表上的Select和Insert权限授给scott):
GRANT select,insert ON emp TO scott;
回收实体权限的命令举例(将EMP表上的Select权限从scott手中回收):
REVOKE select ON emp FROM scott;
(3) 管理角色
角色是许多权限和角色的组合,它极大地方便了ORACLE的权限管理。
创建角色,如创建一个名为dept1的角色,口令字为hello:
CREATE ROLE dept1 IDENTIFIED BY hello;
使用角色,可以通过修改用户的缺省角色来使用角色,或通过授权的方法来将角色授予其它角色或用户。如将scott用户的缺省角色修改为DEVELOPER:
ALTER USER scott DEFAULT ROLE DEVELOPER;
将角色dept1授予manager角色:
GRANT manager TO scott;
使角色生效或失效,DBA可以通过控制角色的生效或失效,来暂时回收用户的一部分权限。如使dept1角色失效:
SET ROLE dept1 DISABLE;
删除角色,这将会影响到拥有该角色的用户和其它角色的权限。用DROP ROLE命令删除角色,如:
DROP ROLE dept1;
2.6 ORACLE数据库的备份与恢复
ORACLE系统提供的Export/转入(备份)、Import/转出(恢复)使用程序实现备份与恢复功能。
Export是在数据库打开并能使用的情况下备份数据库数据的实用程序。用Export将数据库中的数据写到以二进制形式表示的操作系统文件中(ORACLE),该文件叫卸出文件,它可以是磁盘文件,也可以是磁带文件。这些文件独立于数据库存在。卸出文件在需要时能被再装入到ORACLE数据库中,也可装入到另一个CPU上的ORACLE数据库上,还可把它装入到不同ORACLE版本的数据库上。用Export可实现应用程序失败时的恢复,例如可把某个表或某些表恢复到执行该Export时的状态。
由于卸出文件的特殊格式,所以只能用Import实用程序将其读入数据库中。
2.6.1 Export 转入程序
ORACLE数据库有两类备份方法,第一类为物理备份,该方法实现数据库的完整恢复,但数据库必须运行在归档模式下,且需要极大的外部存储设备,例如磁带机;第二类备份方式为逻辑备份,客户服务中心业务数据库就是采用这种方式,这种方法不需要数据库运行在归档模式下,不但备份简单,而且可以不需要外部存储设备。
逻辑备份又分为三种模式。
表模式(T):这种模式可以卸出当前用户数据库模式下的表,甚至是所有的表。具有特权的用户可根据所指定的数据库模式来(限制表)卸出他们所包含的表。缺省情况是卸出属于当前正在进行卸出的用户的所有表。
用户模式(U):这种模式可以卸出当前用户数据库模式下的所有实体(表、数据和索引)。
全数据库模式(F):只有具有EXP_FULL_DATABASE角色的用户才可能以这种模式卸出。以这种模式进行卸出的用户,除SYS模式下的内容之外,数据库中所有实体都可以卸出。 下面列出给用户赋予EXP_FULL_DATABASE角色的方法。
# su – ORACLE假设当前为超级用户身份
$ sqlplus sys/change_on_install以sys用户登录并进入Sql*Plus
SQL> GRANT EXP_FULL_DATABASE TO 用户名在Sql*Plus下执行此命令
要选择表、用户或全数据库方式,可相应指定TABLES=tablelist、OWNER=userlist或FULL=y。
1. 表模式
EXP ICDMAIN/ICD BUFFER=8192(或64000)
FILE=EXP_ICDMAIN_SERVICEINFO.DMP 或(磁带设备/dev/rmt0)
TABLES=ICDMAIN.SERVICEINFO(或ICDMAIN.COMMONINFORMATION,ICDMAIN.DEALINFO .....)
ROWS=Y COMPRESS=N
LOG= EXP_ICDMAIN_SERVICEINFO.LOG
参数说明:
BUFFER缓冲区大小
FILE由Export创建的输出文件的名字
TABLES将要卸出的表名列表
ROWS指明是否卸出表中数据的行数,缺省为“Y”。
COMPRESS指明在装入期间是否将表中数据压缩到一个区域中。如果在卸出数据时,指定参数COMPRESS=Y,那么装入时,就会将数据压缩到一个初始区域中。这种选择可以保持初始化区域的原始大小。缺省为“Y”。
LOG指定一个接收有用信息和错误信息的文件
2. 用户模式
EXP ICDMAIN/ICD OWNER=ICDMAIN BUFFER=8192(或64000)
FILE=EXP_ICDMAINDB.DMP 或(磁带设备/dev/rmt0)
ROWS=Y
COMPRESS=N
LOG= EXP_ICDMAINDB.LOG
参数说明:
OWNER将要卸出的用户名列表
BUFFER、FILE、ROWS、COMPRESS、LOG同上
3. 全数据库模式
EXP ICDMAIN/ICD BUFFER=8192(或64000)
FILE=EXP_ICDMAIN_DB.DMP (或磁带设备/dev/rmt0)
FULL=Y ROWS=Y COMPRESS=N
LOG= EXP_ICDMAIN_DB.LOG
对于数据库备份,建议采用增量备份,即只备份上一次备份以来更改的数据。
增量备份命令:
EXP ICDMAIN/ICD BUFFER=8192(或64000)
FILE=EXP_ICDMAIN_DB.DMP (或磁带设备/dev/rmt0)
FULL=Y INCTYPE=INCREMENTAL ROWS=Y COMPRESS=N
LOG=EXP_ICDMAIN_DB.LOG
参数说明:
BUFFER、FILE、ROWS、COMPRESS、LOG同上
FULL指明是否卸出完整的数据库。如果FULL=Y,将以全数据库模式进行卸出。
INCTYPE增加卸出的类型,有效值有complete(完全)、comulative(固定)和incremental(增量)。
complete输出所有表
comulative将输入第一次完全输出后修改过的表
incremental将输出前一次输出后修改过的表
说明:
关于增量备份必须满足下列条件:
只对数据库备份有效,且第一次需要FULL=Y参数,以后需要INCTYPE=INCREMENTAL参数。
用户必须有EXP_FULL_DATABASE。
话务量较小时方可采用数据库备份。
使用Export备份数据时,可以使用联机帮助命令取得帮助信息,命令如下:
exp help=y
如果磁盘有空间,建议备份到磁盘,然后再备份到磁带。
2.6.2 Import 转入程序
Import和Export是两个相配套的实用程序,Export把数据库中的数据卸出到操作系统文件中,而Import实用程序则把Export卸出的数据恢复到数据库中。
按备份方案确定恢复方案,例如:采用表逻辑备份方案,则恢复方案也采用恢复到表的方式(不应恢复到用户)。
要使用Import,必须具有CREATE SESSION特权,以便能注册到ORACLE RDBMS中去。这一特权属于在数据库创建时所建立的CONNECT角色。
如果卸出文件是由某用户利用EXP_FULL_DATABASE角色创建的全数据库卸出,那么只有具有IMP_FULL_DATABASE角色的用户才能装入这样的文件。下面给用户赋予IMP_FULL_DATABASE角色的方法。
# su – ORACLE假设当前为超级用户身份
$ sqlplus sys/change_on_install以sys用户登录并进入Sql*Plus
SQL> GRANT IMP_FULL_DATABASE TO 用户名在Sql*Plus下执行此命令
数据库的逻辑恢复分为表、用户、数据库三种模式。
1. 表模式
恢复方法为:
IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名
ROWS=Y COMMIT=Y BUFFER=Y IGNORE=Y
TABLES=(表名1,表名2,表名3,表名4,.......)
参数说明:
BUFFER缓冲区大小
FILE用于装入的卸出文件名字
TABLES将要装入的表名列表
ROWS指明是否装入表数据的行数,缺省为“Y”。
IGNORE指明如何处理实体创建错误。指定IGNORE=Y,当试图创建数据库实体时,忽略实体存在错误。对除了表之外的其他实体,指定IGNORE=Y,Import不报告错误,继续执行。而指定IGNORE=N时,Import在继续执行前报告实体创建错误。
COMMIT指明在每个矩阵插入之后是否提交。缺省时,Import在装入每个实体之后提交。指定COMMIT=N时,如有错误产生,Import在记录装入下一个实体之前,完成一个回退。指定COMMIT=Y时,可以抑制回滚字段无