《oracle10g经典实战第10章其他概念》由会员分享,可在线阅读,更多相关《oracle10g经典实战第10章其他概念(41页珍藏版)》请在金锄头文库上搜索。
1、oracle10goracle10g经典实战第经典实战第1010章章- -其他概念其他概念10.1 事务事务事务是Oracle操作完成的逻辑单位。事务的处理必须满足以下原则:(1) 可分性事务只有两种状态,即完成和未完成。(2) 一致性事务必须完成全部的操作,事务开始时系统为一个确定的状态,完成后则成为另一个确定的状态;未完成则回到事务开始时的确定状态;不允许出现未知的、不一致的“中间”状态。 (3) 孤立性事务的这个原则很好理解,即事务之间不能相互干扰。这种要求有时也被称为事务的串行性。 10.2锁锁多用户在访问相同的资源时,锁是用于防止事务之间的有害性交互的机制。当用户对数据库并发访问时,
2、为了确保事务完整性和数据库一致性,需要使用锁,它是实现数据库并发控制的主要手段。锁可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能会产生意想不到的结果。Oracle通过获得不同类型的锁,允许或阻止其他用户对相同资源的同时存取,并确保不破坏数据的完整性,从而自动满足了数据的完整性、并行性和一致性。为了在实现锁时不在系统中形成瓶颈和不阻止对数据的并行存取,Oracle根据所执行的数据库操作自动地要求不同层次的锁定,以确保最大的并行性。 10.2.1 锁机制和死锁锁机制和死锁1. 锁机制锁机制在Ora
3、cle中,提供了两种锁机制:(1) 共享锁(share lock)共享锁通过数据存取的高并行性来实现。如果获得了一个共享锁,那么用户就可以共享相同的资源。许多事务可以获得相同资源上的共享锁。(2) 独占锁(exclusive lock)独占锁防止共同改变相同的资源。假如一个事务获得了某一资源上的一个专用锁,那么直到该锁被解除,其他的事务才能修改那个资源。但允许对资源进行共享。 所有的锁在事务期间被保持,事务中的SQL语句所做的修改只有在事务提交时才能对其他事务可用。Oracle在事务提交和回滚事务时,释放事务所使用的锁。2. 死锁死锁当两个或者多个用户等待其中一个被锁住的资源时,就有可能发生死
4、锁现象。对于死锁,Oracle自动进行定期搜索,通过回滚死锁中包含的其中一个语句来解决死锁问题,也就是释放其中一个冲突锁,同时返回一个消息给对应的事务。用户在设计应用程序时,要遵循一定的锁规则,尽力避免死锁现象的发生。 10.2.2 锁的类型锁的类型Oracle自动提供几种不同类型的锁,控制对数据的并行访问。一般情况下,Oracle的锁可以分为以下几种类型:1. DML锁锁DML锁的目标是保证并行访问的数据完整性,DML锁防止同步冲突的DML和DDL操作的破坏性交互。2. DDL锁锁DDL锁保护方案对象的定义,调用一个DDL语句将会隐式提交事务。DDL锁有多种形式:(1) 独占DDL锁:当CR
5、EATE、ALTER和DROP等语句用于一个对象时使用该锁。(2) 共享DDL锁:当GRANT与CREATE PACKAGE等语句用于一个对象时使用此锁。 (3) 可破的分析DDL锁:库高速缓存区中语句或PL/SQL对象有一个用于它所引用的每一个对象的锁。假如被引用的对象改变了,可破的分析DDL锁会持续。3. 内部锁内部锁内部锁包含内部数据库和内存结构。对用户来说,它们是不可访问的。因为用户不需要控制它们的发生。 10.2.3 表锁和事务锁表锁和事务锁为了使事务能够保护表中的DML存取以及防止表中产生冲突的DDL操作,Oracle获得表锁(TM)。表10.1列出了不同的模式。当执行特定的语句时
6、,由RDBMS获得这些模式的表锁。通过V$lock动态表可以查看锁的相关信息。模式列的值分别为2、3或6。数值2表示一个行共享锁(RS);3表示一个行独占锁(RX);6表示一个独占锁(X)。表表10.1使用的语句与获得的锁使用的语句与获得的锁 10.2.3 表锁和事务锁表锁和事务锁当一个事务发出表10.2所列出的语句时,将获得事务锁(TX)。事务锁总是在行级上获得。事务锁独占地锁住该行,并阻止其他事务修改改行,直到持有该锁的事务回滚或提交数据为止。注意:注意:要想获得事务锁(TX),事务首先必须获得该表锁(TM)。表表10.2事务锁语句事务锁语句 10.2.4 实例分析实例分析Oracle在动
7、态状态表V$lock中存储与数据库中的锁有关的所有信息。使用DESCRIBE命令可查看表V$lock的结构:SQLDESCRIBE V$lock;结果为:名称是否为空?类型ADDRRAW(4)KADDRRAW(4)SIDNUMBERTYPEVARCHAR2(2)ID1NUMBERID2NUMBERLMODENUMBERREQUESTNUMBERCTIMENUMBERBLOCKNUMBER10.2.4 实例分析实例分析其中:(1) SID:会话标识符。(2) TYPE:所获得的或会话等待的锁类型。TX事务。TMDML或表锁。MR介质恢复。ST磁盘空间事务。(3) LMODE/REQUEST:包含
8、锁的模式。0无1空2行共享(RS)3行独占(RX)4共享(S)5共享行独占(SRX)6独占(X)ID1:根据锁类型的不同数值有不同的含义。ID2:假如锁类型是TM,那么数值是0;假如锁类型是TX,那么数值表示交换次数,也就是回滚槽重新使用的次数。 10.2.4 实例分析实例分析在允许多个用户同时访问时,Oracle使用锁维护数据的一致性和完整性。但是,当两个或两个以上的用户会话试图竞争同一对象的锁时,锁就会成为坏信息。数据库管理员应该监控并管理数据库中对象的锁争用。管理锁争用可分下列三步:(1) 识别等待获得锁的会话;(2) 查找哪个会话持有阻塞锁;(3)确定想要做什么。可以让当前持有锁的会话
9、继续持有该锁并完成该事务处理,或者强迫它释放锁。监控锁的方法有三种:(1) 使用CATBLOCK.SQL和UTLLOCK.SQL(2) 直接查询数据字典视图(3)使用OEM10.3快照快照快照基于一个查询,该查询链接远程数据库。可以把快照设置成只读方式或可更新方式。若要改善性能,可以索引快照使用的本地表。根据快照基本查询的复杂性,可以使用快照日志(snapshot log)来提高复制操作的性能。复制操作根据用户为每个快照的安排自动完成。有两种可用的快照类型:复杂快照(complex snapshot)和简单快照(simple snapshot)。在一个简单快照中,每一行都基于一个远程数据库表中
10、的一个行。而复杂快照的行则基于一个远程数据表的多行,例如通过一个group by操作或是基于多个表连接的结果。由于快照将在本地数据库中创建一些对象,因此,创建快照的用户必须要有CREATE TABLE权限和UNLIMITED TABLESPACE权限或存储快照对象的表空间的定额。快照在本地数据库中创建并从远程主数据库获取数据。在创建一个快照之前,首先要在本地数据库中创建一个到源数据库的链接。下面的例子创建一个名为SH_LINK的私有数据库链接 【例【例10.1】创建一个名为SH_LINK的私有数据库链接。CREATE DATABASE LINK SH_LINKCONNECT TO ADMIN
11、IDENTIFIED BY PUFFINSTUFFUSING XSCJ;10.3.1 创建快照创建快照1. 使用使用OEM创建快照创建快照如图10.1所示,选中“实体化视图”,单击鼠标左键,进入“实体化视图搜索”界面,如图10.2所示。图图10.1 Oracle企业管理器企业管理器 图图10.2实体化视图搜索界面实体化视图搜索界面10.3.1 创建快照创建快照1. 使用使用OEM创建快照创建快照单击“创建”按钮,进入“创建实体化视图”界面,如图10.3所示。 图图10.3一般信息选项页面一般信息选项页面 10.3.1 创建快照创建快照“创建实体化视图”界面有5个选项页面:一般信息、刷新、存储、
12、索引存储和选项。(1) “一般信息”选项页面:指定实体化视图的相关信息。 名称:指定实体化视图的名称。 方案:指定包含当前将要创建的实体化视图的方案。 表空间:指定Oracle在其中创建实体化视图的表空间。 为查询重写启用实体化视图(仅用于数据仓库):如启用,则表示实体化视图可用于查询重写。也就是说,查询被改写为使用概要表,而不是从表。仅用于数据仓库。 使实体化视图可以更新(仅用于高级复制):如启用,则表示当前实体化视图可更新,对实体化视图的更改将传播到目标主体站点。 从现有表创建:如果某个表的名称与另一个表的名称相匹配,而且两个表属于同一方案,则可将该表注册为预先初始化的实体化视图。若选择该
13、选项,那么就选择表。实体化视图(快照)查询可编辑的文本区域,可以在此输入用于置入实体化视图的SQL 查询。10.3.1 创建快照创建快照(2) “刷新”选项卡:切换到“刷新”选项卡界面,如图10.4所示。 图图10.4刷新选项页面刷新选项页面 10.3.1 创建快照创建快照在“刷新”选项卡指定关于实体化视图的刷新特性的信息。如果实体化视图是刷新组的一部分,通常将在刷新组中管理实体化视图的刷新特性。单独设置刷新特性可能会导致与相关的实体化视图的数据不一致问题。立即置入该实体化视图:该选项可用于实体化视图的创建,但在修改实体化视图时不可用。此选项将要求完全刷新类型选项组用于选择实体化视图所用的刷新
14、类型。“刷新类型”包括以下3项。 强制 (FORCE):指定能快速刷新则进行快速刷新,不能快速刷新则进行完全刷新。 快速 (FAST):使用最近的更改更新实体化视图。 完全 (COMPLETE):选择“完全”可全部替换实体化视图。刷新方法选项组用于选择实体化视图所用的刷新方法。 主键:选择“主关键字”,让所选实体化视图在刷新时可以使用“主关键字”。 行ID:选择“行ID”,允许所选实体化视图在刷新时使用“行(ID)”。10.3.1 创建快照创建快照注意:注意:详细资料表具有主关键字可选择“主关键字”选项;否则,“行 ID”是唯一选择。“刷新时间间隔”选项组指定Oracle如何以及何时自动刷新实
15、体化视图。修改了一个实体化视图的主体表后,必须更新实体化视图中的数据,以确保实体化视图正确地反映其主体表中的当前数据。该选项使您可以为Oracle自动刷新实体化视图设定时间并指定模式。 根据需要刷新:指定根据需要用调用三个DBMS_MVIEW过程之一的方法刷新实体化视图。 在每次提交时刷新:指定在下一次COMMIT操作时自动刷新。 限制:限制:仅对实体化联接视图和实体化聚集视图才支持该子句。 自动刷新:为自动刷新的第一个时间指定一个日期,还可以设置以后每次刷新的时间间隔间间隔。 从不:指定不执行刷新。“回退段”选项组指定所使用的回退段。 主体:输入刷新时在主体表上所用的回退段的名称。 本地:选
16、择刷新时在快照站点上所用的回退段的名称。 10.3.1 创建快照创建快照(3) “存储”选项页面:“存储”界面如图10.5所示。在该选项页面可以指定实体化视图的存储特征,具体设置请参照创建表相关的内容。图图10.5存储选项页面存储选项页面 10.3.1 创建快照创建快照(4) “索引存储”选项页面:“索引存储”界面如图10.6所示。 图图10.6索引存储选项页面索引存储选项页面 10.3.1 创建快照创建快照在“索引存储”选项页面可以进行如下设置。 不要创建实体化视图的默认索引:选择该选项,则抑制创建默认索引。您可以使用创建索引功能来明确创建其他索引。如果指定了“不在实体化视图上创建默认索引”
17、,并且要使用增量刷新方法(快速刷新)来创建实体化视图,则应该创建此类索引。 使用以下设置创建默认索引:可以为Oracle用以维护实体化视图数据的默认索引设置事务处理初始数量的值、事务处理的最大数量的值以及存储设置。Oracle使用默认索引来加快对实体化视图的增量刷新速度。若选择了“使用以下设置创建默认索引”,则可以进行以下设置:若选择“与实体化视图存储设置相同”,则使用为实体化视图存储所指定的相同设置;也可以选择“使用以下存储设置”选项来自己指定实体化视图存储设置,具体设置请参照创建表相关的内容。10.3.1 创建快照创建快照(5) “选项”选项页面:“选项”界面如图10.7所示。图图10.7
18、选项选项界面选项选项界面10.3.1 创建快照创建快照在“选项”选项界面可以进行如下设置。 并行:若选中“并行”复选框,用于创建实体化视图并以并行方式装载它。选中该选项即可指定并行执行某一操作。“并行”选项有下列2个选择:默认值:所用查询服务器的默认数量。根据CPU数和存储要并行扫描的实体化视图的“设备”数计算得出。值:用户指定的查询服务器数量。 高速缓存:确定Oracle将为实体化视图检索的块存储在缓冲区高速缓存的位置。对于将经常访问的数据,“高速缓存”选项指定:当执行全表扫描时,把为该实体化视图检索的块放置在缓冲区高速缓存中的LRU列表的最近使用的一端。 对于不经常访问的数据,不选择“高速
19、缓存”选项则指定:当执行全表扫描时,把为该实体化视图检索的块放置在缓冲区高速缓存中的LRU列表的最近最少使用的一端。单击“创建”,系统弹出创建成功提示框,然后单击“确定”完成操作。 10.3.1 创建快照创建快照2.使用使用SQL命令创建快照命令创建快照语法格式:CREATE SNAPSHOT schema.snapshot_name /*将要创建的快照名称*/PCTFEE integerPCTUSED integerINITRANS integerMAXTRANS integerSTORAGE storage_clasue/*快照的存储特征*/TABLESPACE tablespace/*指
20、定表空间*/USING INDEX PCTFEE integer /*使用索引*/PCTUSED integerINITRANS integerMAXTRANS integer REFRESH FAST | COMPLETE | FORCE START WITH date NEXT date /*指定快照的刷新特性的信息*/FOR UPDATE AS subquery /*用于置入快照的 SQL 查询*/10.3.1 创建快照创建快照2. 使用使用SQL命令创建快照命令创建快照其中:其中:schema:创建的快照的用户方案;snapshot_name:创建的快照的名称。USING INDEX:
21、维护快照数据的默认索引设置事务处理初始数量的值、事务处理的最大数量的值以及存储设置。Oracle使用默认索引来加快对快照的增量刷新速度。REFRESH:指定快照的刷新特性的信息。FAST为快速刷新;COMPLETE为完全刷新;FORCE表明为强制刷新。START WITH为自动刷新的第一个时间指定一个日期;NEXT指定自动刷新的时间间隔。 10.3.1 创建快照创建快照【例【例10.2】在本地服务器上创建快照。CREATE SNAPSHOT XS_COUNTPCTFREE 5TABLESPACE SNAPREFRESH COMPLETESTART WITH SysDateNEXT SysDat
22、e+7AS SELECT ZYM, COUNT(*) XS_COUNTFROM ADMIN.XSSH_LINKGROUP BY ZYM;注意:注意:创建一个快照时,必须引用远程数据库中的整个对象名。在上面的例子中,对象名是ADMIN.XS。 10.3.2 修改快照修改快照1. 利用利用OEM修改快照修改快照快照创建之后,可以利用OEM对其进行修改,在如图10.1所示的界面中,选择要修改的快照,单击鼠标右键,从弹出的快捷菜单中选择“查看/编辑详细资料”,激活“编辑实体化视图”窗口,在该窗口中对该快照进行修改即可。修改快照和创建快照的步骤大同小异,在此不在赘述。10.3.2 修改快照修改快照2.
23、利用利用SQL命令修改快照命令修改快照语法格式:语法格式:ALTER SNAPSHOT schema.snapshot_namePCTFEE integerPCTUSED integerINITRANS integerMAXTRANS integerSTORAGE storage_clasue/*快照的存储特征*/TABLESPACE tablespace/*指定表空间*/USING INDEX PCTFEE integer/*使用索引*/PCTUSED integerINITRANS integerMAXTRANS integer REFRESH FAST | COMPLETE | FORC
24、E START WITH date NEXT date /*指定快照的刷新特性的信息*/10.3.2 修改快照修改快照例例10.3】修改例10.2中的快照。ALTER SNAPSHOT XS_COUNTPCTFREE 10 PCTUSED 25 INITRANS 1 MAXTRANS 20;10.3.3 删除快照删除快照若要撤消一个快照,可以使用OEM或SQL命令来删除。例如,要删除XS_COUNT快照,只需在10.1所示的窗口中选择XS_COUNT,然后单击鼠标右键,从弹出的快捷菜单中选择“移去”即可。用SQL命令删除快照的语法格式为:DROP SNAPSHOT snapshotnamesn
25、apshotname为要删除的快照名称。例如,要删除XS_COUNT快照,可使用如下语句:DROP SNAPSHOT XS_COUNT;10.4序列序列 序列(sequence)定义存储在数据字典中。序列通过提供唯一数值的顺序表用来简化程序设计工作。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每一次查询中,序列将产生一个按其指定的增量增长的值。序列可以是循环的,或者是连续增加的,直到指定的最大值为止。使用一个序列时,不保证将生成一串连续不断的值。例如,如果查询一个序列的下一个值供insert使用,则该查询是能使用这个序列值的唯一会话。如果未能提交事务处理,则序列值就不被插入表中,
26、以后的insert将使用该序列随后的值。10.4.1 创建序列创建序列1. 利用利用OEM创建序列创建序列利用OEM创建序列的步骤如下:(1) 在如图10.1所示的Oracle企业管理界面中,选中“序列”,单击鼠标左键,进入“序列搜索”界面,如图10.8所示。图图10.8序列浏览编辑界面序列浏览编辑界面 10.4.1 创建序列创建序列(2) 单击“创建”按钮,进入“创建序列”界面,如图10.9所示。 图图10.9创建序列界面创建序列界面 10.4.1 创建序列创建序列在如图10.9所示的“创建序列”界面设置新序列的信息。“创建序列”界面包含以下信息。 “一般信息”选项组包含以下信息。名称:待定
27、义的序列的名称。序列的名称必须是一个有效的Oracle标识符。方案:在方案文本框输入该序列的方案,也可以通过“手电筒”形状的按钮打开“方案选择”界面选择方案。新序列的默认方案就是登录用户。序列类型:可以为序列定义如下类型:升序:若选中该选项,序列值自初始值向最大值递增。这是创建序列时的默认设置。降序:若选中该选项,序列值自初始值向最小值递减。 “值”选项组包含以下信息。最小值:序列可允许的最小值。创建序列时,该字段最初为空。如果创建序列该字段为空,则对升序序列将使用默认值1,而对降序序列使用默认值-1.0E28(-10的28次方)。最大值:序列可允许的最大值。创建序列时,该字段最初为空。如果选
28、中“创建”按钮后该字段为空,则将对升序序列使用默认值1.0E27(10的27次方),而对降序序列使用默认值-1。时间间隔:序列递增、递减的间隔数值 (升序序列)。创建序列时,该字段最初为空。如果选中“创建”按钮后该字段为空,将使用默认值1。该字段只能为正整数。初始值:序列的起始值。如果选中“创建”按钮后该字段为空,对升序序列将使用该序列默认的最小值。对降序序列,将使用该序列默认的最大值。 10.4.1 创建序列创建序列 “选项” 选项组可选择的设置为:循环值:选中此选项,即指定在达到序列最小值或最大值之后,序列应继续生成值。对升序序列来说,在达到最大值后将生成最小值。对降序序列来说,在达到最小
29、值后将生成最大值。如果未选中“循环值”,序列将在达到最小值或最大值后停止生成任何值。创建序列时,该复选框在默认情况下是未选中状态。排序值:选中该选项,即指定序列号要按请求次序生成。创建序列时,该复选框在默认情况下是未选中状态。 高速缓存选项组。若勾选该选项,需要设置高速缓存大小。默认值为 20。也可以指定值,可接受的最小值为2。对循环序列来说,该值必须小于循环中值的个数。如果序列能够生成的值数的上限小于高速缓存大小,则高速缓存大小将自动改换为该上限数。默认情况下选中此选项。如果没有勾选该选项,则指定不预分配序列值。(3) 单击“确定”按钮,系统创建序列。创建成功后返回到图10.8所示界面,此时
30、可看见序列S_XH。10.4.1 创建序列创建序列2. 利用利用SQL命令创建序列命令创建序列也可以使用SQL命令创建序列。语法格式为:CREATE SEQUENCE schema. sequence_name /*将要创建的序列名称*/INCREMENT BY integer/*递增或递减值*/START WITH integer/*初始值*/MAXVALUE integer | NOMAXVALUE/*最大值*/MINVALUE integer | NOMINVALUE/*最小值*/CYCLE | NOCYCLE/*是否循环*/CACHE integer | NOCACHE/*高速缓冲区设
31、置*/ORDER | NOORDER/*序列号是序列否按照次序生成*/10.4.1 创建序列创建序列2. 利用利用SQL命令创建序列命令创建序列其中:其中:INCREMENT BY:指定序列递增或递减的间隔数值。Integer只能为正值。START WITH:序列的起始值。若不指定该值,对升序序列将使用该序列默认的最小值。对降序序列,将使用该序列默认的最大值。MAXVALUE:序列可允许的最大值。若指定为NOMAXVALUE,则将对升序序列使用默认值1.0E28(-10的28次方),而对降序序列使用默认值-1。MINVALUE:序列可允许的最小值。若指定为NOMINVALUE,则对升序序列将使
32、用默认值 1,而对降序序列使用默认值1.0E28(-10的28次方)。CYCLE:指定在达到序列最小值或最大值之后,序列应继续生成值。对升序序列来说,在达到最大值后将生成最小值。对降序序列来说,在达到最小值后将生成最大值。若指定为NOCYCLE,则序列将在达到最小值或最大值后停止生成任何值。CACHE:由数据库预分配并存储的值的数目。默认值为20;也可以指定值,可接受的最小值为2。对循环序列来说,该值必须小于循环中值的个数。如果序列能够生成的值数的上限小于高速缓存大小,则高速缓存大小将自动改换为该上限数。若指定为NOORDER,则指定不预分配序列值。 10.4.1 创建序列创建序列【例【例10
33、.4】创建一个降序序列。CREATE SEQUENCE ADMIN. S_TEST INCREMENT BY -2 START WITH 4500 MAXVALUE 4500 MINVALUE 1 CYCLE CACHE 20 NOORDER;10.4.2 修改序列修改序列 1. 利用利用OEM修改序列修改序列序列创建之后,可以利用OEM对其进行修改,在如图10.8所示的界面中,选择要修改的序列,单击“编辑”按钮,进入“编辑序列”界面,在该界面中对该快照进行修改即可。修改序列和创建序列的步骤大同小异,在此不在赘述。 2. 利用利用SQL命令修改序列命令修改序列语法格式:语法格式:ALTER S
34、EQUENCE schema.sequence_nameINCREMENT BY integer/*递增或递减值*/MAXVALUE integer | NOMAXVALUE/*最大值*/MINVALUE integer | NOMINVALUE/*最小值*/CYCLE | NOCYCLE/*是否循环*/CACHE integer | NOCACHE/*高速缓冲区设置*/ORDER | NOORDER10.4.2 修改序列修改序列【例【例10.5】修改例10.4中序列。ALTER SEQUENCE ADMIN. S_TEST INCREMENT BY -1 MAXVALUE 9000 MINVALUE 4500 NOORDER;10.4.3 删除序列删除序列既可以在OEM中删除序列,也可以利用SQL命令删除序列。若要在OEM中删除序列,则在如图10.7所示的界面中,选择要删除的序列,单击鼠标右键,从弹出的快捷菜单中选择“移去”即可。用SQL命令删除快照的语法格式为:DROP SEQUENCE sequence_namesequence_name为要删除的序列名称。例如,要删除S_TEST序列,可使用如下语句:DROP SEQUENCE S_TEST;结束结束