Oracle学习笔记
一、定位
oracle分两大块,一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭J;管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。
因为数据库管理的责任重大,很少公司愿意请一个刚刚接触oracle的人去管理数据库。对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理。当然,这个还是要看个人的实际情况来定。
二、oracle的体系
oracle的体系很庞大,要学习它,首先要了解oracle的框架。在这里,简要的讲一下oracle的架构,让初学者对oracle有一个整体的认识。
1、 物理结构
控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件
数据文件:存储数据的文件
重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件
参数文件:定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大小的参数
归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
密码文件:认证哪些用户有权限启动和关闭Oracle例程
2、逻辑结构(表空间、段、区、块)
表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。
段:是对象在数据库中占用的空间
区:是为数据一次性预留的一个较大的存储空间
块:ORACLE最基本的存储单位,在建立数据库的时候指定
3、内存分配(SGA和PGA)
SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反PGA是只被一个进程使用的区域,PGA在创建进程时分配在终止进程时回收
4、后台进程
数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件
日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
进程监控:负责在一个Oracle进程失败时清理资源
检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
归档进程:在每次日志切换时把已满的日志组进行备份或归档
服务进程:用户进程服务。
用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。
5、oracle例程
Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。
6、SCN(SystemChangeNumber)
系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
三、深入学习
管理:可以考OCP证书,对oracle先有一个系统的学习,然后看OracleConcepts、oracleonlinedocument,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等。
开发:对于想做Oracle开发的,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分。PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。Oracle的开发工具主要就是Oracle自己的DeveloperSuite(OracleFormsDeveloperandReportsDeveloper这些),学会如何熟练使用这些工具。
介绍几本oracle入门的好书
oracle官方文档:《concept》上面讲了oracle的体系和概念,很适合初学者看。
OCP的教学用书,也就是STUDYGUIDE(SG)。
Oracle8i备份恢复手册
Oracle8高级管理与优化
Oracle8iPLSQL程序设计
Oracle8数据库管理员手册
以上书本都是机械工业出版社出版。
介绍几个网站
http://www.oracle.comoracle/的官方网站
1.数据块缓区和SQL共享池(SharedSQLPool)是SGA中的最大部分,一般占分配给SGA的内存95%以上。通过减少对数据文件的I/O次数,这些存储区域可以改善数据库性能。
2.Oracle数据库结构可分为三个范畴:
.数据库内部的结构(如表)。
.存储区内部的结构(包括共享存储区和进程)。
.数据库外部的结构。
3.用户SYS和SYSTEM所拥有的表被称为数据字典表(datadictionarytable),数据字典表提供一个数据库用来管理自己的系统目录。数据字典由Oracle提供的一组目录脚本文件创建。每当安装或升级一个数据库时,都需要使用创建或修改数据字典表的的脚本文件。当在数据库中安装一个新的选项时,可能要运行另外一些附加的目录脚本文件。
4.Oracle8中,当把一个大表分成若干小表时,可以规定一些范围供数据库使用。这些称作分区(partition)的小表比大表的管理更加简单。例如,可以截断(truncate)一个分区的数据而不截断其他分区的数据。Oracle将把分区表看作一个大表,但可以把这些分区作为一些独立的对象来管理。
5.用户SYS拥有数据字典表,这些表存储了数据库中其他结构的所有信息;用户SYSTEM拥有访问数据字典表的视图,这些视图供数据库中其他用户使用。
6.用户帐号拥有的对象集称为用户的模式(schema)。
在关系数据库中,一个行的物理位置无关紧要,除非数据库需要找到它。为了能找到数
据,表中的每一行均用一个RowID来标识。RowID告诉数据库这一行的准确位置(指出行所在的文件、该文件中的块、该块中的行地址)。注意索引结构表没有传统的OracleRowID,不过,其主键起一个逻辑RowID的作用。
7.索引是一种供服务器在表中快速查找一个行的数据库结构。索引有三种形式:簇索引、
表索引和位映射索引。簇索引把簇关键字值存储在簇中;下面一小节将对簇的用途进行详细
描述。表索引除了确定行的物理位置(RowID)外,还存储表的行值。位映射索引是表索引的一种特殊形式,用于支持对大表进行查询(这些大表很少有不同值的列)。每一个索引条目都由一个键值和RowID组成。可以索引一个列或一组列,Oracle用B*树
(B*-tree)机制存储索引条目,以保证用最短路径访问键值。当一个查询访问索引时,就能找到与查询条件相匹配的索引条目。与条目相匹配的RowID值向Oracle提供相关行的物理位置,以减轻定位数据所需要的I/O负担。
8.视图的定义(包括作为基础的查询、列安排、授予的权限)存储在数据字典中。
9.函数、软件包和过程的源代码被存储在数据字典表中。
10.触发器分为两种类型:
.语句触发器:对每一个触发语句触发一次。
.行触发器:对受语句影响的表中的每一个行触发一次。
11.对于Oracle8,可以创建INSTEADOF触发器。INSTEADOF触发器执行一个替代操作来代替触发器的操作。也就是说,如果对表创建一个INSTEADOFINSERT触发器,将执行触发器的代码且绝不会出现引起触发器执行的insert操作。(不引起触发器的操作)
12.公用同义词由一个特定数据库的所有用户共享;私有同义词只被数据库的各个用户帐号所有者所拥有。
13.由于索引或触发器只能在表操作过程中被数据库访问,所以没有针对索引或触发器访问的权限。
14.段由称作盘区(extent)的一些邻接的Oracle块集合组成。一旦段中的现有盘区不能再容纳新数据,该段将获取另外的盘区。如果需要的话,这种扩展将持续下去,直到表空间的数据文件中没有自由空间或者已达到每个段内部的盘区最大数量为止。如果一个段中有多个盘区,将无法保证这些盘区连接在一起。
15.当你撤消一个段时,该段所使用的盘区就成为自由盘区。Oracle可以重新把这些自由盘区用于新的段或现有段的扩展。
16.Oracle用数据库中的回滚段来提供一个前映像数据。
17.显形图在结构上与快照非常相似。它存储基于一个基本查询的复制数据。快照一般存储来自远程数据库的数据,而显形图通常则存储从当前数据库中复制的数据。
18.通常,数据块缓存区只是数据库大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)算法来管理可用空间。
19.数据字典缓存区通过最近最少使用(LRU)算法来管理。字典缓存区的大小由数据库内部
管理。字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHAREDPOOL-SIZE参数来设置。
20.重做项描述对数据库进行的修改。它们写到联机重做日志文件中,以便在数据库恢复过程中用于向前滚动操作。
21.在第二次运行(由任何用户)相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度。
22.缓冲区的数量必须至少比LRU锁存器的数量多50倍。
23.当启动一个数据库时,SMON(SystemMonitor,系统监控程序)进程执行所需的实例恢复
操作(使用联机重做日志文件),它也可以清除数据库,取消系统不再需要的事务对象。SMON的另一个用途是:将邻接的自由盘区组成一个较大的自由盘区。
24.程序全局区(PGA,ProgramGlobalArea)是存储区中的一个区域,由一个Oracle用户单一进程所使用,PGA中的内存不能共享。(SGA可以共享数据)
25.PMON(进程监控程序)后台进程清除失败用户的进程,释放用户当时正在使用的资源。
26.DBWR(数据库写入程序)后台进程负责管理数据块缓存区及字典缓存区的内容。它以批方式把修改块从SGA写到数据文件中。如果创建多个DBWR进程,这些进程就不叫做DBWR,它们将有一个数字分量。例如,如果创建5个DBWR进程,进程的操作系统名就可能是DBW0、DBW1、DBW2、DBW3和DBW4。
27.LGWR(日志写入程序)后台进程负责把联机重做日志缓冲区的内容写入联机重做日志文
28.检查点使DBWR把上一个检查点以后的全部已修改数据块写入数据文件,并更新数据文件
头部和控制文件以记录该检查点。当一个联机重做日志文件被填满时,检查点进程会自动出现.可以用数据库实例的init.ora文件中的LOG_CHECKPOINT_INTERVAL参数来设置一个
频繁出现的检查点.
29.当Oracle以ARCHIVELOG(归档日志)模式运行时,数据库在开始重写重做日志文件之前
先对其进行备份。
30.RECO(恢复进程)后台进程用于解决分布式数据库中的故障问题。
31.Oracle保存所有数据库事务的日志。这些事务被记录在联机重做日志文件(onlineredolog file)中。
32.一个Oracle数据库的最简单形式由下列组件构成:
.一个或多个数据文件。
.一个或多个控制文件。 .两个或多个联机重做日志文件。
33.数据库内部结构包括:
.多用户/模式。
.一个或多个回滚段。
.一个或多个表空间。
.数据字典表。
.用户对象(表、索引、视图等)。
34.访问数据库的服务器的最小构成如下:
.一个SGA(其中包括数据块缓存区、重做日志缓存区、SQL共享池)。
.SMON后台进程。
.PMON后台进程。
.DBWR后台进程。
.LGWR后台进程。
.CKPT后台进程。
.与PGA相关联的用户进程。
35.全系统导出通常用于消除数据库中的碎片。
36.对数据库进行物理备份有两种方式可供选择:联机备份(onlinebackup)和脱机备份(offlinebackup)。
37.联机备份期间,先将表空间暂时置于一个备份状态,当文件备份完毕后,再将表空间恢复为正常状态。
38.Oracle8中的LOB存储区隐式采用1:1关系存储LOB数据。如果LOB数据大小超过一个阈值,它就与基表分开存储。
39.Oracle7.3之后的版本提供了Oracle Enterprise Manager(OEM,Oracle企业管理器)—图形用户界面(GUI)工具。
40.数据库服务器(也叫做实例)由一组内存结构和访问数据库文件的后台进程组成。
41.对于Net8的通信接收与处理,主机必须运行一个称作listener(监听器)的进程,这个监听器必须在与数据库通信有关的每一个主机上运行。
42.数据库链接不能用于从LONG数据类型字段返回数值。
43.三层结构是客户机/服务器模型的一种扩展。每一层的功能都视你的实现而定,通常这三
层的安排如下:
.客户机,用于提供应用程序。
.应用程序服务器,用于应用程序的业务逻辑处理。
.数据库服务器,用于数据的存储和检索。
44.可以使用Oracle Transparent Gateway(透明网关)从你的数据库中访问非Oracle数据库。每种被访问的数据库引擎需要一个独立的网关。网关在被访问数据的源主机上运行。例如,如果源数据存储在一个AS/400数据库上,则AS/400的OracleTransparentGateway软件就安装在AS/400服务器上。执行时,网关软件在源服务器上创建一个监听器,其作用与SQL*Net/Net8监听器一样。如果有一个用户名和这个数据库的口令,就可以访问AS/400数据库中的特定数据对象。
45.为了在数据库中高效地分布对象,必须首先建立一个分类系统。数据库中的逻辑对象必
须根据它们的使用方式及其物理结构对数据库的影响来进行分类。这种分类过程包括将索引
与表分开,将低活动性表与高活动性表分开。尽管对象的活动量只能在产品使用时确定,但
频繁使用的数据表核心集通常可以分离出去。
46.唯一能重建SYSTEM表空间的方法是重新创建数据库
47.数据字典段(Data dictionary segment)—数据字典表的物理存储区—存储在SYSTEM表空间中
48.数据段(data segment)是一些物理区域,用于存储与表和簇相关的数据。数据段经常被数据库访问,也经常执行数据操作事务。对数据段访问要求的管理是产品数据库的主要目标。
49.索引段不应与其相关表存储在同一个表空间中,因为它们在数据管理和查询时
存在许多I/O冲突。
50.在数据库中,回滚段维护语句级和事务级读的一致性。
51.临时段(temporary segment)是数据库中动态创建的对象,用以存储大型排序操作(如
Select distinct、union、create index等操作)中的数据。由于它们的动态性,所以临时段不应与其他类型的段一起存储。
52.如果把一个表空间指定为临时表空间,将不能在这个表空间内创建表和索引之类的永久性段。此外,当相关的命令结束时,不会撤消这个表空间中的临时段,只是空间管理量
有所减少。
53.通常把SYSTEM和SYS用户的临时表空间设置值改变成非SYSTEM表空间比较合适。
54.数据库逻辑设计的结果应当符合下述准则:
.以相同方式使用的段类型应当存储在一起。
.应当按照最通常的使用情况(事务大小、用户数量、事务数量等)来设计系统。
.应有用于例外情况的单独区域。
.应使表空间冲突最小化。
.应将数据字典分离开。
55.一般数据库中90%以的I/O都集中在数据(DATA)、回滚段(RBS)、系统(SYSTEM)、索引(INDEXES)四个表空间上。
56.每个数据库至少要有两个有效的联机重做日志文件。
57.当Oracle以ARCHIVELOG模式运行时,数据库会在重写联机重做日志文件之前,对它进
行拷贝。
58.要确保数据库的恢复能力,必须对联机重做日志文件进行镜像。
59.表空间级设置pctincrease设值为0,将影响Oracle自动合并表空间中自由空间的能力。把表空间的缺省pctincrease设置为一个非常低的值,例如1。
60.表段(Table segment)通常也称作数据段(datasegment),存储着与表或簇有关的行数据。每个数据段含一个标题块,用作段的空间目录。
61.从数据表中删除行对表所分配的空间量没有影响。
62.当创建一个数据库时,把数据库分成叫做表空间(table space)的多个逻辑区段。如第3章所述,SYSTEM表空间是创建的第一个表空间,然后创建另外的表空间以分别存储不同种类的数据。创建一个表空间时,会相应地创建数据文件(data file)以存储数据。这些文件立即分配在它们创建时指定的空间。因此,在数据库与表空间之间就存在着一对多的关系,并且在表空间与数据文件之间也存在一对多的关系。一个数据库可以有多个用户,其中的每个用户都拥有一个模式(schema)。每个用户模式是表和索引等数据库逻辑对象的集合。这些对象表示存储在表空间的物理数据结构。用户模式中的对象可以存储在多个表空间中,并且一个表空间可以包含多个模式中的对象。当创建一个数据库对象(如表或索引)时,可以通过用户缺省值或特殊指令将其赋予一个表空间。这样就会在该表空间中创建一个段(segment)以存储与该对象相关的数据。分配给这个段的空间会一直保留着,直到该段被撤消、人工收缩或截断。有关对分配给表、索引和簇的空间进行人工收缩的细节,请参见本章4.9节“段空间的重新分配方法”。一个段由一些称作盘区(extent)—一些连续的Oracle块—的区段组成。一旦现有的盘区不能再存储新数据,这个段就要获取另一个盘区。这种扩展过程将一直持续下去,直到表空间中的数据文件已没有自由空间,或者已达到每个段的最大内部盘区数量为止。如果一个段由多个盘区组成,则无法保证这些盘区的连续性。
63.要最小化数据段中的无用空间数量,需要调整pctfree参数。这个参数指定每一个数据块中将保留的自由空间数量。当NULL值的列被更新为有数值时,或者行中其他值的改变导致行长度增加时,就使用这一自由空间。pctfree参数的确切设置是与应用情况相关的,因为它取决于所执行的更新的性质。
64.对于临时表,将initial和next盘区大小设为表空间大小的1/20~1/50。对于这个表空间,initial和next缺省设置应当相等。将pctincrease值设为0,这样,段将由同样大小的盘区构成。当撤消这些段时,下一个临时段将能重新利用这些已撤消的盘区。
65.“临时”表空间不能用于存储任何永久段,只能存储操作时创建的临时段。
66.一个表空间可以包含多个数据盘区和一个或多个自由盘区(见图4-4a)。当一个段被撤消时,它的盘区被释放,并标记为“自由”。
67.可以使用alter table space命令中的coalesce子句来强制表空间合并其自由空间,如下所示:alter table space DATA coalesce;
这样可以促使DATA表空间中的相邻自由盘区合并成更大的自由盘区。
注意这个alter table space命令不能合并被数据盘区分隔的自由盘区。
合并只是对表空间内部的自由空间进行处理,并不能改变表空间的整体大小。
68.可以用alter datebase命令来手工扩展数据文件,如下例所示:
Alter database datafile‘db05/oracle/CC1/data01.dbf’resize 200M;
69.可以通过alter table space命令来增加一个新的数据文件,从而使表空间具有自动扩展能力。下列程序清单中的命令把一个新的数据文件添加给DATA表空间,并指定了auto extendoN和 max size为300MB:
Alter table space DATA
add datafile‘/db05/oracle/CC1/data02.dbf’
Size 50M auto extend ON max size 300M;
要改变一个现有数据文件的属性,可使用alterdatabase命令,如下所示:
Alter database
datafile‘/db05/oracle/CC11/data01.dbf’
auto extendON
max size 300M;
70.移动数据文件的方法有两种:通过alter database命令或alter table space命令。
Alter Table space方法仅用于其表空间不包括SYSTEM、回滚段或临时段的数据文件。
Alter database 方法可用于所有数据文件。
1.alter database方法
使用alterdatabase方法移动数据文件时,数据文件在实例关闭后移动。所涉及的步骤如下:
1)关闭实例,使用OEM或ServerManager。
2)使用操作系统命令来移动数据文件。
3)安装数据库并使用alterdatabase命令改变数据库中的文件名。
4)启动实例。
2.alter table space方法
使用altertablespace方法移动数据文件时,数据文件可以在实例运行期间移动。步骤如下:
1)设置表空间为脱机状态。
2)使用操作系统命令移动文件。
3)使用altertablespace命令更改数据库中的文件名。
4)重新设置表空间为联机状态。
5)注意此方法只适用于非SYSTEM表空间。不能用于含有活动的回滚段或临时段的表空间。
71.联机重做日志文件可以在数据库关闭时进行移动,并且通过alterdatabase命令在数据库中重新命名。这一过程与用alterdatabase命令移动数据文件的过程非常相似。
首先,将数据库关闭,移动联机重做日志文件。然后安装数据库,使用alterdatabase命令
向数据库通知联机重做日志文件的新位置。这样就可以用新位置上的日志文件打开实例。
72.控制文件的位置在实例的init.ora文件或config.ora文件中指定,通常是config.ora文件包含此信息。若要移动控制文件,必须关闭实例,移动文件,编辑config.ora文件,然后再重新启动该实例。
oracle的数据库文件由数据文件(.dbf)、控制文件(.ctl)、日志文件(.log)三种文件组成。所有的表空间数据都是放在数据文件(.dbf)中的。
73.高水位标志是段中已存储过数据的最大块数。如果在表中插入数千行记录,则此标志会不断增大;如果删除记录,此标志却不减少。除了撤消并重新创建表外,这个标志只有在发出一个truncate命令或数据段被撤消又重新创建时,才会被重新设置。
74.可以通过alter cluster命令deal locate unused子句来重新分配簇中的空间。同样,可以用alter index命令中的deallocateunused子句来重新分配索引的空间。不过,如下节所述,索引还有一个选项—alterindexrebuild命令,它使你能更灵活地管理索引空间的使用。
75.CONNECT角色不只给予用户能够在数据库中创建会话的权限。除了CREATESESSI0N系
统权限外,CONNECT角色还给予用户以下权限:ALTERSESSION、CREATECLUSTER、
CREATEDATABASELINK、CREATESEQUENCE、CREATESYNONYM、CREATE
TABLE和CREATEVIEW。然而,用户不具有创建表和簇的能力(这些对象都会占用数据库空
间),除非授予用户相应的表空间定额,或被授予RESOURCE角色。
76.权限只代表了你具有做这件事的资格,而能不能作还要看你的能力。就如上面你有建表的权限,但是因为其它条件不满足(没有空间能力)也不能建表。
77.RESOURCE角色具有以下系统权限:CREATECLUSTER、CREATEINDEXTYPE、CREATEOPERATOR、CREATEPROCEDURE、CREATESEQUENCE、CREATETABLE、CREATETRIGGER和CREATETYPE。具有RESOURCE角色的用户也被授予UNLIMITED TABLESPACE权限,因此这些用户可超越为他们定义的空间定额。应该把RESOURCE角色授予那些需要创建进程和触发器等PL/SQL对象的开发人员。如果开发人员使用了ObjectsOption(对象选项),RESOURCE角色将给予他们CREATETYPE权限,该权限允许他们创建和执行类型和方法。
78.DBA角色拥有带withadminoption的所有系统权限,withadminoption意味着DBA可以授
予其他用户系统权限。
79.注意连字符(-)是SQL*Plus中的一个连续符号,允许一个命令跨越多行。
80.当分配空间时,Oracle遵循下列内部规则:
1)Oracle只分配整个块,而不分配块的部分。
2)Oracle分配块组,通常是5块的倍数。
3)根据表空间中的可用自由空间,Oracle可分配更大或更小的块组。
81.必须正确设置盘区的大小,而不管表中的盘区数量。盘区的大小真正影响性能。
82.Oracle以两种方法从表中读数据:通过RowID(通常直接跟在一个索引访问后)和通过全表扫描。如果通过RowID来读数据,那么表中的盘区数就不是读性能的一个因素。Oracle将从其物理位置(按RowID)读取每一行并检索数据。如果通过全表扫描读取数据,那么盘区的大小可能会影响性能。当通过全表扫描读取数据时,Oracle将每次读出多个块。每次读取的块数通过init.ora参数DB_FILE_MULTIBLOCK_READ_COUNT来设置并受操作系统的I/O缓冲区大小的限制。例如,如果数据库的块大小是4KB,操作系统的I/O缓冲区大小是64KB,那么在全表扫描时每次最多可读取16块。在这种情况下,把DB_FILE_MULTIBLOCK_READ_COUNT的值设置为大于16不会改变全表扫描的性能。
83.因此,要避免为盘区大小付出性能代价,必须选择如下两种策略之一:
1)创建明显大于I/O容量的盘区。如果盘区非常大,即使盘区的大小不是I/O缓冲区大小的倍数,也只需要很少的附加读操作。
2)创建其大小是操作系统的I/O缓冲区大小的倍数的盘区。
84.当撤消一个段时,其盘区就被加回可用自由盘区的池中。必要时其他段可分配撤消的盘
区。如果使用一致的盘区大小,Oracle就更有可能重新使用撤消的盘区,因而更有效地利用表空间中的空间。
85.Oracle并不总是在主表外存储LOB数据。一般情况下,如果LOB数据不超过4KB长,就不在主表外存储LOB数据。
86.当查询抽象数据类型的属性时,必须使用该表名的相关变量。
87.当创建同义词时,Oracle并不检查正为其创建同义词的对象的有效性。如果创
建synonymxfory,Oracle将不检查该“y”是否是有效对象名或有效对象类型。只有
通过同义词访问该对象时,才检查该对象的通过同义词访问的有效性。
88.不能创建公共的数据类型,也不能创建数据类型的公共同义词。因此,需要引用数据类
型的拥有者,或者在每个能在数据库中创建表的帐户之下创建这个数据类型。这两者都不是
数据类型管理问题的简单解决办法。
89.要撤消一个列,可使用altertable命令中的setunused子句或drop子句。不能撤消伪列、嵌套表中的列或分区键列。如果撤消的列是主键的一部分或唯一约束,那么还必须使用cascadeconstraints子句作为altertable命令的一部分。如果撤消一个属于主键的列,Oracle就将同时撤消该列和该主键索引。
90.SQL的rollback命令使用户能撤消对数据库所做的事务。这种功能对任何update、insert或者delete事务都有效;但对数据库对象的变动则无能为力(如altertable命令)。当选择其他用户正在改变的数据时,Oracle使用回滚段来展示变动前的数据。
91.第一个回滚段被称为SYSTEM,它存储在SYSTEM表空间中。接下来的回滚段通常也在另外至少一个表空间中创建。
92.回滚段条目(rollbacksegmententry)是前映像数据块的集合,含有被一个事务修改的数据行。每个回滚段条目必须完整地包含在回滚段内。一个回滚段可以支持多个回滚段条目。
93.数据库按照循环(round-robin)方式,向产品回滚段分配回滚段条目。
94.SYSTEM回滚段不会在init.ora文件中列出,并且SYSTEM回滚段不能被撤消;它总是同实例能获得的其他回滚段一起被获取。
95.可以用settransaction命令指定一个事务处理应使用的回滚段。但应在实施大的事务处理前使用这个命令,以确保这个事务处理使用为它们特别创建的回滚段。一旦一个事务完成,它的数据不会从回滚段中删除。旧的回滚数据保留在回滚段中,以便对提交前开始执行的事务和查询提供服务。可以对回滚段进行收缩。可以用alterrollbacksegment命令中的shrink子句,将回滚段收缩到想要的大小。若没有指定收缩尺寸,回滚段将收缩到其optimal值。但不能把回滚段收缩到小于两个盘区。
96.关闭数据库将会复位V$ROLLSTAT表中的统计值。
97.高效管理回滚段的关键因素是使非激活、但正在被使用(IIU)的条目数据最少。
98.Oracle建议每个回滚段含4个事务。
回滚段的optimal值必须适合事务量及管理事务所需的系统开销。这种设计也应当能在一个盘区中处理大多数事务。因此,回滚段中的事务数量应按盘区估计。每一个回滚段所需的盘区数量为:
每个回滚段的盘区数=每盘区中的小事务数+((长事务的覆盖数+1)×平均长事务数)
回滚段的optimal值及optimal存储参数值为:
optimal=(每回滚段最小数据盘区数+回滚段头盘区+未激活但正使用+自由空间盘区)×盘区尺寸
99.当使用Oracle的Import实用程序时,它的缺省功能是为每个表的数据执行一次提交。要支持这一点,就需要有与该数据表同尺寸的一个回滚段。
100.数据装载事务必须指定给回滚段。可以使用settransactionuserollbacksegmentSEGMENTS_NAME;命令,或者除了只保留一个回滚段为激活状态外,使所有其他回滚段都变成非激活状态(在非峰值期)。使用本章前面提到的V$ROLLSTAT查询来测量数据装载事务的大小。
101.若要为一个OLTP数据库配置回滚段,必须首先确定数据库中的并发用户数量。如果有一个数据库,就可以查询V$LICENSE视图的Sessions_Highwater列,查看最后一次启动
数据库以来达到的最大并发用户数量。selectsessions_highwaterfromv$license;
102.以用户为中心的表设计不同于以理论为中心的表设计,它将产生一个能较好满足用户需
求的系统。设计选项包括将一个表分成几个表,也同样包括将几个表合并成一个表。重点应
放在向用户提供一个能按他们要求的格式访问数据的最直接路径。
103.通过DBA_SOURCE视图中的Text(文本)列,可以查看一个数据库中所有过程的SQL文本。USER_SOURCE视图将显示用户所拥有的过程。这些视图引用SYS.SOURCE$表。由于这个表是数据字典的一部分,所以过程代码就存储在SYSTEM表空间中。因此,如果使用这些对象,就必须确保给SYSTEM表空间分配更多的空间—一般是它的两倍。
104.在大多数Oracle表中,每个行都有与行相关的RowID(行标志)。RowID含有关于行的物理位置信息(行的文件、文件中的数据块、数据块中的行)。Oracle7和Oracle8中的RowID格式截然不同。
105.若要分析一个模式中的所有对象,可以使用DBMS_UTILITY软件包中的ANALYZE_SCHEMA
过程。下面的例子中含有两个参数:模式名称和analyze选项(COMPUTE或ESTIMATE):executeDBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','COMPUTE');
当执行上面例子中的命令时,将使用analyze命令的computestatistics选项对属于APPOWNER模式的全部对象进行分析。
106.可以对一个表的各个分区进行分析。例如,如果表TAB1有一个PART1分区,可以通过下列命令来分析该分区:
analyzetableTAB1partition(PART1)computestatistics;
107.段类型包括TABLE、INDEX、CLUSTER、ROLLBACK、TEMPORARY、DEFERREDROLLBACK和CACHE。
108.若启动SMON进程合并这些盘区,就应将表空间的pctincrease值设为非零。在下面的例子中,将DEMONDX表空间的缺省存储参数pctincrease设为1:
altertablespaceDEMONDX defaultstorage(pctincrease1);
若要手工合并表空间的自由盘区,请使用altertablespace命令的coalesce选项。altertablespaceDEMONDXcoalesce;
109.DBWR从进程可以解决多磁盘访问请求所造成的性能瓶颈问题。Oracle建议至少创建与磁盘数一样多的DBWR从进程。为一个实例创建的DBWR从进程数量,可以通过数据库init.ora文件中的DBWR_IO_SLAVES参数来设置。作为创建DBWR从进程的一种替代方案,可以创建多个DBWR进程。
110.据库中数据的最快方法是将它从一个表移到另一个表,而不要脱离数据库到操作系统中。当把数据从一个表传送到另一个表时,改善数据迁移的通用方法有4种:
1)调整结构—删除索引和触发器。
2)数据迁移期间停用约束条件。
3)使用提示和选项来改善事务性能。
4)隔离大型事务的回滚段。
禁止使用索引和触发器,可以解决大部分与表到表数据迁移工作相关的性能问题。
111.加密的形式将口令存储在一个数据字典表中。
112.由于没有指定定额,所以用户不能在数据库中创建对象。
113.除用户名外,createuser命令中的全部参数都可以由alteruser命令来更改。
114.可以用grant命令的withgrantoption子句把向其他用户授权的能力传递给被授予者。
115.若要查看具有SYSDBA或SYSOPER系统权限的用户,可以查询V$PWFILE_USERS。如果用户拥有SYSDBA权限,V$PWFILE_USERS在其SysDBA列中将有一个TRUE值;如果拥有SYSOPER权限,将在其SysOper列中有一个TRUE值。
116.Oracle8中,可以使用SQL*Plus的password命令来改变用户的口令。password命令将提示你输入一个旧口令、一个新口令和对新口令的确认。输入的口令值不在显示屏上显示。如下所示,若用SQL*Plus改变自己的口令,可键入password命令:password
若要改变另一个用户的口令,可以使用其后跟有用户名的password命令。passwordjane
117.角色的口令在角色创建时通过createrole命令设置。不一定非要给角色指定一个口令。如果指定了一个口令,角色被用户启用时必须输入口令。
createroleaccount_creatoridentifiedbyhelpdesk_only;
可以使用alterrole命令来改变与角色相关的口令。同用户口令一样,角色也可以是
identifiedexternally,从而也可以执行主帐帐户名与角色名的连接。与用户帐户不同,角色可能没有口令(缺省)。可以通过notidentified子句从一个角色中删除口令,如下例所示:
alterroleaccount_creatornotidentified;这个命令执行后,ACCOUNT_CREATOR角色将不受口令保护。
118.权限通过grant命令创建,存于数据字典中。对表、视图、序列(以及它们的同义词)的访问,加上执行过程、函数、软件包及类型的能力都可以授权给用户。表9-4列出了可以授予对象的权限。表9-4允许的对象权限
权限授予 能力
SELECT可查询对象
INSERT可以把行插入对象中,该权限可授予对象的特定列
UPDATE可更新对象的行,该权限可授予对象的特定列
DELETE可从对象中删除行
ALTER可修改对象
INDEX可以在表上创建索引
REFERENCES可以创建引用表的外键
EXECUTE可以执行函数、软件包、过程、库或类型
READ可访问目录
表9-5中列出的数据字典视图来列出数据库中已授予的权限。也可以使用用户级视图。
表9-5与权限相关的数据字典视图
数据字典视图内容
DBA_ROLES角色名及其口令状态
DBA_ROLES_PRIVS已被授予角色的用户
DBA_SYS_PRIVS已被授予系统权限的用户
DBA_TAB_PRIVS已被授予表中权限的用户
DBA_COL_PRIVS已被授予列中权限的用户
ROLE_ROLE_PRIVS已被授给其他角色的角色
ROLE_SYS_PRIVS已被授给角色的系统权限
ROLE_TAB_PRIVS已被授给角色的表权限
119.USER_RESOURCE_LIMITS视图中没有“DBA”类型,它严格地受用户当前会话的限制。若要查看与各可用资源相关的开销,可以查询RESOURCE_COST视图。数据库管理人员可以访问DBA_PROFILES视图来查看所有环境文件的资源限制。DBA_PROFILES的Resource_Type列表示资源环境文件是一个PASSWORD环境文件,还是一个KERNEL环境文件。除了这些视图外,还有两个视图。每个视图各有一个列,分别列出了当前会话中启用的权限和角色。它们是:
SESSION_PRIVSPrivilege列列出了会话中启用的所有系统权限,不论是直接授予还是通过角色授予。
SESSION_ROLESRole列列出了当前会话启用的所有角色。
SSESSION_PRIVS和SESSION_ROLES对所有用户都是可用的。
120.将一个不知道口令的用户变成另一个用户,进行操作,然后再变回来的标准步骤如下(前提你有dba权限):
1)查询DBA_USERS,确定帐户的当前加密口令。
2)之后,生成alteruser命令,以便将加密的口令恢复为其当前值。
3)将alteruser命令保存进一个文件。
4)改变用户的口令。
5)访问用户帐户并执行测试。
6)测试结束时,运行含有alteruser命令的文件,以便将用户的加密口令恢复为其原来的值。
121.如果用户的环境文件对口令有限制,则如下:
1)检查用户的环境文件设置值。
2)把用户分配给一个环境文件,该环境文件没有口令历史限制、没有口令验证函数,并有无限口令重用次数。例如,环境文件创建命令可能是:
createprofiletemp_profilelimit password_verify_functionnull
password_reuse_timeunlimited password_reuse_maxunlimited;
3)查询DBA_USERS,确定帐户的当前加密口令及环境文件。
4)之后,生成alteruser命令,以便以后将加密的口令恢复为其当前值。
5)将alteruser命令保存进一个文件。
6)改变用户口令。
7)访问用户的帐户并进行测试。
8)测试结束时,运行含有alteruser命令的文件,以便将用户的加密口令和环境文件恢复为其原始值。
122.每个连接数据库的企图都可被审计。开始审计登录企图的命令为:auditsession;
若只是审计成功或失败的连接企图,可使用下列命令之一:
auditsessionwheneversuccessful; auditsessionwhenevernotsuccessful;
若要禁止会话审计,可使用noaudit命令:noauditsession;
123.备份一个Oracle数据库有三种标准方式:
Export(导出)、脱机备份(offlinebackup)和联机(ARCHIVELOG)备份(onlinebackup)。导出方式是数据库的逻辑备份,其他两种备份方式都是物理文件备份。
124.已导出的数据不必导入到同一个数据库中,也不必导入到与生成导出转储文件相同的模
式中。可以使用导出转储文件来创建一个导出对象的复制集,其环境可以是不同的模式或独
立的数据库。
125.当数据库已经正常关闭(不包括由失败引起的关闭)时使用脱机备份。当数据库处于“offline”时,要备份下列文件:
.所有数据文件。
.所有控制文件。
.所有联机重做日志。
.init.ora文件(可选择)。
126.假若是运行在ARCHIVELOG方式下,数据库打开时就可以执行一个文件系统备份。联机备份包括将每一个表空间设为备份状态,接着备份其数据文件,然后再将表空间恢复为正常
状态。注意使用Oracle提供的RecoveryManager(RMAN)实用程序时,就不必将每个表空间都置于备份状态。该实用程序将自动把表空间带进或带出备份状态。
127.Export可以通过OEM或RMAN(或者通过命令文件)交互式运行。表10-1列出了可以为
Export指定的运行期选项。表10-1Export选项
关键字 描述
userid执行导出的帐户的用户名/口令,如果这是exp命令后的第一个参数,则关键字
userid就不必指定
buffer用于获取数据行的缓冲区尺寸,缺省值随系统而定,通常设为一个高值(>64000)
file导出转储文件的名字
filesize一个导出转储文件的最大尺寸。如果file条目中列出了多个文件,将根据filesize
设置值导出这些文件
compress一个Y/N标志,用于指定导出是否应把碎片段压缩成单个盘区。这个标志影响将存储到导出文件中的storage子句
grants一个Y/N标志,用于指定数据库对象的权限是否导出
indexes一个Y/N标志,用于指示表上的索引是否导出
rows一个Y/N标志,用于指示行是否导出。如果设置为N,在导出文件中将只创建数据库对象的DDL
constraints一个Y/N标志,用于指示表上的约束条件是否导出。
full若设为Y,执行Full数据库导出
owner导出数据库帐户的清单;可以执行这些账户的User导出
tables导出表的清单,可以执行这些表的Table导出
recordlength导出转储文件记录的长度,以字节为单位。除非是在不同的操作系统间转换导出文件,否则就使用缺省值
inctype要执行的导出类型(允许值为COMPLETE(缺省)、CUMULATIVE和INCREMENTAL),导出类型将在下几节描述
direct一个Y/N标志,用于指示是否执行Direct导出。Direct导出在导出期间绕过缓冲区,从而大大提高导出处理的效率
record用于Incremental导出,这个Y/N标志指示一个记录是否存储在记录导出的数据字典表中
parfile传递给Export的一个参数文件名。这个文件可以包含这里列出的全部参数条目
statistics这个参数指示导出对象的analyze命令是否应写到导出转储文件上。其有效值是COMPUTE、ESTIMATE(缺省)和N。在较早的Oracle版本中,这个参数叫作ANALYZE
consistent一个Y/N标志,用于指示是否应保留全部导出对象的读一致版本。在Export处理期间,当相关的表被用户修改时需要这个标志
log一个要写导出日志的文件名
feedback表导出时显示进度的行数。缺省值是0,所以在一个表全部导出前没有反馈显示
point_in_time_recover一个Y/N标志,用于向Oracle指示,是否正在导出用于表空间时间点恢复的元数据。
recover_tablespaces在表空间时间点恢复期间,其元数据应被导出的表空间
query导出时用于每个表的where子句
transport_tablespace如果正在使用Oracle8i的可移动表空间选项,就设置成Y。和关键字tablespace一起使用
tablespaces移动一个表空间时应导出其元数据的表空间
128.可以通过下列命令联机显示exp参数的说明:exphelp=Y
129.若要通过Export/Import把对象从一个用户转换到另一个用户,可对对象拥有者执行一个User导出操作。在导入操作期间,将拥有者指定为FROMUSER,将拥有对象的帐户指定为TOUSER。
130.当导出表时,Oracle按用户在数据库中创建的顺序导出用户。用户的表是按字母顺序导出的。
131.在进行导入操作时使用INDEXFILE选项,可以读取而不是导入导出转储文件,其建表和索引脚本文件会被写入一个输出文件中。可以编辑这个文件,以修改这里列出的表和索引的tablespace和storage参数。然后可以通过SQL*Plus运行修改后的文件,以便在导入数据前预建所有对象或只创建指定的对象(如索引)。
132.下面列举进入ARCHIVELOG方式的步骤(9I以下,如是9I以上,请在sqlplus中进行操作):
svrmgrl
svrmgrl>connectinternalassysdba
svrmgrl>startupmountcc1;
svrmgrl>alterdatabasearchivelog;
svrmgrl>archivelogstart;
svrmgrl>alterdatabaseopen;
133.下面的命令将从ServerManager中显示当前数据库的ARCHIVELOG状态。rchiveloglist;
134.若要使数据库返回NOARCHIVELOG方式,可使用下列命令(9I以下,如是9I以上,请在sqlplus中进行操作):
svrmgrl
svrmgrl>connectinternalassysdba
svrmgrl>startupmountcc1;
svrmgrl>alterdatabasenoarchivelog;
svrmgrl>alterdatabaseopen;
135.注意在未备份归档的重做日志文件前不要将其删除。在恢复时没有任何方法可以跳过一个丢失的归档重做日志文件。
136.热备份的命令文件有三个部分:
1)逐个表空间地备份数据文件,包括
a.设置表空间为备份状态。
b.备份表空间的数据文件。
c.将表空间恢复到正常状态。
2)备份归档重做日志文件,包括:
a.记录归档重做日志目标目录中的文件。
b.备份归档重做日志文件,然后(有选择地)删除或压缩它们。
3)通过alterdatabasebackupcontrolfile命令备份控制文件。
注意在进行第二步期间,当记录现有归档重做日志文件的名字时,暂停归档以防止新的归档重做日志文件被记录进来。如果在这个操作期间不暂停归档,就会删除没记录的文件(第二步b)。如果不能恢复这个文件,恢复时就无法重建已删除的归档重做日志文件的内容,也无法跳过这一步。所以删除这些文件时,要谨慎行事。
137.归档重做日志备份过程只是整个热备份进程的一个部分,有5步操作:
1)暂停归档处理。
2)记录归档重做日志目标目录中的文件。
3)重新启动归档处理。
4)备份归档重做日志文件。
5)从目标目录中删除这些文件。
138.可通过archivelogstop命令暂停ARCH进程。一旦完成工作(如生成归档日志目标区中的文件清单),就可以通过archivelogstart命令重新启动ARCH进程。
139.无论如何选择主备份方式,最终的实现应包括导出和物理备份。需要这些方式是因为它们适用于数据库的不同方面:
导出方式适用于对数据库进行逻辑备份,物理备份适用于对数据库进行物理备份。
这些方式的三种集成样本见表10-7。
表10-7数据库备份方式的集成样本
数据库类型联机备份 脱机备份 导出
所有尺寸,事务处理频繁每晚每周每周
小型,多数只读不做每周每晚
大型,多数只读不做每周每周
如表10-7所示,一个好的数据库备份策略,是根据数据库的使用特性对逻辑备份和物理备份的有效集成。
140.在大多数服务器中,磁带失效的平均间隔时间(MBTF)大约为3~4年。磁盘错误大多数是常见的硬件故障引起的。
三种最常见的数据库故障情形:实例失败、磁盘失败和用户失败。
141.当一个实例失败后数据库启动时,Oracle检查数据文件和联机重做日志文件,并把所有文件同步到同一个时间点上。即使数据库未运行在ARCHIVELOG方式中,Oracle也将执行这种同步。
142.在一个全(叫作0级)数据文件备份中,数据文件中用过的所有数据块都要进行备份。
在一个累积(叫做1级)数据文件备份中,上次数据文件全备份后用过的所有数据块都要进行备份,而在增量(2级)数据文件备份中,仅备份那些在上一次累积备份或全备份后发生变化的数据块。
143.若要创建恢复类别,请执行下述几步操作:
1)创建一个称作RCVCAT的表空间来安放恢复类别。
2)使用SecurityManager(安全管理器)创建一个拥有恢复类别的用户。
3)使用RMAN行方式命令创建恢复类别。
4)注册恢复类别。
144.表中释放的空间可以重用,但索引中释放的空间不能再用。因此,频繁从中删除行的
表应定期重建其索引,以避免在索引中造成空间碎片。
145.对于数据输入及特制报表,大多数软件包都包括一个联机用户组件;对于大型数据处理
操作,则包括一个批处理组件。联机用户需要足够数量的回滚段来支持其生成的大量并发事
务。批处理需要足够大的回滚段来支持最大的批处理事务。
146.对于任何频繁执行删除/插入事务的表,都要把pctused参数设置为一个高值(70或更高)。
147.每个数据库都有两组包要驻留:一组是每个数据库都要用的内核,另一组是应用程序特
定的。驻留的软件包内核组一般包括SYS拥有的包STANDARD、DBMS_SQL、DBMS_UTILITY和DIUTIL。
148.数据库建起来后就不能改变块大小。要想改变它,就只能彻底重建数据库及其所有数据
文件(通过当前数据的导出/导入)。
149.由于事务不能跨回滚段,必须有一个足够大的回滚段来处理一个事务。
150.不再用某个指定的容量来定义“大型”,而是依据其恢复时间来定义:如果不能在18小时内从全联机备份中完全恢复一个数据库,这就是一个大型数据库。这个定义使得“大型”数据库的容量随操作系统及硬件性能的改进而增加。
151.将一个表的数据分到多个表中叫作划分表。被划分的表叫做分区表,其各部分叫作分区。
152.对一个表进行分区时,应将这些分区存储在不同的表空间中。用表空间将它们分开存储
使你能控制其物理存储位置并避免分区间的冲突。
153.注意不能将对象表或使用LOB数据类型的表进行划分。
154.为一个表重新设置高水位标志的方法有两种:删除并重建表或者截断表。
155.对于一个大型数据库,SystemGlobalArea(SGA)的数据块缓冲区部分大约为数据库总容
量的2%,对于一个100GB的数据库来说,其SGA为2GB。一个足够大的SGA意指数据库运行
在能够支持大型内存区域管理的主机和操作系统上。
156.创建数据库时,应将数据块大小设置为操作系统上Oracle所支持的最大值。数据块容量越大,数据的存储效率就越高。当管理一个小型数据库时,使用较大的数据块容量所带来的存储效率及数据访问性能的改进是极为明显的。管理大型数据库时,存储效率及数据访问性能的改善是实质性的。对数据块的容量加倍后,大多数批量操作都可以提高40%的效率。
157.对于超大型表,其调整方法要集中在特殊的索引技术和对索引的可选择性上。
158.监听程序进程由ListenerControlUtility(监听程序控制实用程序)控制,通过lsnrctl命令来执行。Lsnrcl tstart
该命令将启动缺省的监听程序(命名为LISTENER)。如果想启动另一个监听程序,则可以在lsnrctl命令中包括该监听程序的名称作为第二个参数。
159.启动监听程序之后,通过使用ListenerControlUtility的status选项可以检查它是否正在运行。下列命令可用来进行这种检查:
Lsnrclt status
160.可以使用ListenerControlUtility来启动、停止和修改服务器上的监听程序进程,其命令选项列于表14-2。每个命令都可能有一个值,除setpassword命令外,这个值将是监听程序名。如果没指定监听程序名,就将使用缺省值(LISTENER)。一旦进入lsnrctl,就可通过set current_listener命令来改变正被修改的监听程序。
表14-2ListenerControlUtility命令
命令 描述
CHANGE_PASSWORD给给监听程序设置新口令,系统会提示输入监听程序的旧口令
DBSNMP_START给启动服务器上数据库的DBSNMP子代理
DBSNMP_STATUS给提供DBSNMP子代理的状态信息
DBSNMP_STOP给停止服务器上的DBSNMP子代理
EXIT给退出lsnrctl
HELP给显示lsnrctl命令选项的列表,也可以通过helpset和helpshow命令查看附加选项
QUIT给退出lsnrctl
RELOAD给允许在启动监听程序之后修改该监听程序。它强制SQL*Met读取并使用最新的listener.ora文件
SAVE_CONFIG给Net8中的新命令。创建现有的listener.ora文件的备份,然后用已由lisnrctl更改的参数来更新listener.ora文件
SERVICES给显示可用服务及其连接历史。它也列出是否为远程DBA或自动注册访问而启动每个服务
SET给设置参数值。
这些选项是:
给connet_timeout:以秒为单位,监听程序启动之后等待合法连接请求的时间
给current_listener:改变其参数正被设置或显示的监听程序进程
给log_directory:监听程序日志文件的目录
给log_file:监听程序日志文件的名称
给log_status:日志记录是ON还是OFF
给password:监听程序口令
给save_config_on_stop:在Net8中新引入。当退出lsnrctl时把配置变化保存到listener.ora文件
给startup_waittime:监听程序在响应lsnrctlstart命令之前的休眠秒数
给trc_directory:监听程序跟踪文件的目录
给trc_file:监听程序跟踪文件的名称
给trc_level:跟踪级(ADMIN、USER、SUPPORT或OFF)。参见lsnrctltrace
SHOW给显示当前参数设置。这些选项与除password命令外的set选项一样
SPAWN给产生一个以listener.ora文件中的别名运行的程序
START给启动监听程序
STATUS给提供有关监听程序的状态信息,包括它的启动时间、参数文件名、日志文件和它支持的服务。该命令可用来查询远程服务器上的监听程序的状态
STOP给停止监听程序
TRACE给把监听程序的跟踪级设置为下列4种选择之一:
给OFF
给USER(有限跟踪)
给ADMIN(高级跟踪)
给SUPPORT(Oracle支持)
VERSION给显示监听程序、TNS和协议适配器的版本信息
注意lsnrctl的新选项会随着Net8的每一个新版本而不断引入。
161.当操作NT系统上的Oracle时,请记住Oracle使用一个具有多线程的单进程。
162.虽然Oracle进程的各个线程名不能从操作系统(TaskManager或Services窗口)中看到,但通过下列查询可以从SQL*Plus获得:
Select b.namebkpr,a.usernamespid,p.pid
From v$bgprocess b,v$session s,v$process p
where p.addr=b.paddr(+)
andp.addr=s.paddr;
注意这个列表不显示监听程序线程和调度程序线程。
163.NT机器中的Net8监听程序是一种服务,通常当引导机器时,就自动启动该服务。有三种不同的方法可手工启动监听程序:
1)从Services窗口中选择Oracle<oracle_home>TNSListener选项并选中Start按钮。
2)从Start|Programs菜单中选择DOSwindow选项。在DOS窗口发出命令:
lsnrctlstart<listener_name>(缺省为LISTENER)
3)可以创建一个.bat文件并在该文件中发出命令:
netstartOracle<oracle_home>TNSListener
一旦启动Net8监听程序,它就开始监听来自网络上客户机的连接请求。一旦接收请求,
Net8就负责进行客户机和数据库之间的连接。
164.一旦连接被从监听程序传送到线程,就完成了监听程序的处理,并且在监听程序和该特
定客户机的连接之间不再有进一步的交互。如果由于某种原因必须关闭和重新启动监听程序,那么当前的客户机到数据库的连接不受这些动作的影响。
165.要查询远程数据库,必须创建一个数据库链接。
166.注意数据库链接不能用于从LONG数据类型的列中返回值。
167.实现远程数据操作,需要使用Two-PhaseCommit(2PC,两阶段提交)—这也是Oracle分布式数据库的功能本质。2PC可以把几个节点间的事务组看作是一个单元;或者是所有事务都提交,或者是它们都回滚。
168.注意不能用快照复制使用LONG、LONGRAW、BFILE或抽象数据库类型的数据。
2008-3-10新附加内容:
1.Oracle入门
一个表空间只能属于一个数据库
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)
每个数据库最少有一个表空间(SYSTEM表空间)
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典
每个数据库最少有两个联机日志组,每组最少一个联机日志文件
一个数据文件只能属于一个表空间
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中
建立新的表空间需要建立新的数据文件
COMMIT后,数据不一定立即写盘(数据文件)
一个事务即使不被提交,也会被写入到重做日志中。
oracle server可以同时启动多个数据库
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以)
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例
2.internal,sys,system用户有些什么不同的地方?
SYS INTERNAL SYSTEM帐号的区别
SYS and INTERNAL are synonymous. SYS should only be used administatively. SYS
(and internal) is special. You cannot create a trigger on a SYS table, you
cannot have a read only transaction as SYS and so on.
SYSTEM is simply an account that holds some data dictionary tables/views (not
many) and is a DBA. SYSTEM is a "regular" user -- nothing special about it.
Use SYS/internal as little as possible, I never use system for anything (Oracle
software might use it now and again to install some tables/run some scripts but
thats it). Create your own DBA accounts.
3. 常用用户SQL
SQL语句:
表:
select * from cat;
select * from tab;
select table_name from user_tables;
视图:
select text from user_views where view_name=upper('&view_name');
索引:
select index_name,table_owner,table_name,tablespace_name,status from user_indexes order by table_name;
触发器:
select trigger_name,trigger_type,table_owner,table_name,status from user_triggers;
快照:
select owner,name,master,table_name,last_refresh,next from user_snapshots order by owner,next;
同义词:
select * from syn;
序列:
select * from seq;
数据库链路:
select * from user_db_links;
约束限制:
select TABLE_NAME,CONSTRAINT_NAME,SEARCH_CONDITION,STATUS
from user_constraints WHERE TABLE_name=upper('&TABLE_Name');
本用户读取其他用户对象的权限:
select * from user_tab_privs;
本用户所拥有的系统权限:
select * from user_sys_privs;
用户:
select * from all_users order by user_id;
表空间剩余自由空间情况:
select tablespace_name,sum(bytes) 总字节数,max(bytes),count(*) from dba_free_space group by tablespace_name;
数据字典:
select table_name from dict order by table_name;
锁及资源信息:
select * from v$lock;不包括DDL锁
数据库字符集:
select name,value$ from props$ where name='NLS_CHARACTERSET';
inin.ora参数:
select name,value from v$parameter order by name;
SQL共享池:
select sql_text from v$sqlarea;
数据库:
select * from v$database
控制文件:
select * from V$controlfile;
重做日志文件信息:
select * from V$logfile;
来自控制文件中的日志文件信息:
select * from V$log;
来自控制文件中的数据文件信息:
select * from V$datafile;
NLS参数当前值:
select * from V$nls_parameters;
ORACLE版本信息:
select * from v$version;
描述后台进程:
select * from v$bgprocess;
查看版本信息:
select * from product_component_version;
4.Oracle中实现数据库的复制
在Internet上运作数据库经常会有这样的需求:把遍布全国各城市相似的数据库应用统一起来,一个节点的数据改变不仅体现在本地,还反映到远端。复制技术给用户提供了一种快速访问共享数据的办法。
一、实现数据库复制的前提条件
1、数据库支持高级复制功能
您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
2、数据库初始化参数要求
①、db_domain = test.com.cn
指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。
②、global_names = true
它要求数据库链接(database link)和被连接的数据库名称一致。
现在全局数据库名:db_name+”.”+db_domain
③、有跟数据库job执行有关的参数
job_queue_processes = 1
job_queue_interval = 60
distributed_transactions = 10
open_links = 4
第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
如果修改了以上这几个参数,需要重新启动数据库以使参数生效。
二、实现数据库同步复制的步骤
假设在Internet上我们有两个数据库:一个叫深圳(shenzhen),一个叫北京(beijing)。
具体配置见下表:
数据库名 shenzhen beijing
数据库域名 test.com.cn test.com.cn
数据库sid号 shenzhen beijing
Listener端口号 1521 1521
服务器ip地址 10.1.1.100 10.1.1.200
1、确认两台数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。
①、例如:深圳这边的数据库连接字符串是以下的格式
beijing =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = beijing)
)
)
运行$tnsping beijing
出现以下提示符:
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521))
OK(n毫秒)
表明深圳数据库可以访问北京数据库。
②、在北京那边也同样配置,确认$tnsping shenzhen 是通的。
2、改数据库全局名称,建公共的数据库链接。
①、用system身份登录shenzhen数据库
SQL>alter database rename global_name to shenzhen.test.com.cn;
用system身份登录beijing数据库:
SQL>alter database rename global_name to beijing.test.com.cn;
②、用system身份登录shenzhen数据库
SQL>create public database link beijing.test.com.cn using 'beijing';
测试数据库全局名称和公共的数据库链接
SQL>select * from [email protected];
返回结果为beijing.test.com.cn就对了。
用system身份登录beijing数据库:
SQL>create public database link shenzhen.test.com.cn using 'shenzhen';
测试数据库全局名称和公共的数据库链接
SQL>select * from [email protected];
返回结果为shenzhen.test.com.cn就对了。
3、建立管理数据库复制的用户repadmin,并赋权。
①、用system身份登录shenzhen数据库
SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
SQL>execute dbms_defer_sys.register_propagator('repadmin');
SQL>grant execute any procedure to repadmin;
SQL>execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
SQL>grant comment any table to repadmin;
SQL>grant lock any table to repadmin;
②、同样用system身份登录beijing数据库,运行以上的命令,管理数据库复制的用户repadmin,并赋权。
说明:repadmin用户名和密码可以根据用户的需求自由命名。
4、在数据库复制的用户repadmin下创建私有的数据库链接。
①、用repadmin身份登录shenzhen数据库
SQL>create database link beijing.test.com.cn connect to repadmin identified by repadmin;
测试这个私有的数据库链接:
SQL>select * from [email protected];
返回结果为beijing.test.com.cn就对了。
②、用repadmin身份登录beijing数据库
SQL>create database link shenzhen.test.com.cn connect to repadmin identified by repadmin;
测试这个私有的数据库链接
SQL>select * from [email protected];
返回结果为shenzhen.test.com.cn就对了。
5、创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字。
假设我们用ORACLE里举例用的scott用户,dept表。
①、用internal身份登录shenzhen数据库,创建scott用户并赋权
SQL>create user scott identified by tiger default tablespace users temporary tablespace temp;
SQL>grant connect, resource to scott;
SQL>grant execute on sys.dbms_defer to scott;
②、用scott身份登录shenzhen数据库,创建表dept
SQL>create table dept
(deptno number(2) primary key,
dname varchar2(14),
loc varchar2(13) );
③、如果数据库对象没有主关键字,可以运行以下SQL命令添加:
SQL>alter table dept add (constraint dept_deptno_pk primary key (deptno));
④、在shenzhen数据库scott用户下创建主关键字的序列号,范围避免和beijing的冲突。
SQL> create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache;
(说明:maxvalue 44可以根据应用程序及表结构主关键字定义的位数需要而定)
⑤、在shenzhen数据库scott用户下插入初始化数据
SQL>insert into dept values (dept_no.nextval,'accounting','new york');
SQL>insert into dept values (dept_no.nextval,'research','dallas');
SQL>commit;
⑥、在beijing数据库那边同样运行以上①,②,③
⑦、在beijing数据库scott用户下创建主关键字的序列号,范围避免和shenzhen的冲突。
SQL> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;
⑧、在beijing数据库scott用户下插入初始化数据
SQL>insert into dept values (dept_no.nextval,'sales','chicago');
SQL>insert into dept values (dept_no.nextval,'operations','boston');
SQL>commit;
6、创建要复制的组scott_mg,加入数据库对象,产生对象的复制支持
①、用repadmin身份登录shenzhen数据库,创建主复制组scott_mg
SQL> execute dbms_repcat.create_master_repgroup('scott_mg');
说明:scott_mg组名可以根据用户的需求自由命名。
②、在复制组scott_mg里加入数据库对象
SQL>execute dbms_repcat.create_master_repobject(sname=>'scott',oname=>'dept', type=>'table',use_existing_object=>true,gname=>'scott_mg');
参数说明:
sname 实现数据库复制的用户名称
oname 实现数据库复制的数据库对象名称
(表名长度在27个字节内,程序包名长度在24个字节内)
type 实现数据库复制的数据库对象类别
(支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体)
use_existing_object true表示用主复制节点已经存在的数据库对象
gname 主复制组名
③、对数据库对象产生复制支持
SQL>execute dbms_repcat.generate_replication_support('scott','dept','table');
(说明:产生支持scott用户下dept表复制的数据库触发器和程序包)
④、确认复制的组和对象已经加入数据库的数据字典
SQL>select gname, master, status from dba_repgroup;
SQL>select * from dba_repobject;
7、创建主复制节点
①、用repadmin身份登录shenzhen数据库,创建主复制节点
SQL>execute dbms_repcat.add_master_database
(gname=>'scott_mg',master=>'beijing.test.com.cn',use_existing_objects=>true, copy_rows=>alse, propagation_mode => 'asynchronous');
参数说明:
gname 主复制组名
master 加入主复制节点的另一个数据库
use_existing_object true表示用主复制节点已经存在的数据库对象
copy_rows false表示第一次开始复制时不用和主复制节点保持一致
propagation_mode 异步地执行
②、确认复制的任务队列已经加入数据库的数据字典
SQL>select * from user_jobs;
8、使同步组的状态由停顿(quiesced )改为正常(normal)
①、用repadmin身份登录shenzhen数据库,运行以下命令
SQL> execute dbms_repcat.resume_master_activity('scott_mg',false);
②、确认同步组的状态为正常(normal)
SQL> select gname, master, status from dba_repgroup;
③、如果这个①命令不能使同步组的状态为正常(normal),可能有一些停顿的复制,运行以下命令再试试(建议在紧急的时候才用):
SQL> execute dbms_repcat.resume_master_activity('scott_mg',true);
9、创建复制数据库的时间表,我们假设用固定的时间表:10分钟复制一次。
①、用repadmin身份登录shenzhen数据库,运行以下命令
SQL>begin
dbms_defer_sys.schedule_push (
destination => 'beijing.test.com.cn',
interval => 'sysdate + 10/1440',
next_date => sysdate);
end;
/
SQL>begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 10/1440',
delay_seconds => 0,
rollback_segment => '');
end;
/
②、用repadmin身份登录beijing数据库,运行以下命令
SQL>begin
dbms_defer_sys.schedule_push (
destination => ' shenzhen.test.com.cn ',
interval => 'sysdate + 10 / 1440',
next_date => sysdate);
end;
/
SQL>begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 10/1440',
delay_seconds => 0,
rollback_segment => '');
end;
/
10、添加或修改两边数据库的记录,跟踪复制过程
如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边repadmin用户下找到push的job_number,然后运行:
SQL>exec dbms_job.run(job_number);
三、异常情况的处理
1、检查复制工作正常否,可以在repadmin 用户下查询user_jobs
SQL>select job,this_date,next_date,what, broken from user_jobs;
正常的状态有两种:
任务闲——this_date为空,next_date为当前时间后的一个时间值
任务忙——this_date不为空,next_date为当前时间后的一个时间值
异常状态也有两种:
任务死锁——next_date为当前时间前的一个时间值
任务死锁——next_date为非常大的一个时间值,例如:4001-01-01
这可能因为网络中断照成的死锁
解除死锁的办法:
$ps –ef|grep orale
找到死锁的刷新快照的进程号ora_snp*,用kill –9 命令删除此进程
然后进入repadmin 用户SQL>操作符下,运行命令:
SQL>exec dbms_job.run(job_number);
说明:job_number 为用select job,this_date,next_date,what from user_jobs;命令查出的job编号。
2、增加或减少复制组的复制对象
①、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced )
用repadmin身份登录shenzhen数据库,运行以下命令
SQL>execute dbms_repcat.suspend_master_activity (gname => 'scott_mg');
②、在复制组scott_mg里加入数据库对象,保证数据库对象必须有主关键字。
SQL>execute dbms_repcat.create_master_repobject(sname=>'scott',oname=>'emp', type=>'table',use_existing_object=>true,gname=>'scott_mg');
对加入的数据库对象产生复制支持
SQL>execute dbms_repcat.generate_replication_support('scott','emp','table');
③、在复制组scott_mg里删除数据库对象。
SQL>execute dbms_repcat.drop_master_repobject ('scott','dept','table');
④、重新使同步组的状态由停顿(quiesced )改为正常(normal)。
SQL> execute dbms_repcat.resume_master_activity('scott_mg',false);
5.简说Oracle启动及关闭数据库实例
oracle用户,dbstart和dbshut启动及关闭/var/opt/oracle/oratab或/etc/oratab中设定的数据库实例,dbstart采用normal方式,dbshut采用immediate方式。
或者使用手工方式
sqlplus “/ as sysdba”
启动
normal
SQL>startup
mount
SQL>startup mount; #启动实例进程,载入数据库文件,允许DBA权限的某些操作,但禁止对数据库文件的一般性操作
SQL>完成某些操作
SQL>alter database open;
nomount
SQL>startup nomount; #启动实例进程,但不允许访问数据库,常用于创建数据库、介质恢复或创建controlfile
SQL>完成某些操作
SQL>alter database open;
关闭
normal
SQL>shutdown或SQL>shutdown transactional; #等待每个连接交易完成后,切断连接,再关闭数据库
immediate
SQL>shutdown immediate; #立刻中止每个连接,交易回滚
abort
SQL>shutdown abort; #立刻关闭数据库,不保证交易完整性,在下一次启动打开数据库文件时会进行介质恢复
6.常用监控SQL
1.监控事例的等待:
select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,count(*)
from v$session_wait
group by event order by 4;
2.回滚段的争用情况:
select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn=b.usn;
3.监控表空间的I/O比例:
select df.tablespace_name name,df.file_name "ile",f.phyrds pyr,f.phyblkrd pbr,f.phywrts pyw,
f.phyblkwrt pbw
from v$filestat f,dba_data_files df
where f.file#=df.file_id
4.监空文件系统的I/O比例:
select substr(a.file#,1,2) "#",substr(a.name,1,30) "name",a.status,a.bytes,
b.phyrds,b.phywrts
from v$datafile a,v$filestat b
where a.file#=b.file#
5.在某个用户下找所有的索引:
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
6. 监控 SGA 的命中率
select a.value + b.value "logical_reads", c.value "phys_reads",
round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.statistic# = 38 and b.statistic# = 39
and c.statistic# = 40;
7. 监控 SGA 中字典缓冲区的命中率
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses;
8. 监控 SGA 中共享缓存区的命中率,应该小于1%
select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;
select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
from v$librarycache;
9. 显示所有数据库对象的类别和大小
select count(name) num_instances ,type ,sum(source_size) source_size ,
sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
from dba_object_size
group by type order by 2;
10. 监控 SGA 中重做日志缓存区的命中率,应该小于1%
SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');
11. 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');
12. 监控当前数据库谁在运行什么SQL语句
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
13. 监控字典缓冲区
SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;
后者除以前者,此比率小于1%,接近0%为好。
SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
FROM V$ROWCACHE
14. 找ORACLE字符集
select * from sys.props$ where name='NLS_CHARACTERSET';
15. 监控 MTS
select busy/(busy+idle) "shared servers busy" from v$dispatcher;
此值大于0.5时,参数需加大
select sum(wait)/sum(totalq) "ispatcher waits" from v$queue where type='dispatcher';
select count(*) from v$dispatcher;
select servers_highwater from v$mts;
servers_highwater接近mts_max_servers时,参数需加大
16. 碎片程度
select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
having count(tablespace_name)>10;
alter tablespace name coalesce;
alter table name deallocate unused;
create or replace view ts_blocks_v as
select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space
union all
select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
select * from ts_blocks_v;
select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
group by tablespace_name;
查看碎片程度高的表
SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);
17. 表、索引的存储情况检查
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name;
select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&wner'
group by segment_name;
18、找使用CPU多的用户session
12是cpu used by this session
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;
20.监控log_buffer的使用情况:(值最好小于1%,否则增加log_buffer 的大小)
select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value||'%' "radio"
from v$sysstat rbar,v$sysstat re
where rbar.name='redo buffer allocation retries'
and re.name='redo entries';
19、查看运行过的SQL语句:
SELECT SQL_TEXT
FROM V$SQL
7. 安装Oracle后,经常使用的修改表空间的SQL代码配置:
Windows NT 4.0 中文版
5块10.2GB SCSI硬盘
分:C:盘、D:盘、E:盘、F:盘、G:盘
Oracle 8.0.4 for Windows NT
NT安装在C:\WINNT,Oracle安装在C:\ORANT
目标:
因系统的回滚段太小,现打算生成新的回滚段,
建立大的、新的表空间(数据表空间、索引表空间、回滚表空间、临时表空间、)
建两个数据表空间、两个索引表空间,这样建的目的是根据实际应用,
如:现有10个应用用户,每个用户是一个独立子系统(如:商业进销存MIS系统中的财务、收款、库存、人事、总经理等)
尤其大型商场中收款机众多,同时访问进程很多,经常达到50-100个进程同时访问,
这样,通过建立多个用户表空间、索引表空间,把各个用户分别建在不同的表空间里(多个用户表空间放在不同的物理磁盘上),
减少了用户之间的I/O竞争、读写数据与写读索引的竞争(用户表空间、索引表空间也分别放在不同的物理磁盘上)
规划:
C:盘、NT系统,Oracle系统
D:盘、数据表空间1(3GB、自动扩展)、回滚表空间1(1GB、自动扩展)
E:盘、数据表空间2(3GB、自动扩展)、回滚表空间2(1GB、自动扩展)
F:盘、索引表空间1(2GB、自动扩展)、临时表空间1(0.5GB、不自动扩展)
G:盘、索引表空间2(2GB、自动扩展)、临时表空间2(0.5GB、不自动扩展)
注:这只是一个简单的规划,实际规划要依系统需求来定,尽量减少I/O竞争
实现:
1、首先查看系统有哪些回滚段及其状态。
SQL> col owner format a20
SQL> col status format a10
SQL> col segment_name format a20
SQL> col tablespace_name format a20
SQL> SELECT OWNER,SEGMENT_NAME,TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
2 FROM DBA_SEGMENTS
3 WHERE SEGMENT_TYPE='ROLLBACK'
4 GROUP BY OWNER,SEGMENT_NAME,TABLESPACE_NAME
5 /
OWNER SEGMENT_NAME TABLESPACE_NAME M
-------------------- -------------------- -------------------- ---------
SYS RB1 ROLLBACK_DATA .09765625
SYS RB10 ROLLBACK_DATA .09765625
SYS RB11 ROLLBACK_DATA .09765625
SYS RB12 ROLLBACK_DATA .09765625
SYS RB13 ROLLBACK_DATA .09765625
SYS RB14 ROLLBACK_DATA .09765625
SYS RB15 ROLLBACK_DATA .09765625
SYS RB16 ROLLBACK_DATA .09765625
SYS RB2 ROLLBACK_DATA .09765625
SYS RB3 ROLLBACK_DATA .09765625
SYS RB4 ROLLBACK_DATA .09765625
SYS RB5 ROLLBACK_DATA .09765625
SYS RB6 ROLLBACK_DATA .09765625
SYS RB7 ROLLBACK_DATA .09765625
SYS RB8 ROLLBACK_DATA .09765625
SYS RB9 ROLLBACK_DATA .09765625
SYS RB_TEMP SYSTEM .24414063
SYS SYSTEM SYSTEM .1953125
查询到18记录.
SQL> SELECT SEGMENT_NAME,OWNER,
2 TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS
3 FROM DBA_ROLLBACK_SEGS
4 /
SEGMENT_NAME OWNER TABLESPACE_NAME SEGMENT_ID FILE_ID STATUS
-------------------- -------------------- -------------------- ---------- --------- ----------
SYSTEM SYS SYSTEM 0 1 ONLINE
RB_TEMP SYS SYSTEM 1 1 OFFLINE
RB1 PUBLIC ROLLBACK_DATA 2 3 ONLINE
RB2 PUBLIC ROLLBACK_DATA 3 3 ONLINE
RB3 PUBLIC ROLLBACK_DATA 4 3 ONLINE
RB4 PUBLIC ROLLBACK_DATA 5 3 ONLINE
RB5 PUBLIC ROLLBACK_DATA 6 3 ONLINE
RB6 PUBLIC ROLLBACK_DATA 7 3 OFFLINE
RB7 PUBLIC ROLLBACK_DATA 8 3 OFFLINE
RB8 PUBLIC ROLLBACK_DATA 9 3 OFFLINE
RB9 PUBLIC ROLLBACK_DATA 10 3 OFFLINE
RB10 PUBLIC ROLLBACK_DATA 11 3 OFFLINE
RB11 PUBLIC ROLLBACK_DATA 12 3 OFFLINE
RB12 PUBLIC ROLLBACK_DATA 13 3 OFFLINE
RB13 PUBLIC ROLLBACK_DATA 14 3 OFFLINE
RB14 PUBLIC ROLLBACK_DATA 15 3 OFFLINE
RB15 PUBLIC ROLLBACK_DATA 16 3 OFFLINE
RB16 PUBLIC ROLLBACK_DATA 17 3 OFFLINE
查询到18记录.
2、修改代码如下,可把以下代码存入一.sql文件,如cg_sys.sql,然后以SQL> @cg_sys.sql调用执行。
--注意:各个硬盘上要事先建好oradata目录
--修改现有回滚段,使之失效,下线
alter rollback segment rb1 offline;
alter rollback segment rb2 offline;
alter rollback segment rb3 offline;
alter rollback segment rb4 offline;
alter rollback segment rb5 offline;
alter rollback segment rb6 offline;
alter rollback segment rb7 offline;
alter rollback segment rb8 offline;
alter rollback segment rb9 offline;
alter rollback segment rb10 offline;
alter rollback segment rb11 offline;
alter rollback segment rb12 offline;
alter rollback segment rb13 offline;
alter rollback segment rb14 offline;
alter rollback segment rb15 offline;
alter rollback segment rb16 offline;
--删除原有回滚段
drop rollback segment rb1;
drop rollback segment rb2;
drop rollback segment rb3;
drop rollback segment rb4;
drop rollback segment rb5;
drop rollback segment rb6;
drop rollback segment rb7;
drop rollback segment rb8;
drop rollback segment rb9;
drop rollback segment rb10;
drop rollback segment rb11;
drop rollback segment rb12;
drop rollback segment rb13;
drop rollback segment rb14;
drop rollback segment rb15;
drop rollback segment rb16;
--建数据表空间1
--收款、库存、订货、远程通信
create tablespace USER_DATA1 datafile
'd:\oradata\user1_1.ora' size 512M,
'd:\oradata\user1_2.ora' size 512M,
'd:\oradata\user1_3.ora' size 512M,
'd:\oradata\user1_4.ora' size 512M,
'd:\oradata\user1_5.ora' size 512M,
'd:\oradata\user1_6.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--initial 128K,因为,用户建在表空间上,而表建在用户里,为用户所拥有,
--用户继承数据表空间的存储参数,表继承用户的存储参数
--如果initial设的过大,如:5M,则每建一个空表就要占用5M的空间,即使一条记录也没有
--AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED,设置数据文件自动扩展,每一次扩展增加5M,最大空间不受限
--建数据表空间2
--物价、人事、结算、财务、总经理、合同、统计
create tablespace USER_DATA2 datafile
'e:\oradata\user2_1.ora' size 512M,
'e:\oradata\user2_2.ora' size 512M,
'e:\oradata\user2_3.ora' size 512M,
'e:\oradata\user2_4.ora' size 512M,
'e:\oradata\user2_5.ora' size 512M,
'e:\oradata\user2_6.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--建索引表空间1
create tablespace INDEX_DATA1 datafile
'f:\oradata\index1_1.ora' size 512M,
'f:\oradata\index1_2.ora' size 512M,
'f:\oradata\index1_3.ora' size 512M,
'f:\oradata\index1_4.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--建索引表空间2
create tablespace INDEX_DATA2 datafile
'g:\oradata\index2_1.ora' size 512M,
'g:\oradata\index2_2.ora' size 512M,
'g:\oradata\index2_3.ora' size 512M,
'g:\oradata\index2_4.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--建回滚表空间1
--设置初始值40M(initial 40M),则每在这个表空间中建一个回滚段,
--此回滚段自动继承此回滚表空间的存储参数,也即默认文件为40M
create tablespace ROLLBACK_DATA1 datafile
'd:\oradata\roll1_1.ora' size 512M,
'd:\oradata\roll1_2.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);
--建回滚表空间2
create tablespace ROLLBACK_DATA2 datafile
'e:\oradata\roll2_1.ora' size 512M,
'e:\oradata\roll2_2.ora' size 512M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);
--建临时表空间1
create tablespace TEMPORARY_DATA1 datafile
'f:\oradata\temp1_1.ora' size 512M
default storage (initial 10M next 3M pctincrease 0);
--建临时表空间2
create tablespace TEMPORARY_DATA2 datafile
'g:\oradata\temp2_1.ora' size 512M
default storage (initial 10M next 3M pctincrease 0);
--使其真正成为临时的
alter tablespace TEMPORARY_DATA1 temporary;
alter tablespace TEMPORARY_DATA2 temporary;
--建立新的回滚段,每个都一样大,不同大小的回滚段没有什么意义,系统是随机选择的。
--建多少个,根据并发访问用户的多少,
--如果你们公司每天有50-100个人员使用Oracle系统开发的管理软件,应该20个以上
create public rollback segment rb01 tablespace rollback_data1;
create public rollback segment rb02 tablespace rollback_data1;
create public rollback segment rb03 tablespace rollback_data1;
create public rollback segment rb04 tablespace rollback_data1;
create public rollback segment rb05 tablespace rollback_data1;
create public rollback segment rb06 tablespace rollback_data1;
create public rollback segment rb07 tablespace rollback_data1;
create public rollback segment rb08 tablespace rollback_data1;
create public rollback segment rb09 tablespace rollback_data2;
create public rollback segment rb10 tablespace rollback_data2;
--前8个建在回滚表空间1中,后8个在回滚表空间2
create public rollback segment rb11 tablespace rollback_data2;
create public rollback segment rb12 tablespace rollback_data2;
create public rollback segment rb13 tablespace rollback_data2;
create public rollback segment rb14 tablespace rollback_data2;
create public rollback segment rb15 tablespace rollback_data2;
create public rollback segment rb16 tablespace rollback_data2;
create public rollback segment rb17 tablespace rollback_data2;
create public rollback segment rb18 tablespace rollback_data2;
create public rollback segment rb19 tablespace rollback_data2;
create public rollback segment rb20 tablespace rollback_data2;
--使回滚段online,即有效
alter rollback segment rb01 online;
alter rollback segment rb02 online;
alter rollback segment rb03 online;
alter rollback segment rb04 online;
alter rollback segment rb05 online;
alter rollback segment rb06 online;
alter rollback segment rb07 online;
alter rollback segment rb08 online;
alter rollback segment rb09 online;
alter rollback segment rb10 online;
alter rollback segment rb11 online;
alter rollback segment rb12 online;
alter rollback segment rb13 online;
alter rollback segment rb14 online;
alter rollback segment rb15 online;
alter rollback segment rb16 online;
alter rollback segment rb17 online;
alter rollback segment rb18 online;
alter rollback segment rb19 online;
alter rollback segment rb20 online;
--查看现有回滚段及其状态
col segment format a30
SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;
--查看数据文件及其所在表空间、大小、状态
col file_name format a40
col tablespace_name format a20
select file_name,file_id,tablespace_name,bytes,status from dba_data_files;
至此,表空间重新规划完毕,这里讲的比较通俗,还有好多参数值得设置,能够把Oracle设置到最优的境界,
表空间设置完了,下面,就该好好的整理一下Oracle的内存区了,
Oracle很有意思,内存越大,效果越明显,所以有必要好好调整一下SGA区,也就是主要配置ininorcl.ora参数文件。
8.用户如何有效地利用数据字典
ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化,
体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。
数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。
我们不能手工修改数据字典里的信息。
很多时候,一般的ORACLE用户不知道如何有效地利用它。
dictionary 全部数据字典表的名称和解释,它有一个同义词dict
dict_column 全部数据字典表里字段名称和解释
如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句:
SQL>select * from dictionary where instr(comments,'index')>0;
如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:
SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES';
依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。
一、用户
查看当前用户的缺省表空间
SQL>select username,default_tablespace from user_users;
查看当前用户的角色
SQL>select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
二、表
查看用户下所有的表
SQL>select * from user_tables;
查看名称包含log字符的表
SQL>select object_name,object_id from user_objects
where instr(object_name,'LOG')>0;
查看某表的创建时间
SQL>select object_name,created from user_objects where object_name=upper('&table_name');
查看某表的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&table_name');
查看放在ORACLE的内存区里的表
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
三、索引
查看索引个数和类别
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&index_name');
四、序列号
查看序列号,last_number是当前值
SQL>select * from user_sequences;
五、视图
查看视图的名称
SQL>select view_name from user_views;
查看创建视图的select语句
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
六、同义词
查看同义词的名称
SQL>select * from user_synonyms;
七、约束条件
查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
from user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
八、存储函数和过程
查看函数和过程的状态
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&plsql_name');
九、触发器
查看触发器
set long 50000;
set heading off;
set pagesize 2000;
select
'create or replace trigger "' ||
trigger_name || '"' || chr(10)||
decode( substr( trigger_type, 1, 1 ),
'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF' ) ||
chr(10) ||
triggering_event || chr(10) ||
'ON "' || table_owner || '"."' ||
table_name || '"' || chr(10) ||
decode( instr( trigger_type, 'EACH ROW' ), 0, null,
'FOR EACH ROW' ) || chr(10) ,
trigger_body
from user_triggers;
9.oracle数据库的各种文件类型和默认的存放位置这方面的资料
查询v$logfile查询oracle的重做日志文件的位置
tzxd@webora9> col member format a60 heading 'log filename'
tzxd@webora9> select * from v$logfile;
查询v$controlfile得到oracle的控制文件的位置
tzxd@webora9> col name format a60 heading 'control filename'
tzxd@webora9> select * from v$controlfile;
查询v$tempfile得到系统中临时表空间的临时表文件的位置
tzxd@webora9> col name format a50 heading 'temp filename'
tzxd@webora9> col bytes format 999999 heading 'M Bytes'
tzxd@webora9> col file# format 99
tzxd@webora9> col ts# format 99
tzxd@webora9> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
查询v$datafile得到系统中的数据文件,系统文件,回滚段文件的位置
tzxd@webora9> select file#,creation_time,ts#,status,enabled,bytes/1024/1024 bytes,name
2 from v$datafile;
使用show parameter查出用户存放trc文件的位置
tzxd@webora9> show parameter dump_dest
10. Oracle数据库的几种启动和关闭方式有以下几种启动方式:
1、startup nomount
非安装启动,这种方式启动下可执行:重建控制文件、重建数据库
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
2、startup mount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件。
执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行校验检查。
3、startup open dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,
这种方式下可访问数据库中的数据。
4、startup,等于以下三个命令
startup nomount
alter database mount
alter database open
5、startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
6、startup force
强制启动方式
当不能关闭数据库时,可以用startup force来完成数据库的关闭
先关闭数据库,再执行正常启动数据库命令
7、startup pfile=参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:\Oracle\admin\oradb\pfile\init.ora
8、startup EXCLUSIVE
============================================
有三种启动方式:
1、shutdown normal
正常方式关闭数据库。
2、shutdown immediate
立即方式关闭数据库。
在SVRMGRL中执行shutdown immediate,数据库并不立即关闭,
而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源),
当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。
3、shutdown abort
直接关闭数据库,正在访问数据库的会话会被突然终止,
如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间。
11.ORACLE数据库常见问题诊断方法---(常见错误篇)
1.ORA-12571、ORA-03113、ORA-03114、ORA-01041
特征:客户端(代理或应用服务器)有时报这类断连错误
原因:如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。
措施:如果偶尔出现,可在服务端的协议配置文件PROTOCOL.ORA中增加一行TCP.NODELAY=YES;
如果经常出现,则为客户端与服务端字符集不一致或网络原因。
客户端的字符集在注册表里定义:HKEY__LOCAL__MACHINE/SOFTWARE/ORACLE/NLS__LANG
在客户端注册表中的TCP参数项中设置TCPMAXDATARETRANSMITIONS=20。
2.ORA-01000
特征:达到会话允许的最大游标数
原因:达到会话允许的最大游标数
措施:有两种解决方法:
(1)在初始化文件INIT<SID>.ORA文件中增加OPEN_CURSORS的数量,一般要求大于200。
(2)在应用级,与开发工具有关,例如设置MAXOPEN_CURSORS等。
3.ORA-01545
特征:某个回滚段不可用
原因:
(1)当使回滚段ONLINE时,但回滚段不可用,例如回滚段所在表空间OFFLINE;
(2)当使回滚段ONLINE时,但回滚段已ONLINE,例如回滚段被使用两次,典型的案例如OPS方式时,回滚段不能公有;
(3)删除回滚段时,回滚段中有活动的事务;措施:
(1)确保回滚段可
(2)从初始化文件INIT<SID>.ORA的参数ROLLBACK)SEGMENTS中删除指定的回滚段。
(3)可以将回滚段所在表空间删除,取消UNDO事务
4.ORA-0165x
特征:表空间没有足够的空间供分配
原因:表空间已满;存储参数不合理,NEXT太小;没有连续的区间
措施:如果表空间已满,则需为表空间增加文件;如果存储参数不合理,则需增加INITIAL和NEXT;如果没有连续的区间,需要合并空闲的表空间。
查看空间碎片用DBA_FREE_SPACE
5.ORA-01555
特征:当前会话无法读到以前版本的数据
原因:原因很多,主要原因有下列:回滚段太小、太少;回滚段冲突;交叉提交(FETCH_ACROSS)
措施:增加回滚段数量;
6.ORA-04031
特征:共享池内存区内存不够,或产生内存碎片
原因:当试图装载一个大包时或执行一个较大的存储过程时,而共享池没有连续的内存空间。
措施:如果是内存不够,则增加SHARE)POOL_SIZE;
如果是内存碎片,执行altersystemflushshare_pool
7.ORA-04091
特征:触发器工作不正常
原因:一个行触发读取或修改变化的表(正在修改、插入)时,产生这种错误。
措施:检查触发器脚本,保证引用完整性
8.ORA-01242、ORA-01113
特征:介质故障导致数据库宕机
原因:介质故障。
措施:检查硬件故障;修改dbshut脚本,将其中的STARTUP命令修改为:
Startupopenrecover
Alterdatabaseopen
SQL*PLUS命令
Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。
我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与数据库打交道。
除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。
下面就介绍一下一些常用的sql*plus命令:
1. 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
2. 对当前的输入进行编辑
SQL>edit
3. 重新运行上一次运行的sql语句
SQL>/
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name
7. COL命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- ---------
10 ACCOUNTING NEW YORK
sql>col LOC heading location
sql>select * from dept;
DEPTNO DNAME location
--------- ---------------------------- -----------
10 ACCOUNTING NEW YORK
2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上:
Sql>select * from emp
Department name Salary
---------- ---------- ----------
10 aaa 11
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
Employee
Department name Salary
---------- ---------- ----------
10 aaa 11
note: the col heading turn into two lines from one line.
3). 改变列的显示长度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
Sql> col ename format a40
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
4). 设置列标题的对齐方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边
5). 不让一个列显示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBER类型列的显示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name Salary Commission
---------- ---------- --------- ----------
30 ALLEN $1,600 300
7). 显示列值时,如果列值为NULL值,用text值代替NULL值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 设置一个列的回绕方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 显示列的当前的显示属性值
SQL> COLUMN column_name
10). 将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS
8. 屏蔽掉一个列中显示相同值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
10. 显示对BREAK的设置
SQL> BREAK
11. 删除6)、7)的设置
SQL> CLEAR BREAKS
12. Set 命令:
该命令包含许多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {\|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 设置当前session是否对修改的数据进行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
3).是否显示当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数
4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替
5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n个空行。
当set newpage none 时,会在页和页之间没有任何间隔。
7).显示时,用text值代替NULL值
SQL> SET NULL text
8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题
9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。
10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。
SQL> SET TERM[OUT] {ON|OFF}
在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。
12).将SPOOL输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}
13)显示每个sql语句花费的执行时间
set TIMING {ON|OFF}
13.修改sql buffer中的当前行中,第一个出现的字符串
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
14.编辑sql buffer中的sql语句
EDI[T]
15.显示sql buffer中的sql语句,list n显示sql buffer中的第n行,并使第n行成为当前行
L[IST] [n]
16.在sql buffer的当前行下面加一行或多行
I[NPUT]
17.将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
2 dname
3 from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1 select deptno,
2 dname,loc
3* from dept
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
18.将sql buffer中的sql语句保存到一个文件中
SAVE file_name
19.将一个文件中的sql语句导入到sql buffer中
GET file_name
20.再次执行刚才已经执行的sql语句
RUN
or
/
21.执行一个存储过程
EXECUTE procedure_name
23.在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
24.设置每个报表的顶部标题
TTITLE
25.设置每个报表的尾部标题
BTITLE
26.写一个注释
REMARK [text]
27.将指定的信息或一个空行输出到屏幕上
PROMPT [text]
28.将执行的过程暂停,等待用户响应后继续执行
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29.将一个数据库中的一些数据拷贝到另外一个数据库(如将一个表的数据拷贝到另一个数据库)
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30.不退出sql*plus,在sql*plus中执行一个操作系统命令:
HOST
Sql> host hostname
该命令在windows下可能被支持。
31.在sql*plus中,切换到操作系统命令提示符下,运行操作系统命令后,可以再次切换回sql*plus:!
sql>!
$hostname
$exit
sql>
该命令在windows下不被支持。
32.显示sql*plus命令的帮助
HELP
如何安装帮助文件:
Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql
Sql>help index
33.显示sql*plus系统变量的值或sql*plus环境变量的值
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
1) . 显示当前环境变量的值:
Show all
2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息
Show error
当创建一个函数、存储过程等出错时,变可以用该命令查看在那个地方出错及相应的出错信息,进行修改后再次进行编译。
3) . 显示初始化参数的值:
show PARAMETERS [parameter_name]
4) . 显示数据库的版本:
show REL[EASE]
5) . 显示SGA的大小
show SGA
6). 显示当前的用户名
show user
启动一个 SQL*Plus 交互式会话
要启动一个交互式 SQL*Plus 会话,请输入以下命令:
sqlplus system/password
其中 password 是为 RDBMS 用户系统设置的 RDBMS 密码。
sql plus 清屏命令 clear scr;