Oracle杂谈一 Oracle数据库的一些基本概念

简介: Oracle杂谈一 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出来。


目录
相关文章
|
16天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
62 11
|
29天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
1月前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
22天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
54 7
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
18 3
|
3天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
22 2
|
16天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
115 15
|
10天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。

推荐镜像

更多