Oracle杂谈一 Oracle数据库的一些基本概念
刚接触ORACLE的人肯定会对实例和数据库感到困惑,实例到底代表些什么?为什么会有这个概念的出现?
ORACLE实例 = 进程 + 进程所使用的内存(SGA)实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态!
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件数据库是永久的,是一个文件的集合。
ORACLE实例和数据库之间的关系
1.临时性和永久性
2.实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
3.一个实例在其生存期内只能装载(alterdatabase mount)和打开(alter database open)一个数据库
4.一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分的体现!
oracle LOB介绍
发信人: oracle_mo(洗洗睡了... ..)
 整理人: zrsoft(2001-11-05 21:43:17), 站内信件  
 0、LARGE OBJECT   
 ORACLE8中有4种LOB  
 - BLOB:Binary Large Object  
 - CLOB:Character Large Object  
 - NCLOB:固定长度的多字节Character Large Object  
 - BFILE:DB外部的二进制文件  
 它们分为两类:  
 内部LOB:存放在DB内部,包括BLOB,CLOB,BCLOB  
 外部文件:存放在DB外面,就是BFILE  
 
 要注意的是ORACLE8不自动转换这些类型的数据。  
 
 1、LONG和LOB的比较  
 LONG/LONG RAW LOB  
 --------------------------------------------------  
 表中只能由一个列 可以有多列  
 最大2G 最大4G  
 SELECT返回值 SELECT返回指针  
 存放在DB内 可以在DB的内或者外  
 不支持OBJECT类型 支持  
 顺序存取 随机存取  
 --------------------------------------------------  
 
 NCLOB不支持OBJECT类型  
 LOB小于4000字节时是内部存放  
 
 2、LOB解析  
 LOB有两个不同的部分  
 - LOB值:LOB代表的数据  
 - LOB指针:LOB存放数据的位置  
 LOB列内部不存放数据,而是LOB值的位置。当创建内部LOB时,值存放在LOB SEGMENT中,指向OUT-OF-LIN数据的指针放在列中。对外部LOB,只在列中存放位置。  
 
 3、内部LOB  
 就是存放在DB内部的LOB,包括BLOB,CLOB,NCLOB。它们可以是  
 用户自定义的类型中的属性  
 表中某列  
 SQL 变量  
 程序host变量  
 PL/SQL中的变量、参数、返回值  
 
 内部LOB可以使用ORACLE的并发机制、REDO LOG、RECOVERY机制。  
 BLOB被ORACLE8解释为二进制位流,类似LONG RAW。  
 CLOB解释为单字节字符流  
 NCLOB是固定的多字节字符流,基于DB NATIONAL字符集的字节长度。  
 
 例子:  
 CREATE TYPE picture_typ AS OBJECT (image BLOB);  
 
 CREATE TABLE person_tab  
 ( pname VARCHAR2(20),  
   RESUME CLOB,  
   picture picture_typ  
 );  
 
 上面的语句完成后,数据将存放在5个物理SEGMENT中。  
 - TABLE person_tab在缺省TABLESPACE,  
 - RESUME存放的LOB SEGMENT   
 - PICTURE存放的LOB SEGMENT  
 - 标示RESUME存放位置的LOB INDEXSEGMENT  
 - 标示PICTURE存放位置的LOB INDEXSEGMENT  
 LOB INDEX是隐式创建的。  
 
 当INSERT或者OBJECT CACHE中的OBJECT刷新到SERVER时,LOB生成。可以使用DBMS_LOB包和OCI来处理LOB。当ROW删除时,相应的内部LOB也会删除。UPDATE必须处理整个LOB值,不能UPDATE其中的一部分。  
 
 4、内部LOB的存储参数  
 具体语法可以参见ORACLE文档,  
 LOB ( lob项,...) STORE ASlob_segment_name   
 CHUNK integer  
 PCTVERSION integer  
 CACHE  
 NOCACHE LOGGING/NOLOGGING  
 TABLESPACE tablespace_name  
 STORAGE storage子句  
 INDEX INDEX字句  
 
 lob_segment_name:缺省式LOB$n  
 CHUNK:连续分配在一起的BLOCK数目,存放连续的LOB数据。这些CHUNK的数据存放在LOB INDEX里面,使用内部LOB标示和LOB值作为键。  
 PCTVERSION:LOB一致读需要的系统空间。一旦LOB申请超过PCTVERSION的值,ORACLE就会收旧的空间并REUSE之。  
 CACHE:使用SGA区的DB BUFFER CACHE处理LOB的READ/WRITE。  
 NOCACHE LOGGING:不使用SGA区的BUFFER,数据的改变纪录到REDO LOG。  
   存取LOB比较频繁时,使用CACHE  
     存取LOB不频繁时,使用NOCACHE  
 NOCACHE NOLOGGING:不使用SGA区的BUFFER和REDO LOG  
     
 INDEX子句  
 INDEX  lob_index_segtment_name   
 INITTRANS integer  
 MAXTRANS integer  
 TABLESPACE tablespace_name  
 STORAGE storage子句  
 
 如果没有设置LOB存储参数和INDEX STROAGE,则采用如下缺省值  
 CHUNK=1 DB_BLOCK  
 PCTVERSION=10  
 NOCACHE  
 NOLOGGING  
 
 例子:  
 CREATE TABLE APARTMENTS (   
 floor_plan BLOB,  
 contract  CLOB,  
 name VARCHAR2(10))  
 LOB (floor_plan, contract)STORAGE AS(  
 STORAGE (INITIAL 100K NEXT 100K PCTINCREASE 0)  
 CHUNK 10  
 PCTVERSION 20  
 NOCACHE  
 NOLOGGING  
 INDEX (INITIAL 100K NEXT 100K)  
 );  
 
 5、内部LOB的并发  
 LOB的读一致和其他ORACLE类型一样,但是它是在CHUNK级别上作VERSION的。  
 
 6、外部LOB  
 ORACLE8允许定义BFILE类型,可以把外部文件和BFILE对象连接起来,同时能提供BFILE的安全机制。  
 BFILE对处理不需要transaction控制的OS文件很有用处。  
 对BFILE的处理需要DBMS_LOB或者OCI。  
 BFILE必须是READ-ONLY的,文件应该放在ORACLE能存取的地方。如果删除BFILE对象,外部文件并不删除。  
 例子:  
 CREATE TABLE home_page(  
 EMPLOYEE REF EMPLOYEE_TYP,  
 LAST_UPDATE DATE,  
 HOMEPAGE BFILE);  
 
 CREATE TYPE personal_info_typ AS OBJECT   
 ( EMPLOYEE REF employee_typ,  
 PICTURE BFILE,  
 THUMBPRINT BFILE,  
 REINAPRINT BFILE  
 );  
 
 其实在BFILE对应的列或者属性中存放的是BFILE的位置,即是物理文件的位置。  
 读BFILE不通过SGA.  
 
 7、BFILE的安全  
 ORACLE8提供安全机制。文件必须和DB在一台机器上,读取不存在文件的timeout由os决定。可以和内部LOB的读取方法一致,但是必须注意:文件的权限、文件系统空间限制、其他对文件的维护、OS允许的最大文件大小。  
 ORACLE8不对BFILE采取TRANSACTION的支持,ORACLE的BACKUO和RECOVERY也不支持BFILE。  
 
 
 8、目录DIRECTORY  
 这是ORACLE为了管理BFILE引入的新元素,它指定SERVER文件系统的目录,可以把文件系统的目录抽象为数据库对象,更具有灵活性。  
 DIRECTORY由DBA建立,系统用户拥有,通过GRANT/REVOKE来确定哪些用户有权限。  
 
 CREATE OR REPLACE DIRECTORY 目录名 AS 路径名  
 DROP DIRECTORY 目录名  
 
 存取BFILE在如下情况时候产生异常:  
 -用户没有操作DIRECTORY的权限  
 -DIRECTORY所对应的物理目录不存在,或者没有存取该目录的权限。  
 -文件不存在  
 
 文件和权限的检查是在文件存取时候检查的,创建时候并不报错。  
 不支持逻辑路径  
 
 系统新增加了CREATE ANY DIRECTORY和DROP  ANYDIRECTORY。对DIRECTORY授权只有READ。  
 
 对CREATE DIRECTORY和GRANT READ ONDIRECTORY是可以AUDIT的。  
 
 8、DIRECTORY建立的原则  
 DIRECTORY不要和DB DATAFILE在相同的目录下。  
 要有选择的赋予CREATE ANY DIRECTORY和DROPANY DIRECTORY ROLE。  
 在建立之前要在OS级别上设置权限。  
 如果移植DB到其他机器,需要注意DIRECTORY的路径是否改变。  
 
 9、管理LOB  
 ORACLE 通类似文件操作一样的接口:DBMS_LOB, OCI8。同时还有SQL语句的一些支持。  
 管理LOB的一般方法:  
 1)CREATE/POPULATE 包含LOB的TABLE,  
 2)在程序中DECLARE AND INITIALIZE LOB Locator  
 3)用SELECT FOR UPDATE 锁定包含LOB的ROW,  
 4)用DBMS_LOB或者OCI维护相关LOB值  
 5)COMMIT  
 
 管理BFILE的一般方法  
 1)建立OS目录,授予ORACLE 用户READ的权限  
 2)把文件放到该目录  
 3)建立包含BFILE的TABLE  
 4)建立DIRECTORY,用GRANT授权  
 5)在TABLE中INSERT与文件相关的值  
 6)在程序中声明LOB Locator  
 7)取得包含LOB Locator的行  
 8)用DBMS_LOB和OCI读取BFILE  
 
 10、LOB的操作  
 可以用SQL、PL/SQL、3GL中嵌入式SQL或者OCI中的变量值直接INSERT 到LOB中。  
 
 可以用其他的LOB、NULL或者EMPTY_CLOB()/EMPTY_BLOB()的值UPDATE LOB。当把一个LOB赋给另一个时,其实是新建了一个LOB。这些操作不需要SELECT FOR UPDATE。只有在更新LOB的其中一部分的时候才需要先LOCK。  
 ORACLE8不会自动转换CLOB和BLOB。  
 最好的办法是OCILobWrite,以为它使用ORACLE的流机制,最快、使用更好的空间和REDO。  
 
 删除LOB的方法  
 DELETE ....  
 TRUNCATE TABLE....  
 DROP TABLE ...  
 删除后注意在OS级别上删除相关文件。  
 如果只是要去掉LOB的Locator,可以用NULL或者空字符串''来UPDATE。  
 
 11、DBMS_LOB包  
 DBMS_LOB包用SYS用户提交DBMSLOB.SQL和PRVTLOB.PLB脚本。它们包含在CATPROC.SQL中。用户要授权才能使用它。匿名BLOCK中的DBMS_LOB例程使用当前用户的权限。STORED PROCEDURE中的DBMS_LOB调用使用其所有者的权限。  
 它不支持BFILE的并发控制机制。  
 你必须控制LOB的LOCK,DBMS_LOB不会隐式的LOCK LOB所在的ROW。  
 DBMS_LOB.LOBMAXSIZE = 4G  
 
 包含两类操作  
 1)APPEND、COPY,EARSE,TRIM,WRITE,FILECLOSE,FILECLOSEALL,FILEOPEN,LOADFROMFILE  
 2)COMPARE,FILEGETNAME.INSTR,GETLENGTH,READ,SUBSTR,FILEEXISTS,FILEISOPEN  
 
 DBMS_LOB的任何参数为NULL,则返回值为NULL.  
 如果目标LOB/BFILE=NULL,将触发异常。  
 BLOB/BFILE的OFFSET以BYTE为单位,CLOB/NCLOB以字符为单位。且不能为负值,否则会触发异常。缺省OFFSET为1。  
 参数不能为负值。  
 
 PROCEDURE APPEND(DEST_LOB, SRC_LOB);  
 把一个LOB加到另一个LOB中。  
 FUNCTION COMPARE(L1, L2, AMOUNT, OFFSET1,OFFSET2)  
   =0  ,相同  
 =-1,第一个小  
 =1,第一个大  
 
 12、系统管理方面的问题  
 EXPORT/IMPORT支持LIBRARY和DIRECTORY,支持LOB。  
 IMPORT转换EXPORT文件中的CLOB到当前缺省的字符集。NCLOB转换到当前Nationanl字符集。BLOB不转换。  
 BFILE不能EXP/IMP。只有BFILE的名字和DIRECTORY被EXPORT出来。
文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。
原文链接:aaaedu.blog.csdn.net/article/details/51447237
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)