数据块(data block)
Oracle的数据块也叫Oracle块;l Oracle系统在创建表空间时将数据文件格式化成若干个Oracle块;
每个Oracle块是Oracle系统处理的最小单位;
块的大小在安装系统时确定,可以选择“自定义安装”来设置大小;
块的大小一旦确定下来就不能改动;
块的大小可以从2k至64k不等;l 块的大小可以用下面命令查到:
select name,value from v$parameter where name like 'db_block_size';
2.5.2 区间(extent)
分配给对象(如表)的任何连续块叫区间;l 区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);l 区间的大小由 next 决定;l 一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象;l 一个对象所用去多少区间可用下命令查到:
select segment_name,tablespace_name,count(*) from dba_extents having count(*)>;1 group by segment_name,tablespace_name;
2.5.3 段(segment)
段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;l 段可以有表段、索引段、回滚段、临时段和高速缓存段等;l 段使用同表空间中的若干Oracle块(可以位于不同数据文件中)。
例:CREATE TABLE abc ( empno number(4),ename varchar2(20),sal number(9,2))
TABLESPACE user_data storage(initial 500k next 256k pctincrease 0);
1) 段被分配=初始区间=500k;2) 当开始的500k用完后就再分配256k;此时段=500k+256k;3) 如果所分配的区间又用完后,就再分配256k, …
段(segment)、区间(extent)及块的关系(seg_ext_block)
2.6 Oracle数据库进程一般情况,当数据库启动完成后(Instance 启动成功)就至少有六个后台进程在活动,这些进程根据数据库的需要而分工不同。他们分别是:
1)数据库写入器(DBWR)
数据库写入器(Database Writer)的任务是将修改后的(在内存)数据块写回数据库文件中。在某些操作系统中,Oracle可以有两个BDWR进程。
2)校验点(CKPT)
是一个可选进程。在系统运行中当出现查找数据请求时,系统从数据库中找出这些数据并存入内存区,这样用户就可以对这些内存区数据进行修改等。当需要对被修改的数据写回数据文件时就产生重做日志的交替写(Switch),这时就出现校验点。系统要把内存中灰数据(修改过)块中的信息写回磁盘的数据文件中,此外系统还将重做日志通知控制文件。DBA可以改变参数文件中CHECKPOINT_PROCESS TRUE来使能(使有效或无效)该进程。
3)日志写入器(LGWR)
用于将SGA区中的日志信息写入日志文件的进程。一般是用户所作的修改值先记入日志文件。等到一定时才真正将修改结果写回数据文件。
4)系统监控器(SMON)
系统监控器(System monitor)是在数据库系统启动时执行恢复工作的强制性进程。比如在并行服务器模式下(两台服务器共用一磁盘组),SMON可以恢复另一台处于失败的数据库。使系统切换到另一台正常的服务器上。
5)进程监控器(PMON)
进程监控器(Process Monitor)用于终止那些失败的用户,释放该用户所占用的资源等。
6)归档器(ARCH)
可选进程,当数据库系统处于归档(ARCHIVELOG)模式时使用。
7)锁(LCKn)
可选进程,当在并行服务器模式可出现多个锁定进程以利于数据库通信。
恢复器(RDCO)
分布式数据库(不同地点有不同机器和不同的Oracle系统)模式下使用的可选进程,用于数据不一致时作的恢复工作。在RECO解决恢复前,所作的修改数据的标志均标为“可疑”。
9)调度(Dnnn)
可选进程,在多线程下使用,即对每个在用(D000,……,Dnnn)的通信协议至少创建一个调度进程,每个调度进程负责从所联接的用户进程到可用服务器进程的路由请求。把响应返回给合适的用户进程。
10)快照进程(SNPn)
快照进程处理数据库快照的自动刷新,并通过 DBMS_JOB 包运行预定的数据库过程。 INITsid.ORA 参数 JOB_QUEUE_PROCESS 设置快照进程数, 参数 JOB_QUEUE_INTERVAL 决定快照进程在被唤醒以处理挂起的作业或事务之前休眠的秒数。
11)并行查询进程(Pnnn)
可根据数据库的活动并行查询选项的设置,ORACLE服务器起动或停止查询进程。这些进程涉及并行索引的创建,表的创建及查询。启动的数量与参数 PARALLEL_MIN_SERVERS指定的数量相同,不能超出该参数指定的值。
2.7 Oracle内存结构前面提到过Oracle的数据库实例是一组后台进程和内存结构组成。而内存结构是包括:
系统全局区(System Global Area)
程序全局区(Program Global Area)
2.7.1 系统全局区Oracle 系统用于存放系统信息的一块存储区域,用户进程和Oracle后台进程都可以使用SGA.在SGA中含有许多组件(不同的部分)。
数据高速缓冲区(Data Buffer Cache)
在数据高速缓冲区中存放着Oracle系统最近使用过的数据块(即用户的高速缓冲区),当把数据写入数据库时,它以数据块为单位进行读写,当数据高速缓冲区填满时,则系统自动去掉一些不常被用访问的数据。如果用户要查的数据不在数据高速缓冲区时,Oracle自动从磁盘中去读取。数据高速缓冲区包括三个类型的区:
1) 脏的区(Dirty Buffers):包含有已经改变过并需要写回数据文件的数据块。
2) 自由区(Free Buffers):没有包含任何数据并可以再写入的区,Oracle可以从数据文件读数据块该区。
3)保留区(Pinned Buffers):此区包含有正在处理的或者明确保留用作将来用的区。
Oracle8i以后将缓冲池分为三个区(使用多个缓冲池特性时):1) KEEP 缓冲池(KEEP buffer pool):在内存中保留数据块,它们不会被从内存中挤掉;2) RECYCLE缓冲池从不需要的内存将数据移掉;3) DEFAULT缓冲池包含有被分配的块。
重做日志缓冲区(Rado Log Buffer)
任何事务(Transaction)在记录到重做日志(恢复工作需要使用联机重做日志)之前都必须首先放到重做日志缓冲区(Redo Log Buffer)中。然后由日志写入进程(LGWR)定期将此缓冲区的内容写入重做日志中。
共享池(Shared Pool)
共享池是SGA保留的区,用于存储如SQL、PL/SQL存储过程及包、数据字典、锁、字符集信息、安全属性等。共享池包含有:1)库高速缓存(Library Cache);2) 字典高速缓冲区(Dictionary Cache )。
库高速缓存(Library Cache)
该区包含有:1)共享SQL区(Shared Pool Area);2) 私有SQL区(Private SQL Area);3) PL/SQL存储过程及包(PL/SQL Procedure and Package);4) 控制结构(Control Structure)。
也就是说该区存放有经过语法分析并且正确的SQL语句,并随时都准备被执行。
字典高速缓冲区(Data Dictionary Cache)
用于存放Oracle系统管理自身需要的所有信息,这些信息是登录到Oracle的用户名,这些用户有那些数据库对象以及这些数据库对象的位置等。
SVRMGR>; Show SGA Total System Global Area 35544188 bytes Fixed Size 22208 bytes Variable Size 3376332 bytes Database Buffer 122880 bytes Redo Buffer 32768 bytes
后四项相加等于前一项。
也可以使用 select * from v$SGA; 查询当前实例的SGA.
大的池(Large Pool)
在SGA中大池是可选的缓冲区。它可以根据需要有管理权进行配置。它可以提供一个大的区以供象数据库的备份与恢复等操作。
2)程序全局区(PGA)
PGA是Oracle使用的内存区域,该区同一时间只能被一单个进程存放数据和控制,用于存放会话变量及内部数组等。
SGA Oracle内存结构(SGA图)
2.7.2 程序全局区PGA是Oracle使用的内存区域,该区同一时间只能被一单个进程存放数据和控制,用于存放会话变量及内部数组等。
2.8 Oracle实例一个Oracle 实例(Instance)是由SGA,后台进程以及数据文件组成,每个数据库有自己的SGA和独立的Oracle进程集。如图所示:
Oracle 实例和后台进程(instance图)
在分布情况下,为使不同的数据库系统的名字不致混淆,Oracle使用了一个SID(System Identifer)来标识每个Oracle Server的名字,在UNIX环境中以变量Oracle_Sid来区分。
2.9 多线程服务器 (MTS)
Oracle多线程服务器(Multithreader Server )允许对数据库进行多个连接以充分共享内存和资源,这使得可以用较少的内存来支持较多的用户。
连接到Oracle数据库的进程都需要占用一定的内存空间,这样如果有过多的进程连接到Oracle,则出现了一个性能瓶颈。
Oracle8可以允许一万个以上用户同时连接到Oracle,但并不是所有的用户都使用MTS.目前的一些4GL工具并不支持MTS,象VB,PB等不支持MTS,象VC/可以支持MTS. Oracle多线程服务器有自己的连接池(即共享服务器进程)。由于用户共享开放连接,这比原来的专用方法快的多(消除瓶颈)。
多线程对于一些专用的应用系统来说是非常合适的,比如订单登记系统,顾客提交订单,录入员该订单的数据;另外的录入员在与顾客交涉,并不都在录入数据(专用服务器进程闲着)。单这些终端被迫与系统连着,占据了其他用户的资源。
多线程服务器则消除这些缺点。多线程服务器只维护一个连接池,当某个终端需和系统对话则给其分配一个连接即可。不需要则可以去掉。这样系统的资源被多个用户平摊。
改变参数文件中的相关参数来达到使系统成为多线程服务器配置(重新启动即可有效)。另外,数据库实例必须提供用户数目与所放置的一样才行。
2.10 Oracle事务处理流程银行取款业务处理流程:
1. 发出查询余款的SQL语句,如:Select account_balance From banktable Where account_number='111222333' And account_type='SAVINGS';
SQL语句通过SGA得到服务器进程;
服务器进程检查共享池中有无该条语句,无该条语句则将放置共享池中并准备运行;
执行SQL语句,把存放有余款的数据块从数据文件中读到SGA的数据高速缓冲区;
显示结果,比如余款为$325.
2. 取款$25:SQL语句为:Update Bank_table set account_balanct=300 Where account_number='111222333' And account_type='SAVINGS';
客户进程通过SGA把SQL语句传给服务器进程;l 服务器进程查找有无该条语句,有执行(;l 分析SQL语句并存入共享池;l 执行SQL语句;
要处理的数据在数据高速缓冲区吗?是转7;
从数据文件中读数据块到数据高速缓冲区;
在回滚段中记录原来的数值($325);
在重做日志中生成该事务的一个拷贝;
将数据高速缓冲区中的余额改为$300;
银行柜员机通过SGA发出工作完成信号(提交):
在重做日志中记录已完成事务;
清除回滚段中的恢复信息(Undo Information);
顾客取钱完成。
2.11 ORACLE系统的SYS和SYSTEM模式SYS和SYSTEM 是每个ORACLE 数据库系统缺省安装的两个帐户。SYS 是所有内部数据库表、结构、过程包、等拥有者,此外它还拥有 V$ 和数据字典视图,并创建所有封装的数据库角色(DBA,CONNECT,RESOURCE)。 Sys是一个唯一能访问特定内部数据字典的用户。 System 也是在安装ORACLE 时创建的用户,用于 DBA 任务的管理。
SYS 安装后的缺省口令为 change_on_install; SYSTEM 缺省口令为 manager. 为了安全,可在安装完成后。 用 ALTER USER sys IDENTIFIED BY password;命令修改这两个特权帐户的口令。
2.12 ORACLE系统跟踪文件所有ORACLE 数据库都至少有一个文件用于记录系统信息,错误及主要事件。这个文件叫做ALERTsid.log(这里的sid 为 oracle 的系统标识),存储位置由INITsid.ORA 文件的 BACKGROUND_DUMP_DEST 参数给出。
后台进程和用户进程都可以建立各自的跟踪文件,后台进程跟踪文件位置由BACKGROUND_DUMP_DEST 参数给出,而用户跟踪文件位置由 USER_DUMP_DEST 参数给出。 如参数文件 initora8.ora 中给出:
# define directories to store trace and alert files background_dump_dest=d:\oracle\admin\ora8\bdump user_dump_dest=d:\oracle\admin\ora8\udump后台跟踪文件被命名为 sidPROC.TRC
2.13 ORACLE系统数据字典数据字典(data dictionary)是存储在数据库中的所有对象信息的知识库,ORACLE数据库系统使用数据字典获取对象信息和安全信息,而用户和DBA用它来查阅数据库信息。数据字典保存数据对象和段的信息。如表、视图、索引、包、过程以及用户、权限、角色、审计等的信息。数据字典是只读对象,不允许任何人对其进行修改。
2.14 其它数据对象ORACLE 除前面给出的数据对象外,还有包括视图,序列,同义词,触发器,数据库链及程序包,过程和函数。下面是必要介绍。
2.14.1 视图视图是存储在数据库中的查询的SQL 语句,它主要出于两种主要原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
2.14.2 序列序列是用于产生唯一数码的数据库对象,序列创建时带有初始值,增量值,最大值等,最大可达38 位整数。
2.14.3 触发器触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
2.14.4 同义词同义词(synonym)是指向其它数据库表的数据库指针。同义词有两种类型:私有(private)和公共(public)。私有的同义词是在指定的模式中创建并且只创建者使用的模式访问。公共同义词是由public 指定的模式访问,所有数据库模式(用户)都可以访问它。
2.14.5 数据库链数据库链( database link )是与远程数据库连接的存储定义,它们用于查询分布数据库环境的远程者。 由于存储在 DBA_DB_LINKS 数据字典中,所以可以把它们看作一种数据库对象类型。