Oracle运行机制
***************************************************************
Oracle运行机制
***************************************************************
我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,
首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名 使用的是机器名(非IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然
后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求,
下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲:
专用服务器模式下:
一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器进程,
并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继承了监听进程的信息,
然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开始给它发信息了,用户进程给这个新建的服
务器进程发一个CONNECT包,服务器进程再以ACCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接。
我们把这种连接叫做HAND-OFF连接,也叫转换连接。
另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP
端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这
个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式
向服务器进程发送信息了。这种方式我们叫做重定向连接。
HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE>HOMEX中设置USE_SHARED_SOCKET。
共享服务器模式下:只有重定向连接的方式,工作方式是监听进程接收到用户进程的请求后产生一个新的
调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程
再将此信息传给用户进程,用户进程使用这个端口给调度进程发送一个CONNECT包,调度进程再给用户进程发送一个
ACCEPT包,致此,用户进程可以正式向调度进程发送信息了。可以通过设置MAX_DISPIATCHERS这个参数来确定调度进
程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调
度进程,而是让其中一个调度进程选用一个TCP/IP端口来与此用户进程交互。调度进程每接收一个用户进程请求都会
在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请
求将分别在有限的调度进
程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服
务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一
个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进
程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个
调度进程从各自的响应队列中将结果取出再返回给用户进程。
以上我们讲完了用户与ORACLE的连接方式,下面我们要讲ORACLE服务器进程如可处理用户进程的请求,
当一个用户进程发出了一条SQL语名:UPDATE TABBLEA SET SALARY=SALARY*2;首先,服务器进程把这条语
句的字符转换成ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个HASH值,服务器进程将
到SHARED POOL 的共享PL/SQL区去查找是否存在同样的HASH值,如果存在,服务器进程将使用这条语句已高速缓存
在SHARED POOL中的已分析过的版本来执行,如果不存在,服务器进程将对该语句进行语法分析,首先检查该语句
的语法的正确性,接着对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及
相关结构,并根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来
生成一个执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,
最后生成一个编译代码。ORACLE将这条语名的本身实际文本、HASH值、编译代码、与此语名相关联的任何统
计数据和该语句的执行计划缓存在SHARED POOL的共享PL/SQL区。服务器进程通过SHARED POOL 锁存器来申请可以
向哪些共享PL/SQL区中缓存这此内容,也就是说被SHARED POOL锁存器锁定的PL/SQL区中的块不可被覆盖,因为
这些块可能被其它进程所使用。在SQL分析阶段将用到LIBRARY CACHE,从数据字典中核对表、视图等结构的时候,
需要将数据字典从磁盘读入LIBRARY CACHE,因此,在读入之前也要使用LIBRARY CACHE锁存器来申请用于缓存数据字典。
生成编译代码之后,接着下一步服务器进程要准备开始更新数据,服务器进程将到DB BUFFER中查找是否有相关对象的
缓存数据,下面分两个可能进行解释:
如果没有,服务器进程将在表头部请求一些行锁,如果成功加锁,服务器进程将从数据文件中读这些行所在的数
据块放入DB BUFFER中空闲的区域或者覆盖已被挤出LRU列表的非脏数据块缓冲区,并且排列在LRU列表的头部,如果这
些非脏数据缓冲区写完也不能满足新数据的请求时,会立即触发DBWN进程将脏数据列表中指向的缓冲块写入数据文件,
并且清洗掉这些缓冲区,来腾出空间缓冲新读入的数据,也就是在放入DB BUFFER之前也是要先申请DB BUFFER中的锁存器,
成功锁定后,再写入DB BUFFER,然后服务器程将该语句影响的被读入DB BUFFER块中的这些行的ROWID及将要更新的原值和
新值及SCN等信息逐条的写入REDO LOG BUFFER,在写入REDO LOG BUFFER之前也是先请求REDO LOG BUFFER块的锁存器,成
功锁定之后才开始写入,当写入达到REDO LOG BUFFER大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者DBWN之
前发生,LGWR将把REDO LOG BUFFER中的数据写入磁盘上的重做日志文件,已被写入重做日志文件的REDO LOG BUFFER中的块上
的锁存器被释放,并可被后来写入的信息所覆盖,REDO LOG BUFFER以循环的方式工作。当一个重做日志文件写满后,LGWR将
切换到下一个重做日志文件,如果是归档模式,归档进程还将前一个写满的重做日志进程写入归档日志文件,重做日志文件
也是循环工作方式。写完所有的REDO LOG BUFFER之后,服务器进程开始改写这个DB BUFFER块头部的事务列表并写入SCN,
然后COPY包含这个块的头部事务列表及SCN信息的数据副本放入回滚段中,我们将回滚段中的副本称为数据块的“前映像”。
(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可
在其它表空间中的数据文件中开辟。)然后改写这个DB BUFFER块的数据,并在其头部写入对应的回滚段地址,如果对
一行数据多次UPDATE而不COMMIT则在回滚段中将会有多个“前映像”,除第一个“前映像”含有SCN信息外,其它的每
个“前映像”的头部还含有SCN信息和“前前映像”的回滚段地址。一次UPDATE操作只对应一个SCN。然后服务器进程在
脏数据列表中建立一条指向此缓冲块的指针。接着服务器进程会从数据文件读入第二个块重复以上读入,记日志,建立
回滚段,修改,放入脏列表的动作,当脏数据列表达到一定长度时,DBWN进程将脏数据列表中指向的缓冲块全部写入数
据文件,也就是释放加在这些DB BUFER 块上的锁存器。其实ORACLE可以一次从数据文件中读入几个块放入DB BUFFER,
可以通过参数DB_FILE_MULTIBLOCK_READ_COUNT来设置一次读入的块的个数。
如果要查找的数据已缓存,则根据用户的SQL操作类型决定如何操作,如果是SELECT 则查看DB BUFFER块的
头部是否有事务,如果有,将从回滚段读取,如果没有则比较SELECT 的SCN与DB BUFFER块头部的SCN如果比自己大,
仍然从回滚段读取,如果比自己小则认这是一个非脏缓存,可以直接从这个DB BUFFER块中读取。如果是UPDATE则即
使在DB BUFFER中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记
录申请加锁,加锁成功则进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作。
只有当SQL语句影响的所有行所在的最后一个块被读入DB BUFFER并且重做信息被写入REDO LOG BUFFER(仅是指重
做日志缓冲,而非重做日志文件)之后,用户才可以发出COMMIT,COMMIT触发LGRW,但并不强制立即DBWN来释放所
有相应的DB BUFFER块上的锁,也就是说有可能出现已COMMIT,但在随后的一段时间内DBWN还在写这条语句涉及的数
据块的情形,表头部的行锁,并不是在COMMIT一发出就马上释放,实际上要等到相应的DBWN进程结束才会释放。一个
用户请求锁定另一个用户已COMMIT的资源不成功的机会是存在的,从COMMIT到DBWN进程结束之间的时间很短,如果恰巧在这个时间断电,由于COMMIT已触发LGWR进程,所以这些未来得及写入数据文件的改变会在实例重启后由SMON进程根据重做日志文件来前滚。
如果未COMMIT就断电,由于DBWN之前触发LGWR,所有DBWN在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。
如果用户ROOLBACK,则服务器进程会根据数据文件块和DB BUFFER中块的头部的事务列表和SCN以及回滚段地
址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多
个“前映像”,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的
最早的一个“前映像”为止。一旦发出了COMMIT,用户就不能ROOLBACK,这使得COMMIT后DBWN进程还没有全部完
成的后续动作得到了保障。
下面我们要提到检查点的作用,当一个全部检查点发生的时候,首先让LGWR进程将REDO LOG BUFFER中的所有
缓冲(包含未提交的重做信息)写入重做日志文件,然后让DBWN进程将DB BUFFER中所有已提交的缓冲写入数据文
件(不强制写未提交的)。然后更新控制文件和数据文件头部的SCN,表明当前数据库是一致的,如果在发生检
点之前断电,并且当时有一个未提交的改变正在进行,实例重启之后,SMON进程将从上一个检查点开始核对这个检
查点之后记录在重做日志文件中已提交的和未提交改变,因为DBWN之前会触发LGWR,所以DBWN对数据文件的修改一
定会被先记录在重做日志文件中。因此,断电前被DBWN写进数据文件的改变将通过重做日志文件中的记录进行还原,
叫做回滚,如果断电时有一个已提交,但DBWN动作还没有完全完成的改变存在,因为已经提交,提交会触发LGWR进程,
所以不管DBWN动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中了,则实例重
启后,SMON进程根据重做日志文件进行前滚。由此可见,实例失败后用于恢复的时间由两个检查点之间的间隔大小
来决定,我们可以通个四个参数设置检查点执行的频率,LOG_CHECKPOINT_IMTERVAL决定了两个检查点之间写入重做
日志文件的系统物理块的大小,LOG_CHECKPOINT_TIMEOUT决定了两个检查点之间的时间长度,FAST_START_IO_TARGET
决定了用于恢复时需要处理的块的大小,FAST_START_MTTR_TARGET直接决定了用于恢复的时间的长短。SMON进程执行
的前滚和回滚与用户的回滚是不同的,SMON是根据重做日志文件进行前滚或回滚,而用户的回滚一定是根据回滚段的
内容进行回滚的。在这里我们要说一下回滚段存储的数据,假如是delete操作,则回滚段将会记录整个行的数据,假
如是update,则回滚段只记录被修改了的字段的变化前的数据(前映像),也就是没有被修改的字段是不会被记录的,
假如是insert,则回滚段只记录插入记录的rowid。这样假如事务提交,那回滚段中简单标记该事务已经提交;假如
是回退,则如果操作是是delete,回退的时候把回滚段中数据重新写回数据块,操作如果是update,则把变化前数据
修改回去,操作如果是insert,则根据记录的rowid 把该记录删除。
下面我们要讲DBWN如何来写数据文件,在写数据文件前首先要找到可写的空闲数据块,ORACLE中空闲数据块可以
通过FREELIST或BITMAP来维护,它们位于一个段的头部用来标识当前段中哪些数据块可以进行INSERT。在本地管理表
空间中ORACLE自动管理分配给段的区的大小,区的分配信息存储在组成表空间的数据文件的头部,而数据字典管理的
表空间用户可以在创建时决定区的大小,并且区的分配信息是存储在数据字典中的,只在本地管理的表空间中才能选
用段自动管理,采用自动段空间管理的本地管理表空间中的段中的空闲数据块的信息就存放在段的头部并且使用位图
来管理,采用手动管理的本地管理表空间中的段和数据字典管理的表空间中的段中的空闲数据块的管理都使用位于段
头部的空闲列表来管理,空闲列表的工作方式:首先一个空的数据块被加入空闲列表,当其中空闲空间小于PCTFREE设
置的值之后,这个块从空闲列表删除,当这个块中的内容降至PCTUSED设置的值之下后,这个数据块被再次加入空闲列
表,位于空闲列表中的数据块都是可以向其中INSERT的块,当一个块移出了空闲列表,但只要其中还有保留空间就可
以进行UPDATE,当对其中一行UPDATE一个大数据时,如果当前块不能完全放下整个行,只会把整个行迁移到一个新的数
据块,并在原块位置留下一个指向新块的指针,这叫行迁移。如果一个数据块可以INSERT,当插入一个当前块装不下的
行时,这个行会溢出到两个或两个几上的块中,这叫行链接。如果用户的动作是INSERT 则服务器进程会先锁定FREELIST,
然后找到空闲块的地址,再释放FREELIST,当多个服务器进程同时想要锁定FREELIST时即发生FREELIST的争用,可以在
非采用自动段空间管理的表空间中创建表时指定FREELIST的个数,默认为1,如果是在采用自动段空间管理的表空间中创
建表,即使指定了FREELIST也会被忽略,因为此时将使用BITMAP而不是FREELIST来管理段中的空闲空间。如果用户动作
是UPDATE服务器进程将不会使用到FREELIST和BITMAP,因为不要去寻找一个空闲块,而使用锁的队列。
下面来讲一下ORACLE锁的机制,ORACLE分锁存器和锁两种。锁存器是用来保护对内存结构的访问,比如对DB BUFFER
中块的锁存器申请,只有在DBWN完成后,这些DB BUFFER块被解锁。然后用于其它的申请。锁存器不可以在进程间共享,
锁存器的申请要么成功要么失败,没有锁存器申请队列。主要的锁存器有SHARED POOL锁存器,LIBRARY CACHE锁存器,
CACHE BUFFERS LRU CHAIN锁存器,CACHE BUFFERS CHAINS 锁存器,REDO ALLOCATION 锁存器,REDO COPY 锁存器。
ORACLE的锁是用来保护数据访问的,锁的限制比锁存器要更宽松,比如,多个用户在修改同一表的不同行时,可以共享
一个表上的一个锁,锁的申请可以按照被申请的顺序来排队等候,然后依次应用,这种排队机制叫做队列(ENPUEUE),
如果两个服务器进程试图对同一表的同一行进行加锁,则都进入锁的申请队列,先进的加锁成功,后面的进程要等待,
直到前一个进程解锁才可以加锁,这叫做锁的争用,而且一旦加锁成功,这个锁将一直保持到用户发出COMMIT或ROOLBACK
命令为止。如果两个用户锁定各自的一行并请求对方锁定的行的时候将发生无限期等待即死锁,死锁的发生都是由于锁
的争用而不是锁存器的争用引起的,ORACLE在遇到死锁时,自动释放其中一个用户的锁并回滚此用户的改变。正常情况下
发生锁的争用时,数据的最终保存结果由SCN来决定哪个进程的更改被最终保存。两个用户的服务器进程在申请同一表的多
个行的锁的时候是可以交错进入锁的申请队列的。只有其中发生争用才会进行等待。创建表时指定的MAXTRANS参数决了,
表中的一个数据块最多可以被几个事务同时锁定。
下面是几个关于回滚段和死锁的事例:
有表:Test (id number(10)) 有记录1000000条
一,大SELECT,小UPDATE
A会话----Select * from test;----设scn=101----执行时间09:10:11
B会话-----Update test set id=9999999 where id=1000000----设scn=102-----执行时间09:10:12
我们会发现B会话会在A会话前完成,A会话中显示的ID=100000是从回滚段中读取
的,因为A会话在读到ID=1000000
所在的BLOCK时发现BLOCK上有事务信息,因此要从回滚段中读,如果UPDATE在SELECT读到此BLOCK之前已经COMMIT,则
SELECT 读到此BLOCK时发现其BLOCK上没有事务信息,但是会发现其BLICK的SCN比SELECT自己的SCN大,因此也会从回
滚段中读取。因此是否从回滚段读一是看是否有事务信息二是比较SCN大小。如果B会话在A会话结束前连续多次对同一
条记录UPDATE并COMMIT,那么在回滚段中将记录多个“前映像”,而每个“前映像”中不但包括了原BLOCK的数据和SCN
也记录了“前前映像”的回滚段地址,因此A会话在查询到被UPDATE过的BLOCK时,会根据BLOCK记录的回滚段的地址,找
到回滚段中的“前映像”,发现这个“前映像”的SCN也比自己的大,因此将根据这个“前映像”中记录的“前前映像”
的回滚段地址,在回滚段中找到“前前映像”,再与这个“前前映像”比较SCN,如果比自己小就读取,如果还比自己大,
则重复以上步骤,直到找到比自己SCN小的“前„前映像”为止,如果找不到,就会报ORA-01555快照太旧这个错误。
二、大UPDATE,小SELECT
A会话----Update test set id=1;----设scn=101----执行时间09:10:11
B会话-----select * from test where id=1000000----设scn=102-----执行时间09:10:12
我们会发现B会话会在A会话前完成,B会话中显示的ID=1000000是从BLOCK中直接读取的,因为B会话在读到ID=1000000
所在的BLOCK时,A会话还没有来得及对其锁定,因此B会话既不会发现BLOCK上有事务信息,也不会发现BLOCK上的SCN比SELECT
的大,因此会从BLOCK中直接读取,如果SELECT在UPDATE锁定此BLOCK后才发出,B会话读到此BLOCK时发现其BLOCK上有事务信息,
因此会从回滚段中读取。
三、大UPDATE,小UPDATE
A会话----Update test set id=1;----设scn=101----执行时间09:10:11
B会话1-----Update test set id=999999 where id=1000000----设scn=102-----执行时间09:10:12
B会话2----- select * from test where id=2----设scn=103-----执行时间09:10:14 B会话3----- update test set id=3 where id=2----设scn=104-----执行时间09:10:15
我们会发现B会话1会完成,A会话将一直等待,因为B会话1会先于A会话锁定ID=1000000所在的BLOCK,并改写头部的
事务信息,A会话在试图锁定此BLOCK时,发现其上有事务信息,将会一直等待B会话1事务结束后再行锁定, B会话2查询
到的ID=2是从回滚段中读取的而不是从BLOCK中直接读出来的。因为A会话已将ID=2的BLOCK锁定,并写入了回滚段,从B会
话3可以证明这一点,B会话3发出后,B会话3会收到死锁的信息,死锁的原因是A会话在等待B会话对ID=1000000所在的BLOCK解
锁,现在B会话又在等待A会话对ID=2所在的BLOCK解锁,因此形成死锁,因此证明ID=2
所在的BLOCK已被A会话锁定,然后A会
话也会收到死锁的信息
***********************************************************
***********************************************************
ORACLE数据库系统的体系结构
ORACLE数据库系统为具有管理ORACLE数据库功能的计算机系统。
每一个运行的ORACLE数据库与一个ORACLE实例(INSTANCE)相联系。
一个ORACLE实例为存取和控制一数据库的软件机制。每一次在数据库服务器上启动一数据库时,
称为系统全局区(SYSTEM GLOBAL AREA)的一内存区(简称SGA)被分配,有一个或多个ORACLE
进程被启动。该SGA 和 ORACLE进程的结合称为一个ORACLE数据库实例。一个实例的SGA和进程
为管理数据库数据、为该数据库一个或多个用户服务而工作。
在ORACLE系统中,首先是实例启动,然后由实例装配(MOUNT)一数据库。
在松耦合系统中,在具有ORACLE PARALLEL SERVER 选项时,单个数据库可被多个实例装配,
即多个实例共享同一物理数据库。
1. ORACLE实例的进程结构和内存结构
1)进程结构
进程是操作系统中的一种机制,它可执行一系列的操作步。在有些操作系统中使用作业(JOB)或
任务(TASK)的术语。一个进程通常有它自己的专用存储区。ORACLE进程的体系结构设计使性能最大。
ORACLE实例有两种类型:单进程实例和多进程实例。
单进程ORACLE(又称单用户ORACLE)是一种数据库系统,一个进程执行全部ORACLE代码。
由于ORACLE部分和客户应用程序不能分别以进程执行,所以ORACLE的代码和用户的数据库应用是单个进程执行。
在单进程环境下的ORACLE 实例,仅允许一个用户可存取。例如在MS-DOS上运行ORACLE 。
多进程ORACLE实例(又称多用户ORACLE)使用多个进程来执行ORACLE的不同部分,对于每一个连接的用户都有一个进程。
在多进程系统中,进程分为两类:用户进程和ORACLE进程。当一用户运行一应用程序,如PRO*C程序或一个ORACLE工具
(如SQL*PLUS),为用户运行的应用建立一个用户进程。ORACLE进程又分为两类:服务器进程和后台进程。
服务器进程用于处理连接到该实例的用户进程的请求。当应用和ORACELE是在同一台机器上运行,而不再通过网络,
一般将用户进程和它相应的服务器进程组合成单个的进程,可降低系统开销。然而,当应用和ORACLE运行在不同的
机器上时,用户进程经过一个分离服务器进程与ORACLE通信。它可执行下列任务: l 对应用所发出的SQL语句进行语法分析和执行。
l 从磁盘(数据文件)中读入必要的数据块到SGA的共享数据库缓冲区(该块不在缓冲区时)。
l 将结果返回给应用程序处理。
系统为了使性能最好和协调多个用户,在多进程系统中使用一些附加进程,称为后台进程。在许多操作系统中,
后台进程是在实例启动时自动地建立。一个ORACLE实例可以有许多后台进程,但它们不是一直存在。后台进程的名字为:
DBWR 数据库写入程序
LGWR 日志写入程序
CKPT 检查点
SMON 系统监控
PMON 进程监控
ARCH 归档
RECO 恢复
LCKn 封锁
Dnnn 调度进程
Snnn 服务器
每个后台进程与ORACLE数据库的不同部分交互。
下面对后台进程的功能作简单介绍:
DBWR进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个ORACLE后台进程。
当缓冲区中的一缓冲区被修改,它被标志为"弄脏",DBWR的主要任务是将"弄脏"的缓冲区写入磁盘
,使缓冲区保持"干净"。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的
数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未
用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。
ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,
使I/O最小。在下列情况预示DBWR 要将弄脏的缓冲区写入磁盘:
l 当一个服务器进程将一缓冲区移入"弄脏"表,该弄脏表达到临界长度时,该服务进程将通知DBWR进行写。
该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半。
l 当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,
它停止查找并通知DBWR进行写。
l 出现超时(每次3秒),DBWR 将通知本身。
l 当出现检查点时,LGWR将通知DBWR
在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数DB-BLOCK-WRITE-BATCH所指定。
如果弄脏表中没有该参数指定块数的缓冲区,DBWR从LUR表中查找另外一个弄脏缓冲区。 如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何弄脏缓冲
区写入磁盘。每当出现超时,DBWR查找一个新的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数
DB-BLOCK-WRITE-BATCH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。
在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。DBWR将指定的缓冲区写入磁盘。
在有些平台上,一个实例可有多个DBWR。在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。
参数DB-WRITERS控制DBWR进程个数。
LGWR进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个ORACLE后台进程。
LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:
l 当用户进程提交一事务时写入一个提交记录。
l 每三秒将日志缓冲区输出。
l 当日志缓冲区的1/3已满时将日志缓冲区输出。
l 当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。
LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用, LGWR 可继续地写入该组的其它文件。
日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的
日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项
仅当在以后事务提交后才永久化。
ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入日志缓冲区,
但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,
被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,
以致在并行服务器选项配置情况下,恢复操作可以同步。
CKPT进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。
在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时, 可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。
对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显
地降低性能才使CKPT运行。CKPT进程不将块写入磁盘,该工作是由DBWR完成的。 初始化参数CHECKPOINT-PROCESS控制CKPT进程的使能或使不能。缺省时为FALSE,即为使不能。
SMON进程:该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项
的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,
或者其它进程发现需要时可以被调用。
PMON进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。
例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。 PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。
PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
RECO进程:该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。
一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解
决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。
当一数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建
立时,RECO自动地在一个时间间隔之后再次连接。
RECO后台进程仅当在允许分布式事务的系统中出现,而且DISTRIBUTED - TRANSACTIONS参数是大于0。
ARCH进程:该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为ARCHIVELOG使用方式、
并可自动地归档时ARCH进程才存在。
LCKn进程:是在具有并行服务器选件环境下使用,可多至10个进程(LCK0,LCK1......,LCK9),用于实例间的封锁。
Dnnn进程(调度进程):该进程允许用户进程共享有限的服务器进程(SERVER PROCESS)。 没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER PROCESS)。对于多线索服
务器(MULTI-THREADED SERVER)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支
持大量用户,尤其在客户_服务器环境中。
2)、ORACLE内存结构
ORACLE在内存存储下列信息:
l 执行的程序代码。
l 连接的会话信息
l 程序执行期间所需数据和共享的信息
l 存储在外存储上的缓冲信息。
ORACLE具有下列基本的内存结构:
l 软件代码区
l 系统全局区,包括数据库缓冲存储区、日志缓冲区和共享池.
l 程序全局区,包括栈区和数据区.
l 排序区
软件代码区
用于存储正在执行的或可以执行的程序代码。
软件区是只读,可安装成共享或非共享。ORACLE系统程序是可共享的,以致多个ORACLE用户可存取它,
而不需要在内存有多个副本。用户程序可以共享也可以不共享。
系统全局区
为一组由ORACLE分配的共享的内存结构,可包含一个数据库实例的数据或控制信息。如果多个用户同时
连接到同一实例时,在实例的SGA中数据可为多个用户所共享,所以又称为共享全局区。当实例起动时,
SGA的存储自动地被分配;当实例关闭时,该存储被回收。所有连接到多进程数据库实例的全部用户可自动
地被分配;当实例关闭时,该存储被回收。所有连接到多进程数据库实例的全部用户可使用其SGA中的信息,
但仅仅有几个进程可写入信息。在SGA中存储信息将内存划分成几个区:数据库缓冲存储区、日志缓冲区、
共享池、请求和响应队列、数据字典存储区和其它各种信息。
程序全局区
PGA是一个内存区,包含单个进程的数据和控制信息,所以又称为进程全局区(PROCESS GLOBAL AREA)。
排序区
排序需要内存空间,ORACLE利用该内存排序数据,这部分空间称为排序区。排序区存在于请求排序的用
户进程的内存中,该空间的大小为适就排序数据量的大小,可增长,但受初始化参数
SORT-AREA-SIZER所限制。
2. ORACLE的配置方案
所有连接到ORACLE的用户必须执行两个代码模块可存取一个ORACLE数据库实例: l 应用或ORACLE工具:一数据库用户执行一数据库应用或一个ORACLE工具,可向ORACLE数据库发出SQL语句。
l ORACLE服务器程序:负责解释和处理应用中的SQL语句。
在多进程实例中,连接用户的代码可按下列三种方案之一配置:
l 对于每一个用户,其数据库应用程序和服务器程序组合成单个用户进程
l 对于每一个用户,其数据库应用是由用户进程所运行,并有一个专用服务器进程。执行ORACLE服务器的代码。
这样的配置称为专用服务器体系结构
l 执行数据库应用的进程不同于执行ORACLE服务器代码的进程,而且每一个服务器进程(执行ORACLE服务器代码)
可服务于多个用户进程,这样的配置称为多线索服务器体系结构。
1) USER/SERVER进程相结合的结构
在这种配置下,数据库应用和ORACLE服务器程序是在同一个进程中运行,该进程称为用户进程。
这种ORACLE配置有时称为单任务ORACLE(single_task ORACLE),该配置适用于这样的操作系统,它可在同一进程中的
数据库应用和ORACLE代码之间维护一个隔离,该隔离是为数据安全性和完整性所需。其中程序接口(program interface)
是负责ORACLE服务器代码的隔离和保护,在数据库应用和ORACLE用户程序之间传送数据。
2) 使用专用服务器进程的系统结构
使用专用服务器进程的ORACLE系统在两台计算机上运行。在这种系统中,在一计算机上用户进程执行数据库应用,
而在另一台计算机上的服务器进程执行相应的ORACLE服务器代码,这两个进程是分离的。为每个用户进程建立的
不同的服务器进程称为专用服务器进程,因为该服务器进程仅对相连的用户进程起作用。这种配置又称为两任务
ORACLE。每一个连接到ORACLE的用户进程有一个相应的专用服务进程。这种系统结构允许客户应用是有工作站上
执行,通过网络与运行ORACLE的计算机通信。当客户应用和ORACLE服务器代码是在同一台计算机上执行时,这种结构也可用。
3) 多线索服务器的系统结构
多线索服务器配置允许许多用户进程共享很少服务器进程。在没有多线索服务器的配置中,每一个用户进程需要自己的
专用服务器进程。在具有多线索服务器的配置中,许多用户进程连接到调度进程,由调度进程将客户请求发送到一个共
享服务器进程。多线索服务器配置的优点是降低系统开销,增加用户个数。
该系统中需要下列类型的进程:
l 网络接收器进程,将用户进程连接到调度进程和专用服务器进程。
l 一个或多个调度进程
l 一个或多个共享服务器进程
其中网络接收器进程等待新来的连接请求,决定每一用户进程能否用共享服务器进程。如果可以使用,接收器进程将一调
度进程的地址返回给用户进程。如果用户进程请求一专用服务器,该接收器进程将建立一个专用服务器进程,将用户进
程连接到该专用服务器进程。对于数据库客户机所使用的每种网络协议至少配置一个调度进程,并启动它。
当用户作一次调用时,调度进程将请求放置在SGA的请求队列中,由可用的共享服务器进程获取。共享服务器进程为完成
每一个用户进程的请求作所有必要的数据库调用。当服务器完成请求时,将结果返回到调度进程的队列,然后由调度进程
将完成的请求返回给用户进程。
共享服务器进程:除共享服务器进程不是连接指定的用户进程外,共享服务器进程和专用服务器进程提供相同的功能,
一个共享服务器进程在多线索服务器的配置中可为任何客户请求服务。一个共享服务器进程的SGA不包含有与用户相关的
数据,其信息可为所有共享服务器进程存取,它仅包含栈空间、进程指定变量。所有与会话有关的信息是包含有SGA中。
每一个共享服务器进程可存取全部会话的数据空间,以致任何服务进程可处理任何会话的请求。对于每一个会话的数据空
间是在SGA中分配空间。
ORACLE根据请求队列的长度可动态地调整共享服务器进程。可建立的共享服务器进程将请求放到请求队列。一个用户请
求是对数据库的一次程序接口调用,为SQL语句。在SGA中请求队列对实例的全部调度进程是公用的。服务器进程为新请
求检查公用请求队列,按先进先出的原则从队列检出一个请求,然后为完成该请求对数据库作必要的调用。共享服务器
进程将响应放在调度进程的响应队列。每一个调度进程在SGA中有自己的响应队列,每个调度进程负责将完成的请求回
送给相应的用户进程。
3.ORACLE运行
1) 使用专用服务进程的ORACLE的运行
在这种配置下,ORACLE运行过程如下:
(1) 数据库服务器计算机当前正在运行ORACLE(后台进程)。
(2) 在一客户工作站运行一个数据库应用(为用户进程),如SQL*PLUS。客户应用使用SQL*NET DRIVER建立
对服务器的连接。
(3) 数据库服务器计算机当前正运行合适的SQL*NET DRIVER,该机上接收器进程检出客户数据库应用的连接请求,
并在该机上为用户进程建立专用服务器进程。
(4) 用户发出单个SQL语句。
(5) 专用服务器进程接收该语句,在此处有两种方法处理SQL语句:
l 如果在共享池一共享SQL区中包含有相同SQL语句时,该服务器进程可利用已存在的共享SQL区执行客户的SQL语句。
l 如果在共享池中没有一个SQL区包含有相同的SQL语句时,在共享池中为该语句分配一新的共享SQL区。
在每一种情况,在会话的PGA中建立一个专用SQL区,专用服务器进程检查用户对查询数据的存取权限。
(6) 如果需要,服务器进程从数据文件中检索数据块,或者可使用已存储在实例SGA中的缓冲存储区的数据块。
(7) 服务器进程执行存储在共享SQL区中的SQL语句。数据首先在SGA中修改,由DBWR进程在最有效时将它写入磁盘。
LGWR进程在在线日志文件中记录用户提交请求的事务。
(8)如果请求成功,服务器将通过网络发送一信息。如果请求不成功,将发送相应的错误信息。
(9)在整个过程中,其它的后台进程是运行的,同时注意需要干预的条件。另外,ORACLE管理其它事务,
防止不同事务之间请求同一数据的竞争。
2) 使用多线索服务器的ORACLE的运行
在这种配置下,ORACLE运行过程如下:
(1) 一数据库服务器计算机运行使用多线索服务器配置的ORACLE。
(2) 在一客户工作站运行一数据库应用(在一用户进程中)。客户应用合适的SQL*NET驱动
器试图建立到数据库服务器计算机的连接。
(3) 数据库服务器计算机当前运行合适的SQL*NET驱动器,它的网络接收器进程检出用户进程的
连接请求,并决定用户进程如何连接。如果用户是使用SQL*NET版本2,该网络接收器通知用户进程使
用一个可用的调度进程的地址重新连接。
(4) 用户发出单个SQL语句
(5) 调度进程将用户进程的请求放入请求队列,该队列位于SGA中,可为所有调度进程共享。
(6) 一个可用共享服务器检验公用调度进程请求队列,并从队列中检出下一个SQL语句。然后处理
该SQL语句,同前一(5),(6)和(7)。注意:会话的专用SQL区是建立在SGA中。
(7) 一当共享服务器进程完成SQL处理,该进程将结果放置发入该请求的调度进程的响应队列。
(8) 调度进程检查它的响应队列,并将完成的请求送回请求的用户进程。
4.数据库结构和空间管理
一个ORACLE数据库是数据的集合,被处理成一个单位。一个ORACLE数据库有一个物理
结构和一个逻辑结构。
物理数据库结构(physical database structure)是由构成数据库的操作系统文件所决定。每一个ORACLE
数据库是由三种类型的文件组成:数据文件、日志文件和控制文件。数据库的文件为数据库信息提供真正的物理存储。
逻辑数据库结构是用户所涉及的数据库结构。一个ORACLE数据库的逻辑结构由下列因素决定:
l 一个或多个表空间
l 数据库模式对象(即表、视图、索引、聚集、序列、存储过程)
逻辑存储结构如表空间(dataspace)、段(segment)和范围将支配一个数据库的物理空间如何使用。模式对象
(schema object)用它们之间的联系组成了一个数据库的关系设计。
1) 物理结构
(1) 数据文件
每一个ORACLE数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。
逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:
l 一个数据文件仅与一个数据库联系。
l 一旦建立,数据文件不能改变大小
l 一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。
数据文件中的数据在需要时可以读取并存储在ORACLE内存储区中。例如:用户要存取数据库一表的某些数据,
如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存。当修改和插入新数据时,不
必立刻写入数据文件。为了减少磁盘输出的总数,提高性能,数据存储在内存,然后由ORACLE后台进程DBWR决定如
何将其写入到相应的数据文件。
(2) 日志文件
每一个数据库有两个或多个日志文件(redo log file)的组,每一个日志文件组用于收集数据库日志。日志的主要
功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据
永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。
日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored redo log),
以致可在不同磁盘上维护两个或多个日志副本。
日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。
然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。
(3) 控制文件
每一ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型:
l 数据库名;
l 数据库数据文件和日志文件的名字和位置;
l 数据库建立日期。
为了安全起见,允许控制文件被镜象。
每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。
当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
2) 逻辑结构
数据库逻辑结构包含表空间、段、范围(extent)、数据块和模式对象。
(1) 表空间
一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间(TABLESPACE)。一个表空间可将相关的逻辑结构组合在一
起。DBA可利用表空间作下列工作:
l 控制数据库数据的磁盘分配。
l 将确定的空间份额分配给数据库用户。
l 通过使单个表空间在线或离线,控制数据的可用性。
l 执行部分数据库后备或恢复操作。
l 为提高性能,跨越设备分配数据存储。
数据库、表空间和数据文件之间的关系如下图所示:
Database
SYSTEM DATA
Tablespace Tablespace
DTATAFILE1
(2MB) DATAFILE2
(2MB) DATAFILE3 (2MB)
Driver1 Driver2
。每个数据库可逻辑划分为一个或多个表空间
。每一个表空间是由一个或多个数据文件组成,该表空间物理地存储表空间中全部逻辑结构的数据。
DBA可以建立新的表空间,可为表空间增加数据文件或可删除数据文件,设置或更改缺省的段存储位置。
每一个ORACLE数据库包含有一个名为SYSTEM的表空间,在数据库建立是自动建立。在该表空间中总包含有整个
数据库的数据字典表。最小的数据库可只需要SYSTEM表空间。该表空间必须总是在线。表和存储的PL/SQL程序单
元(过程、函数、包和触发器)的全部存储数据是存储在SYSTEM表空间中。如果这些PL/SQL对象是为数据库建的,
DBA在SYSTEM表空间中需要规划这些对象所需要的空间。
表空间利用增加数据文件扩大表空间,表空间的大小为组成该表空间的数据文件大小的和。 DBA可以使ORACLE数据库中任何表空间(除SYSTEM表空间外)在线(ONLINE)或离线(OFFLINE)。表空间通常是在线,
以致它所包含的数据对数据库用户是可用的。当表空间为离线时,其数据不可使用。在下列情况下,DBA可以使其离线。
。使部分数据不可用,而剩余的部分允许正常存取
。执行离线的表空间后备
。为了修改或维护一应用,使它和它的一组表临时不可用。
包含有正在活动的回滚段的表空间不能被离线,仅当回滚段不正在使用时,该表空间才可离线。
在数据字典中记录表空间的状态,在线还是离线。如果在数据库关闭时一表空间为离线,那么在下次数据库装配和
重新打开后,它仍然保持离线。
当出现某些错误时,一个表空间可自动地由在线改变为离线。通过使用多个表空间,将不同类型的数据分开,更方便
DBA来管理数据库。
ORACLE数据库中一表空间是由一个或多个物理数据文件组成,一个数据文件只可与一个表空间想联系。当为一表空
间建立一数据文件时,ORACLE建立该文件,分配指定的磁盘空间容量。在数据文件初时建立后,所分配的磁盘不包含
任何数据。表空间可以在线或离线。在ORACLE中还允许单独数据文件在线或离线。
(2) 段、范围和数据块
ORACLE通过段、范围和数据块逻辑数据结构可更细地控制磁盘空间的使用。
段
段(SEGMENT)包含表空间中一种指定类型的逻辑存储结构,是由一组范围组成。在ORACLE数据库中有几种类型的段:
数据段、牵引段、回滚段和临时段。
数据段:对于每一个非聚集的表有一数据段,表的所有数据存放在该段。每一聚集有一个数据段,聚集中每一个表
的数据存储在该段中。
索引段:每一个索引有一索引段,存储索引数据。
回滚段:是由DBA建立,用于临时存储要撤消的信息,这些信息用于生成读一致性数据库信息、在数据库恢复时使用、
回滚未提交的事务。
临时段:当一个SQL语句需要临时工作区时,由ORACLE建立。当语句执行完毕,临时段的范围退回给系统。
ORACLE对所有段的空间分配,以范围为单位。
范围
一个范围(EXTENT)是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。每一个段是由一个或多个范围组成。
当一段中间所有空间已完全使用时,ORACLE为该段分配一个新的范围。
为了维护的目的,在数据库的每一段含有段标题块(segment header block)说明段的特征以及该段中的范围目录。
数据块
数据块(data block)是ORACLE管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,其大小可不同于
操作系统的标准I/O块大小。
数据块的格式:
公用的变长标题
表目录
行目录
未用空间
行数据
(3) 模式和模式对象
一个模式(schema)为模式对象(scehma object)的一个集合,每一个数据库用户对应一个模式。模式对象为直接引用数据库数据的逻辑结构,模式对象包含如表、视图、索引、聚集、序列、同义词、数据库链、过程和包等结构。模式
对象是逻辑数据存储结构,每一种模式对象在磁盘上没有一个相应文件存储其信息。一个模式对象逻辑地存储在数据
库的一个表空间中,每一个对象的数据物理地包含在表空间的一个或多个数据文件中。
表
表(table)为数据库中数据存储的基本单位,其数据按行、列存储。每个表具有一表名和列的集合。每一列有一个列名、
数据类型、宽度或精度、比例。一行是对应单个记录的列信息的集合。
视图
一个视图(view)是由一个或多个表(或其他视图)中的数据的一种定制的表示,是用一个查询定义,所以可认为是一
个存储的查询(stored query)或是一个虚表(virtual table)。视图可在使用表的许多地方使用。 由于视图是由表导出的,视图和表存在许多类似,视图象表最多可定义254列。视图可以被查询,而在修改、插入或删
除时具有一定的限制,在视图上执行的全部操作真正地影响视图的基本表中的数据,受到基
本表的完整性约束和触发器
的限制。
视图与表不同,一个视图不分配任何存储空间,视图不真正地包含数据。由查询定义的视图相应于视图引用表中的数据。
视图只在数据字典中存储其定义。
引入视图有下列好处:
。通过限制对表的行预定义集合的存取,为表提供附加的安全性
。隐藏数据复杂性。
。为用户简化命令
。为基本表的数据提供另一种观点。
。可将应用隔离基本表定义的修改
。用于不用视图无法表示的查询。
。可用于保存复杂查询。
聚集
聚集(cluster)是存储表数据的可选择的方法。一个聚集是一组表,将具有同一公共列值的行存储在一起,并且它们经常
一起使用。这些公共列构成聚集码。例如:EMP表各DEPT表共享DEPTNO列,所以EMP表和DEPT表可聚集在一起,聚集码的列为
DEPTNO列,该聚集将每个部门的全部职工行各该部门的行物理地存储在同一数据块中。
索引
索引(index)是与表和聚集相关的一种选择结构。索引是为提高数据检索的性能而建立,利用它可快速地确定指定的信息。
ORACLE索引为表数据提供快速存取路径。索引适用于一范围的行查询或指定行的查询。 索引可建立在一表的一列或多列上,一旦建立,由ORACLE自动维护和使用,对用户是完全透明的。索引是逻辑地和物理地独
立于数据,它们的建立或删除对表没有影响,应用可继续处理。索引数据的检索性能几乎保持常数,而当一表上存在许多索
引时,修改、删除和插入操作的性能会下降。
索引有唯一索引各非唯一索引。唯一索引保证表中没有两行在定义索引的列上具有重复值。ORACLE在唯一码上自动地定义
唯一索引实施UNIQUE完整性约束。
组合索引是在表的某个列上所建立的一索引。组全索引可加快SELECT语句的检索速度,在其WHERE子句中可引用组合索引的
全部或主要部分 。所以在定义中给出列的次序,将经常存取的或选择最多的列放在首位。 在建立索引时,将在表空间自动地建立一索引段,索引段空间分配和保留空间的使用受下列方式控制:
索引段范围的分配常驻该索引段的存储参数控制。
其数据块中未用空间可受该段的PCTFREE参数设置所控制。
序列生成器
序列生成器(sequence generator)产生序列号。在多用户环境下该序列生成器特别有用,可生成各返回序列号
而不需要磁盘I/O或事务封锁。
序列号为ORACLE整数,最多可有38个数字。一个序列定义指出一般信息:序列的名字、上升或下降、序列号之间间距
和其它信息。对所有序列的确的定义以行存储在SYSTEM表空间中的数据字典表中,所以所有序列定义总是可用。由引用
序列号的SQL语句使用序列号,可生成一个新的序列号或使用当前序列号。一旦在用户会话中的SQL语句生成一序列号,
该序列号仅为该会话可用。序列号生成是独立于表,所以同一序列生成器可用于一个和多个表。所生成序列号可用于
生成唯一的主码。
同义词
一个同义词(synonym)为任何表、视图、快照、序列、过程、函数或包的别名,其定义存储在数据字典中。同义词因安
全性和方便原因而经常使用,可用于:
l 可屏蔽对象的名字及其持有者。
l 为分布式数据库的远程对象提供位置透明性。
l 为用户简化SQL语句。
有两种同义词:公用和专用。一个公用同义词为命名为PUBLIC特殊用户组所持有,可为数据库中每一个用户所存取。一个
专用同义词是包含在指定用户的模式中,仅为该用户和授权的用户所使用。
杂凑
杂凑(hashing)是存储表数据一种可选择的方法,用以改进数据检索的性能。要使用杂凑,就要建立杂凑聚集,将表装
入到该聚集。在骠凑聚集中的表行根据杂凑函数的结果进行物理学存储和检索。杂凑函数用于生成一个数值的分布,该数
值称为杂凑值,它是基于指定的聚集码值。
程序单元
程序单元(program unit)是指存储过程、函数和包(PACKAGE)。一个过程和函数,是由SQL语句和PL/SQL语句组合在一
起,为执行某一个任务的一个可执行单位。一个过程或函数可被建立,在数据库中存储其编译形式,可由用户或数据库应
用所执行。过程和函数差别在函数总返回单个值给调用者,而过程没有值返回给调用者。 包提供相关的过程、函数、变量和其它包结构封装起来并存贮在一起的一种方法,允许管理者和应用开发者利用该方法
组织如此的程序(routine),来提供更多的功能和提高性能。
数据库链
数据库链是一个命名的对象,说明从一数据库到另一数据库的一路径(PATH)。在分布式数据库中,对全局对象名引用时
,数据库链隐式地使用。
三、数据库和实例的启动和关闭
一个ORACLE数据库没有必要对所有用户总是可用,数据库管理员可启动数据库,以致它被打开。在数据库打开情况下,
用户可存取数据库中的信息。当数据库不使用时,DBA可关闭它,关闭后的数据库,用户不能存取其信息。
数据库的启动和关闭是非常重要的管理功能,通过以INTERNAL连接到ORACLE的能力来保护。以INTERNAL 连接到ORACLE
需要有下列先决条件:
该用户的操作系统账号具有使用INTERNAL连接的操作系统特权。
对INTERNAL数据库有一口令,该用户知道其口令。
另外:当用户以INTERNAL连接时,可连接到专用服务器,而且是安全连接。
1. 数据库启动
启动数据库并使它可用有三步操作:
l 启动一个实例;
l 装配数据库
l 打开数据库
1) 启动一个实例
启动一实例的处理包含分配一个SGA(数据库信息使用的内存共享区)和后台进程的建立。实例起动的执行先于该实例装配一
数据库。如果仅启动实例,则没有数据库与内存储结构和进程相联系。
2) 装配一数据库
装配数据库是将一数据库与已启动的实例相联。当实例安装一数据库之后,该数据库保持关闭,仅DBA可存取。
3) 打开一数据库
打开一数据库是使数据库可以进行正常数据库操作的处理。当一数据库打开所有用户可连接到该数据库用存取其信息。在
数据库打开时,在线数据文件和在线日志文件也被打开。如果一表空间在上一次数据库关闭时为离线,在数据库再次打开时,
该表空间与它所相联的数据文件还是离线的。
2. 数据库和实例的关闭
关闭一实例以及它所连接的数据库也有三步操作:
1) 关闭数据库
数据库停止的第一步是关闭数据库。当数据库关闭后,所有在SGA中的数据库数据和恢复数据相应地写入到数据文件和
日志文件。在这操作之后,所有联机数据文件和联机的日志文件也被关闭,任何离线表空间中数据文件夹是已关闭的。
在数据库关闭后但还安装时,控制文件仍保持打开。
2) 卸下数据库
停止数据库的第二步是从实例卸下数据库。在数据库卸下后,在计算机内存中仅保留实例。在数据库卸下后,数据
库的控制文件也被关闭。
3) 停止实例
停止数据库的最后一步是停止实例。当实例停止后,SAG是从内存中撤消,后台进程被中止。
3. 初始化参数文件
在启动一个实例时,ORACLE必须读入一初始化参数文件(initialization parameter file),该参数文件是一个文本文件,
包含有实例配置参数。这些参数置成特殊值,用于初始ORACLE实例的许多内存和进程设置,该参数文件包含:
l 一个实例所启动的数据库名字
l 在SGA中存储结构使用多少内存;
l 在填满在线日志文件后作什么;
l 数据库控制文件的名字和位置;
l 在数据库中专用回滚段的名字。
四、数据字典的使用
数据字典是ORACLE数据库的最重要的部分之一,是由一组只读的表及其视图所组成。它提供有关该数据库的信息,
可提供的信息如下:
l ORACLE用户的名字;
l 每一个用户所授的特权和角色;
l 模式对象的名字(表、视图、快照、索引、聚集、同义词、序列、过程、函数、包及触发器等);
l 关于完整性约束的信息;
l 列的缺省值;
l 有关数据库中对象的空间分布及当前使用情况;
l 审计信息(如谁存取或修改各种对象);
l 其它一般的数据库信息。
可用SQL存取数据字典,由于数据字典为只读,允许查询。
1. 数据字典的结构
数据库数据字典是由基本表和用户可存取的视图组成。
基本表:数据字典的基础是一组基本表组成,存储相关的数据库的信息。这些信息仅由ORACLE读和写,它们很少
被ORACLE用户直接存取。
用户可存取视图:数据字典包含用户可存取视图,可概括地方便地显示数据字典的基本表的信息。视图将基本
表中信息解码成可用信息。
2. 数据字典的使用
当数据库打开时,数据字典总是可用,它驻留在SYSTEM表空间中。数据字典包含视图集,在许多情况下,每一视图
集有三种视图包含有类似信息,彼此以 前缀 相区别,前缀 USER、ALL和DBA。 l 前缀为USER的视图,为用 视图,是在用户的模式内。
l 前缀为ALL的视图,为扩展的用户视图(为用户可存取的视图)。
l 前缀为DBA的视图为DBA的视图(为全部用户可存取的视图)。
在数据库中ORACLE还维护了一组虚表记录当前数据库的活动,这些表称为动态性能表。动态性能表不是真正的表,
许多用户不能存取,DBA可查询这些表,可以建立视图,给其它用户授予存取视图权。
五、事务管理
1. 事务
一个事务为工作的一个逻辑单位,由一个或多个SQL语句组成。一个事务是一个原子单位,构成事务的全部SQL语句的
结果可被全部提交或者全部回滚。一个事务由第一个可执行SQL语句开始,以提交或回滚结束,可以是显式的,也可是隐式
的(执行DDL语句)。
在执行一个SQL语句出现错误时,该语句所有影响被回滚,好像该语句没有被执行一样,但它不会引起当前事务先前
的工作的丢失。
2. ORACLE的事务管理
在ORACLE中一个事务是由一个可执行的SQL语句开始,一个可执行SQL语句产生对实例的调用。在事务开始时,被赋
给一个可用回滚段,记录该事务的回滚项。一个事务以下列任何一个出现而结束。 l 当COMMIT或ROLLBACK(没有SAVEPOINT子句)语句发出。
l 一个DDL语句被执行。在DDL语句执行前、后都隐式地提交。
l 用户撤消对ORACLE的连接(当前事务提交)。
l 用户进程异常中止(当前事务回滚)。
1) 提交事务
提交一事务,即将在事务中由SQL语句所执行的改变永久化。在提交前,ORACLE已有下列情况:
l 在SGA的回滚段缓冲区已生成回滚段记录,回滚信息包含有所修改值的老值。 l 在SGA的日志缓冲区已生成日志项。这些改变在事务提交前可进入磁盘。 l 对SGA的数据库缓冲区已作修改,这些修改在事务真正提交之前可进入磁盘。 在事务提交之后,有下列情况:
l 对于与回滚段相关的内部事务表记录提交事务,并赋给一个相应的唯一系统修改号(SCN),记录在表中。
l 在SGA的日志缓冲区中日志项由LGWR进程写入到在线日志文件,这是构成提交事务的原子事务。
l 在行上和表上的封锁被释放。
l 该事务标志为完成 。
注意:对于提交事务的数据修改不必由DBWR后台进程立即写入数据文件,可继续存储在SGA的数据库缓冲区中,
在最有效时将其写入数据文件。
2) 回滚事务
回滚事务的含义是撤消未提交事务中的SQL语句所作的对数据修改。ORALCE允许撤消未提交的整个事务,
也允许撤消部分。
在回滚整个事务(没有引用保留点)时,有下列情况:
l 在事务中所有SQL语句作的全部修改,利用相应的回滚段被撤消。
l 所有数据的事务封锁被释放。
l 事务结束。
当事务回滚到一保留点(具有SAVEPOINT)时,有下列情况:
l 仅在该保留点之后执行的语句被撤消。
l 该指定的保留点仍然被保留,该保留点之后所建立的保留点被删除。
l 自该保留点之后所获取的全部表封锁和行封锁被释放,但指定的保留点以前所获取的全部数据封锁继续保持。
l 该事务仍可继续。
3) 保留点
保留点(savepoint)是在一事务范围内的中间标志,经常用于将一个长的事务划分为小的部分。保留点可标志
长事务中的任何点,允许可回滚该点之后的工作。在应用程序中经常使用保留点;例如一过程包含几个函数,在每
个函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在回滚到一个保留点之后,该保
持点之后所获得的数据封锁被释放。
七、分布处理和分布式数据库
1. 简介
一个分布式数据库在用户面前为单个逻辑数据库,但实际上是由存储在多台计算机上的一组数据库组成。在几台
计算机上的数据库通过网络可同时修改和存取,每一数据库受它的局部的DBMS控制。分布式数据库中每一个数据库服
务器合作地维护全局数据库的一致性。
在系统中的每一台计算机称为结点。如果一结点具有管理数据库软件,该结点称为数据库服务器。如果一个结点为请求服
务器的信息的一应用,该结点称为客户。在ORACLE客户,执行数据库应用,可存取数据信息和与用户交互。在服务器,执
行ORACLE软件,处理对ORACLE数据库并发、共享数据存取。ORACLE允许上述两部分在同一台计算机上,但当客户部分和服
务器部分是由网连接的不同计算机上时,更有效。
分布处理是由多台处理机分担单个任务的处理。在ORACLE数据库系统中分布处理的例子如:
客户和服务器是位于网络连接的不同计算机上。
单台计算机上有多个处理器,不同处理器分别执行客户应用。
SQL*NET是ORACLE网络接口,允许运行在网络工作站的ORACLE工具和服务器上,可存取、修改、共享和存储在其它服务器上的数
据。SAQL*NET可被认为是网络通信的程序接口。SQL*NET利用通信协议和应用程序接口(API)为OARCLE提供一个分布式数
据库和分布处理。
SQL*NET驱动器为在数据库服务器上运行的ORACLE进程与ORACLE工具的用户进程之间提供一个接口。
参与分布式数据库的每一服务器是分别地独立地管理数据库,好 像每一数据库不是网络化的数据库。每一个数据库独立
地被管理,称为场地自治性。场地自治性有下列好处:
l 系统的结点可反映公司的逻辑组织。
l 由局部数据库管理员控制局部数据,这样每一个数据库管理员责任域要小一些,可更
好管理。
l 只要一个数据库和网络是可用,那么全局数据库可部分可用。不会因一个数据库的故
障而停止全部操作或引起性能瓶颈。
l 故障恢复通常在单个结点上进行。
l 每个局部数据库存在一个数据字典。
l 结点可独立地升级软件。
可从分布式数据库的所有结点存取模式对象,因此正像非分布的局部的DBMS,必须提供一种机制,可在局部数据库中引
用一个对象。分布式DBMS必须提供一种命名模式,以致分布式数据库中一个对象可在应用中唯一标识和引用。一般彩在层
次结构的每一层实施唯一性。分布式DVMS简单地扩充层次命名模型,实施在网络上唯一数据库命名。因此一个对象的全
局对象名保证在分布式数据库内是唯一。
ORACLE允许在SQL语句中使用佤对象名引用分布式数据库中的模式对象(表、视图和过程)。在ORACLE中,一个模式对象
的全局名由三部分组成:包含对象的模式名、对象名、数据库名、其形式如:
其中SCOTT为模式名,EMP为表名,@符号之后为数据库名.
一个远程查询为一查询,是从一个或多个远程表中选择信息,这些表驻留在同一个远程结点. 一个分布式查询可从两个或多个结点检索数据.一个分布式更新可修改两个或两个以上结点的数据.
一个远程事务为一个事务,包含一人或多个远程语句,它所引用的全部是在同一个远程结点上.一个分布式事务中一个事务,
包含一个或多个语句修改分布式数据库的两个或多个不同结点的数据.
在分布式数据库中,事务控制必须在网络上直辖市,保证数据一致性.两阶段提交机制保证参
与分布式事务的全部数据库服务
器是全部提交或全部回滚事务中的语句.
ORACLE分布式数据库系统结构可由ORACLE数据库管理员为终端用户和应用提供位置透明性,利用视图、同义词、过程可提供
ORACLE分布式数据库系统中的位置透明性.
ORACLE允许在SELECT(查询)、INSERT、UPDATE、DELETE、SELECT...FOR UPDATE和LOCK TABLE语句中引用远程数据。对于
查询,包含有连接、聚合、子查询和SELECT ...FOR UPDATE,可引用本地的、远程的表和视图。对于UPDATE、INSERT、
DELETE和LOCK TABLE语句可引用本地的和远程的表。注意在引用LONG和LONG RAW列、序列、修改表和封锁表时,必须位于
同一个结点。ORACLE不允许作远程DDL语句。
在单场地或分布式数据库中,所有事务都是用COMMIT或ROLLBACK语句中止。ORACLE提供两种机制实现分布式数据库中表重
复的透明性:表快照提供异步的表重复;触发器实现同步的表的重复。在两种情况下,都实现了对表重复的透明性。
2. 分布式数据库全局名与数据库链
1) 分布式数据库全局名:每一个数据库有一个唯一的全局名,由两部分组成:数据库名(小于等于8字符)和网络域。
全局数据库名的网络域成分必须服从标准互联网规范。域名中的层次由符号"."分开,域名的次序由叶至根,从左至右。
2) 数据库链:为对过程数据库定义的一路径。数据库链对分布式数据库的用户是透明的,数据库链的名字与链所指向的
数据库的全局名相同。其由二部分组成:远程账号和数据库串。例建立数据库链的形式: CREAT PUBLIC DATEBASE LINK sale。Division3。acme。com
CONNECT TO guest IDENTIFIED BY password
USING‘DB串';
其中:sales。Divisin3。acme。com为定义的链名;guest/password 为远程数据库的用户账号和口令;DB串用于远程连
接。由账号和DB串构成完全路径。如果只有一个则为部分路径。
有三种数据库链可用于决定用户对全部对象名的引用:
专用数据库链:为一指定用户建立。专用数据库链仅链的主人可使用。在SQL语句中用于指定一全局对象名或者在持有
者的视图过程定义中使用。
公用数据库链:为特殊的用户组PUBLIC建立。公用数据库链可为任何用户使用,在SQL语句中用于指定一个全局对象名
或对象定义。
网络数据链:由网络域服务器建立和管理,可为网络中的任何数据库的任何用户使用,可在SQL语句中指定全局对象名或
对象定义中使用。注意:当前网络域服务器对ORACLE不能用,所以网络数据库链不可用。
3. 表快照
ORACLE的表快照特征允许一个主表在分布式数据库的其它结点进行复制。只允许修改主
表,而复制只可读。主表达式每
一个复制称为一个快照。快照异步的刷新,反映主表的一个最近事务一致状态。
一个快照可为表的完全拷贝或者为表的一个子集,由引用一个或多个主表、视图或其它快照的分布式查询所定义。包含
主表的数据库称为主数据库。
快照有简单快照和复杂快照。简单快照的每行是基于单个远程表中的一行。所以定义简单快照的查询中不能有GROUB BY或
CONNECT BY子句,或子查询、连接或集合操作。如果在快照定义的查询中包含有上述子句或操作,这种快照称为复杂快照。
在快照建立时,ORACLE在快照的模式中建立几种内部对象:
在快照结点,ORACLE建立一基表用于存储由快照定义的查询所检索的行,然后为该表建立一个只读的视图,并为远程主表建立
一视图,该视图用于新快照。
一个快照周期地被刷新,反映它的主表的当前情况。为了刷新一快照,快照定义查询是被发出,其查询结果想在存储在快照中,
代替以前的快照数据。
当快照为简单快照时,可以由快照日志来刷新,这样可加快刷新处理。快照日志是在主表数据库中的一表,与主表相关。
ORACLE使用快照日志跟踪主表中已修改的行。当基于主表的简单快照刷新时,仅需要快照日志的相应行来刷新快照,这
种刷新称为快速刷新。