Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103725575
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-08 10:46:40

 




第四篇

在之前我们已经学习过关于Oracle数据结构(包括实体的与逻辑的)与Oracle执行项次,除此之外,也简短的介绍了Oracle服务器行程及其运作。我们将继续探究Oracle架构以及其运作,学习服务器行程如何处理Oracle数据库中的数据。还有数据库的数据如何存放和编辑,其中包含服务器行程与Oracle背景行程的组合。

本文也涵盖交易管理,Oracle数据库服务器作业的其中一部分,最后讨论Oracle纲要对象。

3.1 Oracle的功能性
要了解Oracle的架构,首先要学习Oracle行程如何自数据库读取与写入数据。对于这些行程的了解,将是本章讨论效能议题的关键。

此部分说明使用者如何自数据库中读取与写入数据。也会介绍其它的部分,如读取一致性,锁定以及检查点与回复。

3.1.1 读取数据库
读取RDBMS的作业由使用者的服务器行程完成,服务器行程首先决定数据是否已于SGA,否则将数据文件中的数据复制至SGA,数据在SGA之内则由SGA管理。服务器行程负责管理数据库中的数据,因为有许多的服务器行程,故可同时处理大量的工作(至少每一个使用者有专属的服务器模式,或设定的共享服务器行程数量)。

一般是依照以下步骤执行。「一般」的意思,是指还有其它的选择,如同步查询选项与共享服务器行程。执行时会有些许差异,在此先了解基本的步骤。

⒈ 由使用者传送要求至服务器行程。可能是专用服务器行程或共享服务器行程。

⒉ 服务器行程检查数据是否已存放于SGA的高速缓存。

⒊ 若数据已存在于高速缓存,则处理数据并回传给使用者,或依需求管理资料。

⒋ 若数据未存放于高速缓存,则服务器行程将读取数据文件中的数据,并放置于SGA的高速缓存。

⒌ 数据置于SGA即可回传给使用者,或者视需求处理。

无论CPU与行程的数量,此架构可以让每一个行程独立的执行数据读取。事实上,这是一个延展性很好的架构。

3.1.2 一致性
这是Oracle提供许多使用者同时存取数据库内数据的功能。 Oracle的设计达成最大量一致性的最佳化效能,依不同的类型决定其用途,再透过不同的机制达成一致性。

3.1.3写入数据库
写入数据库时,服务器行程会加入、更新或删除SGA高速缓存的数据,服务器行程不会自己写入数据文件的数据,此工作由DBWR(Database Writer)执行,编辑数据库数据将执行以下步骤。


⒈ 若完成插入的工作,在高速缓存中找到区块空间,并将数据插入此区块内存。

⒉ 若完成更新或删除的工作,将完成一项数据读取工作,然后编辑或删除高速缓存的数据。为了读取一致性或回复作业,则原本的数据将写入UNDO表格空间。

⒊ 编辑高速缓存的数据后,把曰志记录写入重置日志文件,只要将重置日志的内容写出即可完成变更。

⒋ 稍后DBWR将已变更的数据写出至数据文件,DBWR是唯一将资料写回资料档的行程,而服务器行程可读取数据文件。

效能最佳化之后,数据库写入的工作将被简化。


3.1.4 锁定
数据库被编辑之后,重置纪录允许其它行程读取数据;避免多个行程同时编辑数据库,故使用锁定机制。Oracle使用row level的锁定等级,可以最小化其它行程存取数据库的影响,只有在单笔数据或数笔数据被编辑时才会锁定,若是同一个数据库或高速缓存的其它数据,仍然可以被编辑。

3.1.5读取一致性
读取一致性可以让多个行程读取数据库,并维持数据视观表的一致性。当行程开始读取数据库的数据时,子句开始取得一致性的资料。

例如,若子句从表格开始读取数据,在读取过程中,部分数据被其它行程编辑过,而读取的仍是原始末被编辑的数据,可提供一致性的数据视观表。在Oracle的RDBS可以透过重置日志达成,当数据被编辑后,原始数据会被存放于重置日志中,直到编辑数据的子句结束,以及其它可能读取数据的行程执行完成为止。

因为在子句开始时执行视观表的一致性,所以重置纪录中的数据可能会有多个不同的版本。这样的机制提供高效能的读取一致性。

3.1.6 数据完整性
数据库服务器有一些是基本必要的功能,包括数据完整性、数据复原及错误处理等。以下部分列出部分功能的名称及描述。

检查点
写入数据库时,SGA内的暂存快取将被变更,而DBWR行程将写出至数据库档案,这些工作由LRU(Least Recently Used)演算法完成,因为最近被使用的数据可能永远不会到达LRU的尾端,Oracle必须将已修改的快取记忆数据写出以确保数据库的完整性,并同时缩短回复时间(在系统失效时),Oracle使用一种名为检查点的机制来达成目的。

检查点可确认将已修改数据写至磁盘,Oracle使用CKPT背景行程或LGWR行程通知检查点。什么是检查点? 为什么需要使用检查点呢?

LRU演算法
LRU (最近最少被使用者) 是一个项目组合的队列,最近使用的项目会被移到队列的顶端。随着新的项目被加入队列顶端,较旧的项目会随之往下移动,若其中一个项目被使用则此项目会回移至更高的位置,若需要回收资源则队列的最尾端项目会被丢弃,如此一来,即可将最常使用的项目维持在队列顶端的位置。LRU可以应用于Oracle与Linux操作系统的快取及其它资源。

所有数据区块的编辑工作都在区块暂存区完成,内存中存放数据的变更信息,不需要另外将区块的变化写回磁盘。因为使用LRU算法管理暂存记忆体,若不断的编辑一个暂存区,那么永远将被标示为「最近使用」而DBWR将不会写回此暂存区的数据至磁盘。

检查点强制执行将所有已编辑数据写出,故可确认暂存区的数据都会被写回磁盘,这并不代表执行检查点会停顿所有的工作;检查点行程有两种作业方式:快速检查点及普通检查点。

每一次执行普通检查点时,DBWR仅写出少量的暂存区资料,这种检查点执行时间较长,但对系统影响较小。至于快速检查点,每一次执行时DBWR则会写出大量的暂存区数据,这种检查点执行速度较快,对于I/O使用率也较有效率,却对系统效能产生较大影响。

可利用检查点执行的间隔时间来加强系统的执行项次修复动作,经常使用检查点可减低系统复原所需的时间。在日志切换时会自动执行检查点。

3.1.7 重置日志
重置日志文件负责存放重置信息,当数据库数据变更即产生一笔日志记录变更的信息,有了这样的信息,数据库即可修复被确认的交易与回复未确认的交易,顺利的回复数据库。

若系统遭遇灾害因而造成电源失效、组件损坏等问题,Oracle执行项次也将会损毁,数据库可能因此立刻停止,或者因为磁盘损坏而造成执行项次的损毁。若发生这样的情况,所有暂存区内的数据变更都将遗失:只有已写回磁盘的资料异动会被保存。

重新启动Oracle之后,可以使用重置曰志恢复最近一次写入资料文件的异动资料。所有之前被确认的交易都可以回复,也称为roIling-forward 。所有已变更但尚未确认的交易会被退出,这就是roIling-back,rolling-back的作业类似于交易,最后则使用ROLLBACK子句而不是COMMIT。

重置日志文件适合应用在系统回复,因为磁盘损坏可能会遗失重置日志文件,所以必须保护磁盘以避免这样的问题,建议所有的重置日志文件均使用磁盘镜射或RAIDl。

因为重置日志文件对系统复原非常重要,除非有备援电力否则不建议使用有写入快取的磁盘控制器,当电力失效时,必须确定不会遗失任何的重置信息,通常不建议将重置日志文件全部存放在写入快取,如果有备援电力则可以接受。

重置日志如何运作
数据库的每一个异动均被写入重置日志,因此当系统损坏时,即可利用重置日志文件将系统回复到上一次备份的状态。如果因为电源失效或其它系统失败而造成执行项次损毁,则重置日志文件可将系统回复到上一次检查点的状态。

执行COMMIT作业时,重置信息将写入重置日志暂存区。LGWR行程将重置日志高速缓存内的数据写入重置曰志档,直到重置日志写入完成,COMMIT作业才算大功告成,一但开始执行这一项作业会让此交易无法取消,并且也用于系统复原。由此可知重置日志文件是非常重要的一环。

重置日志由两个或两个以上的重置日志文件或日志文件群组组合而成。日志档群组是Oracle使用于系统备援的一组档案,重置曰志群组被视为一个重置日志文件,且具有备援的功能,重置日志有这种特性,将可避免磁盘损坏的问题。重置日志群组由一个或一个以上的重置日志文件组合而成,为了避免磁盘失效的问题必须被保护,若已经采用磁盘镜射来保护重置日志,则不需另外使用重置日志文件群组,因为磁盘已被保护则单一的日志文件已足够。大多数的使用者选择使用硬件数组系统,而不是使用Oracle镜射系统,原因在于硬件RAID的效能表现优于Oracle镜射系统。

保护重置日志
若重置日志档存放于有写入快取(Write-Catch)控制器(Controller)的磁盘,而且没有备援电力,那么数据遗失的可能性将会非常的高。在电源失效的情况下可能会遗失重置信息,且无法回复这些数据。

重置日志有两个或两个以上的日志文件或日志文件群组,可应用于其它的用途,当第一个日志档写满之后,日志作业将移动到下一个连续的重置日志档。如果启用封存功能,当日志写满并执行日志切换时,则此日志将被复制至封存日志文件,当发生灾害造成系统损坏时,这些封存日志文件对系统复原非常重要。

可使用ALTER DATABASE指令执行重置日志文件的作业,这个指令可增加重置日志群组与重置日志文件,变更重置日志文件名称以及执行其它工作。

日志切换与检查点
每一次重置日志文件或日志文件群组被写满之后,便循序切换至下一个重置日志文件,这一种切换动作称为日志切换,将会引起多个自动化事件。包括:

■ 检查点
日志切换会带动执行检查点,并将刷新所有Oracle暂存快取记忆体的已编辑数据区块,如此一来,可减低系统复原需花费的时间。

■封存
若启用封存功能,日志切换将促使重置日志文件的内容被复制至封存日志文件,然而封存日志文件也可应用于系统复原。

■日志的循序编码
每一次重复使用重置曰志文件,将编码一个循序号码给日志,这一个日志的循序编码将使封存日志文件具有关联性。

检查点
检查点让所有暂存区内已被编辑的数据区块写出至磁盘,这些已被编辑但尚未写出的暂存区称为<Ι>dirty buffers。而<м>dirty buffers则代表已变更且确认,但是尚未写出磁盘的数据区块,除此之外,还有一些已被写回磁盘但尚未确认的数据区块。


封存与检查点为Oracle REBMS功能的一部分,同时对系统备援与稳固性极为重要。

日志切换与检查点区间
初始化参数LOG_CHECKPOINT_INTERVAL与LOG CHECKPOINT_TIMEOUT可用来控制检查点区间。参数LOG_CHECKPOINT_TO_ALERT可将检查点作业的讯息打印至警告日志,此方式可以很便利的检查每一次检查点的执行,也可以轻易地建立大量的警告日志。

LOG_CHECKPOINT_INTERVAL

LOG_CHECKPOINT_INTERVAL可以设定日志切换发生前使用的操作系统区块数量,大多数的操作系统使用512字节的区块,故此参数设定在执行检查点之前,重置日志使用512字节的区块。

若重置日志文件为10MB,同时希望检查点区间为重置日志档的十分之一,可使用以下公式来决定LOG_CHECKPOINT_INTERVAL的数值。

LOG_CHECKPOINT_INTERVAL = lMB / 512 (bytes/block) = 2048 blocks

为达成此目标可设定参数文件为LOG_CHECKPOINT_INTERVAL=2048,若只需要在日志切换时执行检查点,则必须设定较高的LOG_CHECKPOINT_INTERVAL参数值。

LOG_CHECKPOINT_TIMEOUT

参数LOG_CHECKPOINT_TIMEOUT,可指定以秒为单位的检查点执行时间区间。即可自动地依照此时问区间执行检查点。

使用以下等式,可设定每十分钟执行一次检查点:

LOG_CHECKPOINT_TIMEOUT = 600

透过定时器设定检查点区间,即使时间区间内的系统活动不频繁仍可定期的执行检查点。


强迫执行检查点
也可以手动强迫执行检查点,使用以下指令即可强迫执行检查点:
ALTER SYSTEM CHECKPOINT;

若发生天灾的意外状况而使得系统有损坏的风险,此时即可执行这一个功能。

强迫执行日志切换
就像是手动执行检查点,日志切换也可以被强迫执行。可以透过以下指令,强迫执行日志切换:

ALTER SYSTEM SWITCH LOGFILE;

然而,需要切换日志档的机率不是很高。

调整重置日志档的大小
通常重置日志文件的大小会依照封存日志文件而设定。过去会维持较小的重置日志文件,以便于将数据写入磁带,但是现在已不再需要顾虑磁带的容量,若没有特定的封存媒体或空间限制,即可视状况来调整重置曰志档的大小。

设定重置日志文件的大小时,没有特别的规则,只要记得,若将重置日志设定的太大可能就没有执行日志切换的机会(即不会产生封存曰志档),如此可能会因为没有封存曰志文件,造成系统复原时的媒体不充足而产生危机,这个部分将于以下讨论。

封存重置日志
若启用封存功能来执行日志切换时,将备份日志记录至封存日志文件,这种封存工作通常会自动的执行,直到封存工作完毕后才可以使用重置曰志档,所以必须采取一些处理方式以避免在封存作业完成前存取重置曰志档。以下方式可快速的执行封存作业:

■ 封存到磁盘
可封存至磁盘再复制这些封存盘至磁带,如此可避免封存作业等待磁盘,或其它较慢的媒体才能执行。

■ 使用多个日志档
透过两个以上的重置日志文件(两个是最基本底限),可以同时封存两个或两个以上的日志文件,如此即可使用其它的日志档持续纪录,若重置日志尚未完成封存作业,则交易将会等待一直到可以使用为止。

对于数据库维护的工作来说,封存作业是很重要的。


增加额外的重置日志档与群组
我们介绍的许多方式有部分应用于重置日志文件,大多数的公用程序同时提供可选用图形化或命令提示字符的接口,并可透过Oracle Enterprise Manager使用SQL指令,或厂商的工具程序以增加重置日志文件。在此将介绍如何使用SQL指令增加额外的重置日志文件。

透过ALTER DATABASE指令增加重置日志
可透过ALTER DATABASE指令,或Oracle的GUI公用程序,增加或编辑日志文件及日志文件群组。因为使用script弹性较高,并且可以重复执行,所以建议使用命令提示字符公用程序。

ALTER DATABASE
ADD LOGFILE GROUP 3
(‘/u0l/data/log3a.log’,‘/u01/data/log3b.1og’)
SIZE 10M ;


可使用以下指令,增加新的日志档至一个已存在的群组:

ALTER DATABASE
ADD LOGFILE MEMBER‘/u0l/data/log3c.1og’TO GROUP 3;

或者在不知道群组名称的情况下,使用同样的指令但指定群组内其它成员的名称:

ALTER DATABASE
ADD LOGFILE MEMBER‘/u0l/data/log3c.1og’
TO GROUP(‘u01/data/log3a.1og’,‘/u01/data/log3b.1og’);


就像是之前提过的,透过SQL script与ALTER DATABASE 指令可预存异动的永久纪录,并使用此档案为类似作业的模板,若正在执行一个指令可以将此指令放入SQL script并且存起来。

编辑重置日志档与群组
前面所述有许多方式可增加重置日志档,大多数的公用程序同时提供图形化,或者命令提示字符的接口。以下说明如何使用SQL指令编辑重置日志文件。

使用ALTER DATABASE 指令编辑重置日志档
如前述可透过ALTER DATABASE 指令编辑日志文件或日志文件群组,同样地,因为使用script弹性较高且可重复执行,所以建议使用命令提示字符公用程序。
例如,使用以下指令重新命名重置日志档:

ALTER DATABASE
RENAME LOGFILE‘/u0l/data/logl.doc’TO‘/u0l/data/log2.doc’;


或使用以下指令删除日志文件:

ALTER DATABASE
DROP LOGFILE‘/u0l/data/logl.log’;

或使用以下指令,摒弃整个日志文件群组:

ALTER DATABASE
DROP LOGFILE GROUP 3;

若在不知道日志文件群组数量的情况下,可以指定日志文件成员的名称达成此工作:

ALTER DATABASE
DROP LOGFILE GROUP(‘/u0l/data/log3a.log’,‘/u0l/data/log3b.log’);

若需要的话,可使用以下语法摒弃日志文件群组的其中一个成员:
ALTER DATABASE
DROP LOGFILE GROUP MEMBER‘/u0l/data/log3b.log’;

注意
不可以摒弃或更改一个执行中的日志文件。为了对特定的日志文件执行这个作业,必须先执行ALTER SYSTEM SWITCH LOGFILE指令,将活动依序转移到下一个日志档。然后才可以执行前述的作业。

日志档的特性
重置日志文件是Oracle数据库中少数永远循序写入的档案,因为只有在系统回复时才会读取重置纪录,所以在一般情况下仅是执行唯写的档案。

因为重置日志文件的循序特性,所以如果将这些档案分散于不同的磁盘,则序列I/O的速度将会比随机I/O更快。请记住! 封存作业会读取重置日志文件,若同一磁盘上有两个重置日志文件,则混和的重置日志将不会按照循序的原则进行封存作业。

注意
无论是单一磁盘或一组磁盘,我自己就偏好使用RAID数组的磁盘装置。

在大多数的情况下,重置日志作业的效能表现都算不错,但是若在一个密易的环境下,也许就必须将每一个重置日志文件分别存放在不同的磁盘上。

注意
应该要保护重置日志文件,无论是透过曰志文件群组或RAID数组,使用RAID数组时(无论是硬件或软件数组),重置日志文件请使用RAID1,因为RAID 1提供较多的保护,同时也有更高快的写入速度。


封存日志扇区的效能不如重置日志扇区来得重要,但仍值得注意,使用重置日志档之前,必须先完成封存作业。

在许多情况下,封存信息可以存放在另一个系统,并且为需求复原系统。若正在执行此作业,或是将封存曰志文件存放至磁带,那么必须先封存磁盘再复制至磁带或网络储存媒体,如此即可更快速的复原数据,若正在备份数据至备援系统则可以使用RAID 5,虽然速度较慢但成本相对的较低。无论如何,先封存资料至暂存区域,并且尽快释放重置日志文件。

若封存数据的磁盘毁损,可能会遗失封存于这个磁盘的封存日志文件,这将使系统变得比较脆弱。绝对不要将封存日志文件与数据库存放于同一磁盘,若发生磁盘损毁的状况将无法复原系统。


3.1.8 回复
数据库的数据被编辑后,Oracle将记录此交易信息以备将来回复系统之用途,回复表格空间与退回区段也可应用于读取一致性及数据库复原。回复表格空间与退回区段,包含退回作业所使用的回复信息,请记住! 可透过COMMIT或ROLLBACK子句完成交易,这两个子句分别代表完全相反的作业。

COMMlT作业将完成所有变更,一旦执行完成COMMlT作业即完成所有变更,而且无法退回。在回复系统时,这一种类型的交易将可以完全复原。

ROLLBACK可以退回所有交易期间所做的变更,一旦完成退回作业则必须重新执行变更的工作,才可以再次执行所有变更,完成退回作业如同交易从未发生过。


读取一致性可以维护长时间运作交易,在查询时能够提供相同的数据。交易过程中,提供给使用者相同以及如同单一时间点的数据,即使数据被更改或DBWR已写出数据,除非开始使用COMMIT,否则其它交易不会看到这些变更,实际上,往往只有在已确认交易才会看到这些变更。

长时间执行的交易透过读取数据库暂存区与回复信息达成此功能,这就是回复数据完成前不可以删除回复空间的原因。在Oracle 9i中,使用回复表格空间或退回区段。

Oracle通常使用退回区段管理读取一致性,Oracle 9i新加入使用System-Managed Undo(SMU),可管理读取一致性、退回与系统复原。

Oracle 9i建议使用SMU机制来管理回复信息,这一种回复方式不需对设定过程及退回区段做设定,但Rollback Segment Undo(RBU)机制则需要。

透过设定初始化参数UNDO_MANAGEMENT为AUTO,以及设定UNDO_TABLESPACE为所需使用的表格空间名称,即可使用SMU机制,配合建立一个回复表格空间即可启用SMU。

透过设定初始化参数UNDO_MANAGEMENT_MANUAL,则可以满足想要手动设定退回区段的使用者需求,若使用SMU机制则调教空间比较小,为了适当的设定系统退回区段必须建立足够的退回区段,并且给予足够的大小。

回复表格空间或System-Managed Undo(SMU)模式
如同稍早所提到的,可以透过设定UNDO_MANAGEMENT参数为AUTO并启用SMU模式。在SMU模式中可使用的初始化参数不多,必须建立一个回复表格空间,并指定回复信息给予此表格。使用这个新的机制管理回复信息,即可指定回复信息被保留的时间,定义回复表格空间大小,即可管理回复的作业。

建立回复表格空间
透过CREATE UNDO TABLESPACE指令即可建立回复表格空间,回复表格空间的建立方式与其它的表格空间相同,都必须指定表格空间的位置及大小,其由一个或多个数据文件组合而成,而且只能使用一个功能的特性,与暂时性表格空间类似。

除了设定UNDO_MANAGEMENT参数为AUTO之外,也必须透过初始化参数UNDO_TABLESPACE指派表格空间给回复作业。

必须建立够大的回复表格空间以存放回复信息,可透过UNDO_RETENTION参数概略的估计,本章将说明此参数,这个参数指定回复信息保留的时间。

若知道回复信息被保留的时间,配合每一秒建立的回复信息数量,即可计算出回复表格空间所需的空间。可以使用以下公式:

Undo space needed = Undo retention time * Undo/time

例如,若回复信息保留时间为300秒,且系统每一秒产生1000回复区块则所需块数量为:

Undo blocks required:
(300 seconds) * (100 undos blocks/sec) = 30,000 blocks

因此需要30,000乘以区块大小的空间。

监控回复表格空间
为了找出回复比率,可监控动态效能视观表V$UNDOSTAT,其中特别受到关注的部分数据为:

BEGIN-TIME 测量区间开始的时间。
TXNCOUNT 测量区间已确认交易的总数量。
SSOLDERRCNT 测量区间中发生OER错误的次数,若数值很高则必须重新评估回复信息保留的时间。

NOSPACEERRCNT 找出执行项次发生OER错误的数量,若数值很高则必须重新评估回复表格空间的大小。







若错误计数中没有非零数值,则必须减低保留的时间或增加回复表格空间的大小。

调教保留的时间
保留时间可以指定回复信息被保留的时间,参数UNDO RETENTION以秒为单位设定,回复信息预设保留30秒,通常这样的默认值已足够,若绝得回复信息需要更久的保留时间即可增加此参数值。

增加保留时间可以使回复信息保留更久的时间,因此长期运作的交易才可以提供资料的一致性视观表。增加回复信息保留时间,可能会因此而接收到“snapshot too old”的错误讯息。

退回区段或Rollback Segment Undo(RBU)模式
退回区段(Rollback Segment)纪录交易的信息使得交易可以有退回的信息,这些信息也使用于读取一致性以及数据库复原。因为Oracle 9i已停用退回区段,故未涵盖于本文介绍的内容内。

3.2 简介交易管理
本章已介绍Oracle如何执行读取与写入作业,因为数据已被变更,所以基本上任何的写入作业都被视为交易。交易的定义就是包含一个或多个SQL子句的逻辑单位作业,无论交易成功或失败,交易都是基本的元素。而交易的完成可透过使用者的COMMIT或ROLLBACK子句,或者在系统失效时,执行自动的初始化退回作业。

这一个部分的内容,有一些来自于本章的数据库写入;但是因为交易管理的重要性将会更详细的说明,并且介绍一些新的交易程序。

3.2.1 交易
为了更清楚的说明Oralce如何操作,这一个部分将分析一个交易的范例。我们把交易描述为一个逻辑的工作群组,此工作群组包括一个或多个SQL子句且必须被确认或退回,假设此范例为Oracle Net的一个客户端/服务器应用程序,过程类似于本地端的客户端应用程序,以下为交易完成的执行步骤:

⒈ 应用程序管理使用者输入,并且透过Oracle Net建立一个联机至服务器。

⒉ 服务器选取联机需求并建立服务器行程给使用者。

⒊ 使用者执行SQL子句并确认此交易。在此例使用者变更表格中的一个数值。

⒋ 服务器行程得到此SQL子句,并检查共享资料区是否有SQL的共享区域,服务器行程检查使用者是否有存取数据的权限。若使用者有存取权,服务器行程将使用共享SQL区域执行此需求,若没有SQL共享区域则会配置一个新的SQL共享区域,并传递此SQL子句再执行。

⒌ 服务器行程处理SGA(如果已存在)的数据,或从数据文件中移动数据至SGA。

⒍ 服务器行程编辑SGA的数据,请记得! 服务器行程只可以读取数据文件,因为交易已被确认,LGWR行程立即记录此交易至重置日志档,稍后DBWR行程将已编辑区块写入暂存储存区。

⒎ 若交易成功将透过网络回传一个完成码给客户端行程,若失败则回传错误讯息。

交易的注释
直到写入重置日志档的工作完成后,交易才算是被确认。这样的安排是为了确保当系统发生意外状况时,可以成功的复原已被确认的交易,当系统发生意外状况时,未被确认的交易会被退回,而已确认交易则会透过重置日志文件被复原,若没有重置日志文件则系统可能无法恢复一致性。

重置日志文件被使用于系统灾难复原,若系统发生意外所有已确认交易可以被复原,而未被确认的交易则会被退回,可以确保数据库的一致性,这使得重置曰志档显得格外的重要,因为有些重置日志的扇区未使用硬件写入快取,本书作者建议使用有电力备援的硬件写入快取,则将让系统更有保障。

发生交易时,Oracle背景行程会持续执行其工作使系统平稳的持续运作。请记得! 当此形成执行的过程中,有数百个其它的使用者也正在执行类似的工作,管理竞争与锁定并依照设定速度运作,使系统维持一致性状态就是Oracle的任务。

这样的描述为了提供对于Oracle数据库服务器复杂性与交互作用数量的说明,将这些概念作为Oracle数据库服务器如何作业的基本参考,本文调教服务器行程与应用程序的章节中,将会有更详细的说明,因为Linux操作系统的差异性,所以也将会个别讨论在不同环境的些许差异。

确认
COMMIT作业被使用于结束交易,并且对交易做永久性的改变,一旦交易被确认后,除非手动回复数据否则将无法复原此作业,COMMIT作业确认整个交易已成功完成后,才会回传成功讯息给使用者。

为了完成COMMlT作业,必须执行几个步骤。

⒈ 在交易表格的回复表格空间,写入给此交易的唯一System Change Number(SCN)。

⒉ 日志写入行程(LGWR)写出重置日志信息以及SCN至重置曰志档,除非已确实写出否则交易将无法完成,这就是执行重置日志文件与LGWR的重要性。

⒊ 释放锁定。

⒋ COMMIT子句回传成功讯息给使用者行程,COMMIT作业对于数据的稳定性与系统效能都非常的重要,为了使交易顺利执行则必须要介绍Savepoint作业。

Savepoints
Savepoint可多次存放冗长且复杂的交易工作,透过建立多个savepoint可退回至特定savepoint,而不用退回至交易最初的状态,如此一来,可以在长时间交易中更正某一个问题数据,而不需重新执行整个交易。

交易可退回至任意一个savepoint;但是此savepoint之后的所有SQL子句也将会被退回。以下为范例:

⒈ 交易开始
⒉ SQL
⒊ Savepoint A
⒋ SQL
⒌ Savepoint B
⒍ SQL
⒎ Savepoint C
⒏ SQL

可以随时回复交易至savepoint A 。若执行所有在savepoint A之后的SQL子句都将会被退回,不能只将交易回复至savepoint A与savepoint B之间。

可透过SAVEPOINT SQL子句建立savepoints,如下:

SAVEPOINT my_savepoint_a ;

为了退回至savepoint,可使用SQL子句ROLLBACK TO SAVEPOINT,如下:

ROLLBACK TO SAVEPOINT my_savepoint_a ;

在执行复杂交易时,savepoint作业非常有帮助。

退回
退回作业rollback或undo都是透过SQL子句执行。数据区块中已被变更的资料将会被还原为原始数据,执行退回作业时,透过回复表格空间的数据以及释放所定,使数据区块被还原为原始数值,其可以透过ROLLBACK子句或是在还原系统时自动的执行退回作业。

Flashback作业
Oracle 9i开始提供flashback作业,而Oracle 10g则强化此功能,交易回复表格空间的保留时间提供多种功能,可以取得数据库单一时间点的资料视观表,包括flashback查询、flashback表格与flashback数据库。这样的数据对于需要还原部分遗失资料的DBA与终端使用者都非常重要,flashback作业可以回朔至回复保留期间,所以不会造成时间的浪费。

Flashback查询
flashback查询使用Oracle数据库服务器读取一致性的功能,以及回复保留期间的回复表格空间,可以执行单一时间点的查询。可以在SELECT子句中加入AS OF达到此功能,AS Of子句可使用时间戳记、SCN或BETWEEN子句,提供两个事件中的资料。

以下为SELECT子句的范例,将处理过去一个小时存在的数据。

SELECT salary
FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL‘1’hour)
WHERE last_name = ‘Thomas’;

这是一个实用的单一项目查询;但是对于没有正确编辑的表格却有更大的效果,如下:

SELECT *
FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL‘1’hour) ;

可以使用这个数据重新建立表格,另一种使用方式则是使用FLASHBACK TABLE子句;但是可能必须控制最基本的数据单位。

FLASHBACK TABLE
FLASHBACK TABLE指令可取得完整表格并回复至过去的某一个时间点,可以有效的将表格回复至稍早的状态,但请记得所有表格中的数据也将会被回复,像是flashback查询;FLASHBACK TABLE子句也可以使用时间戳记或SCN,为了回复表格可使FLASHBACK TABLE指令,如下:

FLASHBACK TABLE employees
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL ‘1’ hour) ;

同样地,必须非常小心的使用这一个指令,因为此回复作业将回复整个表格至最原始的数据,将遗失所有已作的变更。

FLASHBACK DATABASE
FLASHBACK DATABASE指令类似于FLASHBACK TABLE指令,除了会将整个数据库回复至前一个状态以外,如同前两个指令一样FLASHBACK DATABASE指令可以使用时间戳记或SCN。

3.3 Oracoe纲要对象简介
到目前为止,已介绍过Oracle实体与逻辑地数据结构以及Oracle执行项次。本章则说明Oracle的功能性与交易过程,所以在结束讨论Oracle架构之前,将讨论Oracle纲要对象,讨论纲要对象的同时也将学习到与Oracle架构相关的一切事务,虽然还有许多其它的问题,但是会随着特定管理工作及组件共同讨论。

3.3.1 表格
表格为Oracle的基本储存对象,表格存放各种表格或字段定义给表格的记录或数据,每一个表格均有表格名称,字段也各自有相关的名称,在此书依照Oracle给予的定义,表格的组件将称之栏或列,虽然其它产品可能有不同的称呼但组件是相同的。图3-1为表格的描述。

每一字段皆有定义字段名称、数据类型与宽度,宽度可以为固定数值或数种数据类型的多种长度,可以透过CREATE TABLE子句建立表格,其可定义表格名称、字段名称以及宽度,除此之外,也可以在字段强制使用符合特性的数据。以下为建立表格的范例。

CREATE TABLE demo_table
( id NUMBER(8)CONSTRAINT demo_lname_nn NOT NULL,
lname VARCHAR2(40) CONSTRAINT demo_lname_nn NOT NULL,
fname VARCHAR2(20) CONSTRAINT demo_fname_nn NOT NULL,
phone VARCHAR2(20),
email VARCHAR2(20)
);

前三个字段定义插入的数值不可以为NULL,CONSTRAINT子句为选用,但是在指定数据范围时非常实用,在此情况下,即不可能插入没有姓、名与ID的数据。






分割
首先于Oracle 8提出数据库分割的选项,分割可以让单一表格分成为多个区块,因此可以分散一个表格为多个区块,分割选项可以将表格分散至多个表格空间,或者将所有分割至同一个表格空间。无论是分散为多个表格空间或置放于同一个空间,皆可具有相同的优点。

分割有多种选项,如下:

■ 范围分割(Range Partitioning) 数据依照定义范围的上、下限分割。

■ 杂凑分割(Hash Partitioning) 当数据没有较好的分割方式时,依照杂错函数建立子分割区块。

■ 非连续数值分割(List Partitioning) 数据依数值清单分割。

■ 混合分割(Composite Partitioning) 数据依照两种预先定义的方式分割。

透过数据库分割,可以降低部分作业存取的数据总量(视相关因素而定)。可增加系统效能并减低系统负荷。

为什么要分割 ?
分割提供大于单一表格的优点,分割表格可减低部分作业存取的数据数量,例如:汇总与tablescan,如同其它类型的作业分割也需要适当的使用,若表格中的数据依照数据范围,如月份作为分割的依据,SQL子句应该只分割适当的部分。以下为范例:

若表格依照月份切割,且SQL子句依照月份执行聚合功能,存取过程中应该只有存放月份的数据被查询,即可减低数据存取量。

3.3.2 索引
索引为选用结构可协助增加表格或丛集的数据存取速度,索引的逻辑与实体均独立于表格数据,这代表数据不会被索引影响,但是索引内数据的存取效能却会受到索引影响。

索引的主要目的为加速数据存取,索引的功能像是书本的索引一样,透过存放栏与列信息的结构协助快速地找出表格的数据。

Oracle 10g提供多种类型的索引,这些索引各自有不同的目的,可以协助处理各种类型的数据。如下:

■ B-tree索引 核对查询的数据时,B-tree索引使用树状结构检查索引。

■ 位图(Bitmap)索引 位图索引为所有为一字段或字段组建立一个位图。

■ 位图联合(Join)索引 联合两个或多个表格数值的位图。

■ 功能(Function)索引 依照使用者定义(手动)所建立的索引。
关于索引,将会在第17章更详细的说明。

3.3.3 视观图
「视观图」是依照表格或数据库所形成的抽象数据,SQL子句执行后视观图代表表格,但事实上,这是依照透过SQL子句建立的表格,视观图可能是表格的子集合,或是联合两个或多个表格的超级集合,视观图输出查询的结果且被视为一个表格。 Oracle支持两种类型:标准视观图及具体化视观图。

标准视观图
「视观图」透过SQL子句定义表格内数据的子集合或超级集合,这些视观图实际上没有存放任何的数据,查询使用视观图时,SQL子句定义的视观图会依照SQL子句的呼叫,提供可以存取的资料。

具体化视观图
具体化视观图也是SQL子句透过表格产生的视观图数据;但是具体化视观图实际上真的有存放数据,也会占据系统空间。这一种类型的视观图可以使用于存放聚合数据,如总和、乘积等。在具体化视观图执行这些功能,将可以更快速地产生数据。

3.3.4 序列
Oracle内建序列产生器可以自动地提供续列号码,使Oracle提供更快速的效能,并且对同时执行的应用程序提供其所需的序列号码。Oracle使用这样的方式产生序号具有良好的效能,也因为这样的设计可以同时提供序号给多个行程,而且不会有重复的问题。

3.3.5 集群
最近集群已经成为过度使用的名词,Oracle表格集群是一种Oracle内的结构,提供多个表格,主要以联合键为基础存放在一起,因为存放在一起,所以对象可以快速的存取联合的表格数据,除此以外,可以独立的参考与存取集群内的集群表格。

3.3.7 同义字
同义字为数据库提供给其它对象的别名,同义字可以是表格、视观图、具体化视观图或其它Oracle对象,包括封包与程序的别名。

总结
本章首先延续前一个章节的内容,讨论Oracle内部的读取、写入与交易程序的工作,再讨论读取一致性与Oracle纲要对象。已说明Oracle与Linux的基础之后,后续的章节将开始讨论Oracle/Linux DBA相关的管理与作业设计。



请参阅第五篇.....


To be continued.......



出处:南方Linux
阅读(499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~