第3章CHAPTER 3 参数文件与实例 3.1参数文件〖*4/5〗3.1.1参数文件的定义和作用参数文件指定了数据库和实例的名字、内存组件的大小和构成、控制文件的位置、强制和非强制进程的相关设置等信息。Oracle数据库启动时,读取参数文件并根据参数文件中的参数设置来配置数据库。例如: maxlogfiles=45 background_dump_dest=c:/dump其中,等号左边是参数名,右边是对应的参数值,值的类型有多种,典型的如数字和字符串。参数文件就是存储这些参数的地方。 3.1.2参数文件分类 在9i之前参数文件只有一种,它是文本格式的,称为pfile,在9i及以后的版本中新增了服务器参数文件,称为spfile,它是二进制格式的。这两种参数文件都是用来存储参数配置以供Oracle读取的。对二者的说明如下: (1) pfile是文本文件,spfile是二进制文件。 (2) 可直接使用任何文本编辑器打开pfile对其中的参数进行配置,而spfile文件中的参数则必须在数据库启动后,通过SQL命令进行在线修改。无法通过SQL命令对pfile进行修改。 (3) pfile是静态参数文件,修改后不会马上生效,数据库必须重启,重新读取该文件。spfile是动态参数文件,spfile的配置生效时限和作用域可由修改参数的SQL命令指定,可立即生效,也可不立即生效。 (4) pfile和spfile可以用命令create pfile from spfile或create spfile from pfile来互相创建。 (5) 启动次序spfile优先于pfile。 (6) 如果是手动创建数据库而不是通过DBCA(Database Configuration Assistant)来创建,则开始创建数据库时只能定义pfile。(7) Oracle数据库只使用一个参数文件,有两种方法可判断数据库当前使用的是哪个参数文件。 方法一: 通过create pfile鉴别。如果当前使用的是pfile,则相应格式的create pfile会产生错误。 方法二: 使用show parameter spfile命令来显示spfile的位置。如果显示的值为空,则表示数据库当前使用的是pfile。 3.1.3参数文件的读取1. 数据库启动时,参数文件的读取顺序首先在$ORACLE_HOME/dbs目录下查找spfile(sid).ora文件,即spfile文件。若该文件存在,则利用该文件启动数据库。若该文件不存在,则继续在该目录下查找init(sid).ora文件,即pfile文件。若pfile文件存在,则利用该文件启动数据库;若不存在,则Oracle报错,无法启动。 2. 实例启动时,参数文件的读取顺序 (1) 数据库的startup命令可以指定启动哪一个pfile。需要注意的是,只能指定pfile,不能指定spfile。 (2) 当startup命令未指定任何参数文件时,Oracle将从平台指定的默认位置上的服务器参数文件(spfile)中读取初始化参数。Oracle查找spfile或init.ora的顺序是: 首先查找名为spfile$ORACLE_SID.ora的文件;若未找到,则查找spfile.ora文件;若还未找到,则查找init$ORACLE_SID.ora文件。 3.2实例 实例(Instance)是数据库启动时初始化的一组进程和内存结构,一个单独的数据库可以被多个实例访问。在操作系统中,用ORACLE_SID来标识实例。在Oracle中,用参数INSTANCE_NAME来标识实例。二者值相同。 Oracle实例分为以下两部分: (1) 内存结构。数据库启动时,系统首先在服务器内存中分配系统全局区(System Global Area,SGA),构成Oracle实例的内存结构。 (2) 后台进程。启动若干个常驻内存的操作系统进程,构成Oracle实例的进程结构。 3.2.1内存结构 内存结构分为两部分: 系统全局区和程序全局区(Program Global Area,PGA)。 1. 系统全局区 Oracle将计算机内分配出来的一块内存区域称为系统全局区。该区域用于存储数据库信息,包括数据库实例的数据、Oracle运行时必备的控制信息等。数据库实例启动时自动分配SGA,数据库实例关闭时回收SGA内存。SGA是占用内存最大的一个区域,是影响数据库性能的重要因素。SGA由所有服务进程和后台进程所共享。  SGA由几个部分组成,其中最重要的有以下几个: 1) 数据库缓存区(Database Buffer Cache) 数据库缓存区用来存放数据信息,它以数据块为单位进行读写。数据库缓存区的大小由DB_BLOCK_BUFFERS参数指定。调整和管理数据库时,调整数据库缓存区的大小是一个重要部分。Oracle使用最近最少使用算法(Least Recently Used,LRU)来管理可用空间。 数据库缓冲区包括三个类型的区域: (1) 脏数据区(Dirty Buffers): 存放已被修改过并需要写回数据文件的数据块。 (2) 自由区(Free Buffers): 未存放任何数据的空闲区域。 (3) 保留区(Pinned Buffers): 存放正在处理的数据或者已明确保留为将来使用的数据区域。 2) 重做日志缓冲区(Redo Log Buffer) 对数据库所执行的任何操作,如对数据进行的修改、数据库管理员对数据库结构进行的修改等,都会被记录在重做日志文件中。当错误发生时,利用重做日志文件可以恢复数据库。例如,当数据被意外删除或修改时,可利用重做日志文件恢复原有数据。当出现实例失败或者介质失败时,也可利用日志文件实现实例恢复或者介质恢复。因此,管理好重做日志文件对于保障数据库数据安全非常重要。为重做日志文件专门设立的缓冲区称作重做日志缓冲区。重做日志缓冲区的大小由初始化参数LOG_BUFFER指定。重做日志缓冲区由很多条重做记录(Redo Record)组成,每条重做记录记载了被修改数据块的位置以及修改后的数据。 3) 共享池(Shared Pool) 共享池用来缓存各种程序数据,例如解析后的SQL、PL/SQL代码、系统参数以及数据字典等信息。数据中执行的任何操作几乎都会涉及共享池。例如,如果用户执行SQL语句,Oracle数据库就会访问共享池。 共享池主要包括库缓存(Library Cache)、数据字典缓存(Data Dictionary Cache)、服务器结果缓存(Server Result Cache)、保留池(Reserved Pool)等几个组成部分。 (1) 库缓存。 库缓存是一个共享的内存区域,其中存储着可执行的,即已经解析过的SQL和PL/SQL代码。Oracle引入库缓存的目的是共享SQL和PL/SQL代码。服务器进程执行SQL和PL/SQL时,首先会进入库缓存,查找是否已经存在相同的语句。如果存在,就不再进行后续的编译处理,直接使用库缓存中已经编译好的语句。如果不存在,则再对所要执行的语句进行解析。SQL共享池通过最近最少使用算法来管理。 (2) 数据字典缓存。 数据字典缓存用于存储经常使用的数据字典信息,例如表的定义、用户名、口令、权限、数据库的结构等。Oracle在解析SQL语句时会经常访问该缓存,以确定操作对象是否存在,是否具有权限等。如果操纵对象不在数据字典缓存中,则服务器进程就从保存数据字典信息的数据文件中将其读入到数据字典缓存中。 (3) 服务器结果缓存区。 该区域缓存结果集合。该区域包含两个部分: SQL查询结果缓存和PL/SQL函数结果缓存。数据库可以将SQL查询结果缓存中的查询结果存储起来,将来有相同查询操作时则可直接调用结果,避免重新从磁盘读数据块、重新计算结果等一系列操作,从而提高查询效率。例如,某个应用重复执行相同的SELECT语句,如果将第一条SELECT语句的执行结果缓存起来,那么之后的SELECT操作,数据库就可以立即返回其结果。 (4) 保留池。 通常情况下,如果请求的内存空间较大,Oracle会将该请求分割成多个小的请求。但是在某些系统上,仍然会出现请求大片且连续的内存空间。如果在共享池中没有足够的空闲空间,Oracle会寻找并释放足够的共享池内存空间来满足这个请求,但这可能会带来较为严重的性能下降。因此,Oracle在共享池中保留了一块小的内存空间,以供共享池在没有足够空间时使用,这就是保留池。保留池使用大且连续的内存空间,更加高效。简言之,保留池就是划分出一部分空闲内存空间,以备不时之需。Oracle默认配置了比较小的保留池。 4) 大池(Large Pool) 大池是一个可选内存区。大池的一个主要用途是供共享的服务器进程使用,缓解对共享池和PGA区内存的使用压力。在缺少大池的情况下,这些进程将使用共享池中的内存,可能导致对共享池的性能下降。 5) Java池(Java Pool) Java池用于在数据库中支持Java代码运行。例如,使用Java编写一个存储过程,这时Oracle的JVM(Java Virtual Machine)就会使用Java池来处理用户会话中的Java存储过程。Java池的大小由参数JAVA_POOL_SIZE来设定。 6) 流池(Streams Pool) 流池主要用于对流的支持。流池是一个可选、可变内存区,它的大小可通过参数STREAMS_POOL_SIZE来指定。如果没有被指定,则初始值为0。池的大小会随着Oracle流的需求动态增长。 2. 程序全局区 程序全局区(PGA)是存放进程的数据和控制信息的一块内存区域,该内存区在进程启动时创建。每个Oracle进程拥有一个PGA,一个PGA也只能被拥有它的那个进程所访问。PGA由两组区域组成: 固定PGA和可变PGA。固定 PGA区域大小一旦确定就固定不变。该区域包含变量、数据结构和指向可变 PGA区域的指针。可变PGA区域实质上是一个内存堆,该区域也称为PGA堆。PGA堆是PGA区中占比最大的区域,它由以下三部分组成: (1) 私有SQL区。包含绑定信息、运行时的内存结构信息等。每个发出SQL语句的会话都对应一个私有SQL区。 (2) SQL工作区。用于排序、多表哈希连接、位图合并及位图创建等操作。 (3) 会话区。存放会话中的变量以及其他与会话相关的信息。 3.2.2后台进程 数据库的物理结构与内存结构之间的交互通过后台进程来完成。Oracle实例启动的过程就是按内存文件中参数的值加载内存,并启动相应的后台进程进行相关服务的过程。几个重要的后台进程如下: 1. 数据写进程 数据写进程(Data Base Writer,DBWR)的功能是将缓冲区中的“脏数据”写入磁盘数据文件。这里的“脏数据”指的是缓冲区中被修改过的数据。为提高效率,并不是数据库缓冲区中的数据一发生变化,DBWR进程就立即写数据文件,而是积累足够多的数据后再批量地将缓冲区数据写入数据文件。下列事件之一发生时会触发该进程,执行写操作: (1) 缓冲区“脏数据”量超过所设定的阈值。 (2) 设定的写时间间隔已到。 (3) 当有进程请求数据库缓冲区,却找不到空闲缓冲区时。 (4) 当检查点发生时。 (5) 当某个表被删除(Drop)或被截断(Truncate)时。 (6) 当某个表空间被设置为只读状态时。 (7) 当对某个表空间进行联机备份时。 (8) 当某个临时表空间被设置为脱机状态(Offline)或正常状态(Normal)时等。 2. 日志写进程 日志写进程(Log Writer,LGWR)把日志缓冲区中的数据写到磁盘的归档日志文件中,从而完成数据库对象创建、更新数据等操作过程的记录。启动实例时该进程自动启动。下列事件之一发生时会触发LGWR进程,执行写操作: (1) 用户进程提交一个事务。 (2) 日志缓冲区数据量超过所设定的阈值。 (3) 请求LGWR切换日志文件。 (4) 设定的写时间间隔已到。 3. 检查点进程 由于Oracle中LGWR进程和DBWR进程工作的不一致,Oracle引入了检查点进程(Check Point, CKPT),用于同步数据库,保证数据库的一致性。 4. 归档进程 当一个联机重做日志文件填满后,Oracle实例开始写入下一个联机重做日志文件。从一个联机重做日志文件切换到另一个联机重做日志文件的过程称为日志切换。归档进程(Archive,ARCH)的功能就是在每次进行日志切换时对已填满的日志组进行备份或归档。 5. 进程监控器进程 进程监控器进程(Process Monitor, PMON)的功能是在用户进程出现故障时执行进程恢复、清理内存、释放故障进程所占用资源等操作。PMON进程还周期地检查调度进程和服务器进程的状态,如果发现这些进程已停止,PMON进程会重启它们。PMON进程会被定时唤醒,或被其他进程主动唤醒。 6. 系统监控器进程 系统监控器进程(System Monitor,SMON)的功能是在实例启动时执行实例恢复,清理不再使用的临时段。SMON进程会被定时唤醒,或者被其他进程主动唤醒。第4章CHAPTER 4 SQLPlus命令 4.1环境设置命令 SQLPlus的环境特征参数一般由系统自动设置,用户可以根据需要将环境参数设置成需要的值,set命令和show命令主要就是完成这项功能的。set命令将SQLPlus的环境特征参数设置为开关状态或者某个确定的值。show命令将显示这些参数的值。 4.1.1set命令 使用set命令可以改变SQLPlus环境特征参数的值。其命令格式如下: set<选项><值或开关状态>其中选项是指环境参数的名称,<值或开关状态>指该参数被设置成on还是off,或是某个具体的值。 例41设置自动提交状态。SQL>set autocommit on下面给出几个常用的环境参数设置(其中有下画线者为系统的默认值)。 (1) set autocommit{off|on|immediate} off关闭自动提交功能。 on或imm打开自动提交功能。 (2) set echo{off|on} on SQLPlus执行命令文件时,命令本身将显示在屏幕上。 off执行命令文件时,命令本身不显示在屏幕上。 (3) set feedback{off|on} on查询结束时,给出查询结果的记录数信息。 off查询结束时,没有查询结果的记录数信息。 (4) set heading {off|on} on各列的标题(包括文字和下画线)在结果报表上显示。 off各列的标题不在报表上显示。(5) set linesize{80|n} 该项设置SQLPlus的行宽,即一行所能显示的最大字符数。当用SQLPlus命令制图报表标题为居中或右对齐时,系统在计算标题的合适位置时也要用到这个参数。该参数的默认值为80个字符,最大值为999。 (6) set pagesize{14|n} 该参数设置每页输出的行数,包括ttitle(头标题)、btitle(底标题)、column(列标题)和空行。该项默认值是每页14行。 (7) set pause{off|on|text} on在显示输出每一页后,等待用户按Return键继续显示。 off表示每页显示之间不停顿。 text在显示每一页后停顿,等待用户按Return键,并在屏幕下方显示text的提示信息。 (8) set buffer {buffer} 设置{buffer}为当前的命令缓冲区。通常情况下,SQL缓冲区为当前命令缓冲区。 例42建立名为A的缓冲区。SQL>set buffer A由于SQL缓冲区只能存放一条SQL命令,所以可用set buffer命令设置其他命令缓冲区来存放多条SQL命令和SQLPlus命令。 可以使用SQLPlus的行编辑——list、del、append、change等命令对该缓冲区中的所有行进行操作,也可以用save命令将该缓冲区中的内容保存到一个文件中,并可以用get命令将文件中的内容取回到缓冲区。但该命令缓冲区不能直接执行SQL或SQLPlus命令,而是通过将其中的内容保存到文件中,再使用start命令完成。 不论是来自命令行还是命令文件,只要执行一个SQL命令,命令缓冲区就被自动置回为SQL缓冲区。但其他缓冲区中的内容依然存在,可以再次使用set buffer命令进入所需要的缓冲区。 set命令对环境特征参数的改变只在本次会话期间内有效,即一旦退出SQLPlus,再进入时,用户所设置的参数值全部恢复成系统的默认值。 4.1.2show命令 show命令可以显示SQLPlus的一个或全部特征参数的值。其命令格式如下: show{all|选项}例43显示SQLPlus全部环境参数的值。SQL>show all例44显示自动提交状态的设置情况。SQL>show autocommit例45显示当前的用户标识,即当前的用户名。SQL>show user例46显示当前报表使用的头标题的内容。SQL>show ttitle 4.2用SQLPlus生成报表 SQLPlus通常被认为是一种交互式的报表生成器,它使用SQL命令从Oracle数据库中获取信息。使用SQLPlus设置就能产生精练的、有良好格式的报表,使用户很容易地对题目、列标题、部分及总和进行控制,对数字和文字重新编排格式。 例47使用下面的命令生成一张简单报表。 SQL>column deptno heading department/将deptno字段标题设为department/ SQL>column ename heading name /将ename字段标题设为name/ SQL>column sal heading salary /将sal字段标题设为salary/ SQL>column sal format $99,999.00 /设置sal字段格式/ SQL>ttitle 'sample report for hitech corp' /设置头标题/ SQL>btitle 'strictly confidential' /设置底标题/ SQL>break on deptno /将报表中的数据分组显示并设置组间间隔/ SQL>compute sum of sal on deptno /计算分组数据的汇总值/ SQL>select deptno,ename,sal /从emp表中选择sal>2000的deptno、 from emp ename、sal列,并以deptno列排序/ where sal>100 order by deptno;生成的报表如图41所示。  图41生成的报表示意图 应注意一点,SQLPlus格式命令的效果只有通过运行SQL命令才能看到。与制作报表有关的SQLPlus命令如表41所示。表41与报表相关的SQLPlus命令 命令  定义ttitle  为报表的每一页设置头标题btitle  为报表的每一页设置底标题column  设置列的标题和格式break  将报表中的数据分组显示并设置组间间隔compute  计算分组数据的汇总值set linesize  设置报表每行允许的最大字符数set pagesize  设置每页的最大行数set newpage  设置页与页之间的空行数set headsep  设置标题分隔符4.2.1设置标题: ttitle和btitle 从例47中能够看出,可以为报表的每一页设置头标题和底标题(也就是表头和表尾),它们是通过ttitle和btitle命令实现的。命令格式如下: ttitle\[位置说明<表头>\]\[off|on\] btitle\[位置说明<表尾>\]\[off|on\]关于标题的位置说明,可以使用表42所示的子句。表42标题位置说明子句 子句  举例  说明col ncol 72让标题信息从当前行左边的第n个位置开始显示skip nskip 2打印n个空行,如果n未指明,打印一个空行;如果n为0,则不打印空行;如果n大于1,则为两行文字间加入n-1个空行leftleft标题信息靠左放置centercenter标题信息居中放置rightright标题信息靠右放置例48设置头标题、底标题并居中放置。SQL>ttitle center 'sales department personnel report' SQL>btitle center 'company confidential' SQL>select deptno,ename,sal from emp where deptno=2;生成的报表如图4.2所示。 例49如果想将表42的标题变换成更清楚的形式,可以增加一些子句,并使用set linesize设置。SQL>ttitle center 'report' skip 1- >center ====================skip 1 left 'personnel report'- >right 'sales department' skip 2 SQL>set linesize 60 SQL>/报表显示如图43所示。 图42设置头标题、底标题并居中放置 图43变换标题形式显示的结果图 关键字left、right和center确定了其后紧跟的内容在页上显示位置;skip表示在打印完该行后将打印多少空行;行未尾的破折号“—”表明标题命令未完,紧接下一行内容,在单引号内的正文将被如实打印。这个例子中最后一行数据与表尾之间没有定义空行,若需要在它们之间加入空行,可以使用skip n子句,如: SQL>btitle skip 1 center 'company confidential'如果标题文本超过500个字符,可以使用SQLPlus的define命令,将各行的文本内容保存在不同的变量中。例如: SQL> depin line1= 'this is the first line…' SQL> depin line2= 'this is the second line…' SQL> depin line3= 'this is the third line…'在ttitle和btitle中可以使用上面定义的变量。SQL>ttitle center line1 skip 1 center line2 skip 1 center line3图44显示当前页码 另外,还可以控制页号的显示位置和格式。SQL.PNO是一个用来存储页号的变量,通过该变量可以对页号进行控制。 例410在每页顶部显示当前页码,结果如图44所示。SQL>ttitle left 'sales department'right 'page:'format 999 sql.pno skip2 SQL>/如果不定义页号显示格式,SQL.PNO的宽度为9位。 4.2.2设置报表尺寸 每页报表中都包含表头、列标题、查询的结果和表尾信息。报表尺寸的设置对于这些内容的正确显示十分必要。系统默认的报表尺寸如下: 每页报表表头空1行;每页输出内容为14行(包括表头和表尾之间的所有内容);每行能显示的字符数为80。可以通过set命令改变上述设置。 1. set newpage 命令 该命令设置每一页的表头与每一页开始位置之间的空行数,实际上就是页与页之间的行数。命令如下: SQL>set newpage 0如果设置行数为0,将打印头移至下一页的开始,即报表打印的起始位置。 如果将newpage设置变大,SQLPlus输出的信息行就会减小,而每页的总行数不变。 2. set pagesize命令 该命令设置每页的输出行数,包括表头、表尾、列标题和查询出的信息。对于一般的打印纸,该值通常设置为66。命令如下: SQL>set pagesize 66 set pagesize命令一般与set newpage相关连使用。 3. set linesize命令 该命令控制出现在一行上的最大字符数。命令如下: SQL>set linesize 30如果一行查询结果的总宽度超过了lineszie设置的行宽,SQLPlus将把多出的列折行输出。linesize的大小还会影响表头、日期和页码的放置位置,因为表头的居中显示和居右显示要根据linesize的值确定。 例411重新设置新的报表尺寸。SQL>set pagesize 66 SQL>set newpage 0 SQL>set linesize 32若要恢复系统默认设置,则执行下列命令: SQL>set pagesize 14 SQL>set newpage 1 SQL>set linesize 804.2.3设置列column 使用SQLPlus的column命令可以改变列标题及各列数据的显示格式。 1. 设置列标题 SQLPlus使用列名和列表达式名作为列标题的默认形式,如果需要改变列标题,可以使用column的heading子句:column列名heading列标题例412将查询emp表的结果生成报表,并为各列定义明确的标题。SQL>column deptno heading department SQL>column ename heading employee SQL>column sal heading salary SQL>select deptno,ename,sal from emp where job= 'salesman';查询结果显示如图45所示。 设置的这些列标题一直有效,直到它们被重新设置或用户退出SQLPlus。还可以使用set underline命令为列标题设置不同形式的下画线,例如: SQL>set underline= SQL>/结果如图46所示。 图45改变列标题的emp表 图46列标题设置成不同形式的下画线显示结果 要恢复原来的下画线,使用下列命令: SQL>set underline '-'2. 设置列的格式 所有的数据类型都有默认的显示格式,如果需要使用指定的格式显示数据,可以使用column命令。命令格式如下: SQL>column列名format 格式数值型数据使用9作为位数描述符,并可以加入逗号、$、尖括号、<、>、/或前导0等字符。 图47设置数值型格式 例413显示工资值sal,加入$和逗号并使用0表示个位。SQL>column sal format $99,990 SQL>/结果如图47所示。 字符型数据的默认显示宽度为该字符数据定义的宽度,如果字符列的标题宽度超过字符数据宽度,则显示的宽度以列标题为准。 long型显示的宽度由set long命令设置,其默认设置宽度为每行80个字符。date型一般默认显示格式为ddmonyy,宽度为9个字符。如果date型数据没有使用tochar函数进行转换,则该数据默认的格式由参数文件中的初始化参数确定。char、varchar2(varchar)、long以及date型数据使用column语句,以字母A作为格式描述符来改变数据的显式格式,而且这些数据以左对齐方式显示。如果定义的数据显示格式宽度比列标题短,列标题将会被截断。 3. 显示和重置列的显示属性 若想显示某一列的显示属性,可以使用命令:SQL>column 列名若想显示所有列的显示属性,则使用命令:SQL>column如果想将某列的显示属性重置成默认形式,可以使用column命令的clear子句: SQL>column 列名clear若希望将所有列的显示属性重新置成默认的形式,则使用下列命令: SQL>clear columns显示结果为columns cleared。 另外,还可以使用column的off、on子句对列的显示属性进行抑制或恢复。使用off子句命令如下:SQL>column 列名 off表示SQLPlus将以默认格式作为列的显示属性,但并不取消列属性,使用on子句则重新恢复列的显示属性,命令如下: SQL>column 列名 on