Oralce 8i 的体系结构
一、Oracle server
Oracle server 由Oracle的实例(Instance)和数据库(Database)两部分构成。一般情况下,在一个Server中,一个Database 对应一个Instance,但是在Oracle 8I中的OPS,Oracle 9I的中RAC中,一个Database可以对应一个以上的Instance。
Database:指的是一系列的物理文件的集合(包括控制文件、数据文件、联机日志文件、密码文件、参数文件、归档文件)。即一系列与磁盘有关的物理文件。
Instance:指Oracle和内存结构和后台进程。
二、Oracle的内存结构(Memory Structure)
Memory Structure包括共享内存(SGA:systme global area)和非共享内存(PGA: program global area)。
(1) PGA (program global area)
包括:Sort area,Session info, Stack Space。
PGA是用户连接进程在本地创建的一块内存区,其它进程不能访问。
UGA(user global area)实际是会话的状态,是会话必须始终能得到的内存。专用服务器,该内存在PGA中分配,对于MTS连接方式,该内存在Large pool中分配。
可以用下面的方法查看PGA明细:
SQL> select * from v$pgastat;
NAME VALUE UNIT
------------------------------ ---------- ------------
aggregate PGA target parameter 16777216 bytes
aggregate PGA auto target 4194304 bytes
global memory bound 838656 bytes
total PGA inuse 14253056 bytes
total PGA allocated 17117184 bytes
maximum PGA allocated 17117184 bytes
total freeable PGA memory 0 bytes
PGA memory freed back to OS 0 bytes
total PGA used for auto workar 0 bytes
eas
maximum PGA used for auto work 0 bytes
areas
total PGA used for manual work 0 bytes
areas
maximum PGA used for manual wo 0 bytes
rkareas
over allocation count 246
bytes processed 5251072 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent
已选择16行。
(2)SGA
包括:Data buffer cache(Keep, default, Recycle),database buffer cache,Redo buffer,Shared pool(Libray Cache[libray cache,pl/sql and packages,lock and others structures],data dictionary cache, control sturctures),larger pool,java pool.
可以用以下的方法查询SGA的大小:
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 453252
Variable Size 46137344
Database Buffers 37748736
Redo Buffers 667648
SGA的明细信息:
SQL> select * from v$sgastat;
POOL NAME BYTES
----------- -------------------------- ----------
fixed_sga 453252
buffer_cache 37748736
log_buffer 656384
shared pool krvxrr 126528
shared pool enqueue 171860
shared pool DML lock 100408
shared pool KGK heap 3756
shared pool KQR M PO 135696
shared pool KQR S PO 14336
shared pool sessions 410720
shared pool sql area 621332
shared pool 1M buffer 2098176
shared pool KGLS heap 263844
shared pool processes 144000
shared pool db_handles 108000
shared pool kglsim sga 136104
shared pool free memory 19963104
shared pool FileOpenBlock 695504
shared pool library cache 1577312
shared pool miscellaneous 3215452
shared pool MTTR advisory 4220
shared pool PLS non-lib hp 2068
shared pool joxs heap init 4220
shared pool kgl simulator 562000
shared pool sim memory hea 12692
shared pool table definiti 56
shared pool trigger defini 468
shared pool trigger inform 432
shared pool trigger source 100
shared pool Checkpoint queue 282304
shared pool dictionary cache 1610880
shared pool ksm_file2sga region 148652
shared pool KSXR receive buffers 1033000
shared pool character set memory 143280
shared pool character set object 274508
shared pool FileIdentificatonBlock 323292
shared pool KSXR large reply queue 166104
shared pool message pool freequeue 834752
shared pool KSXR pending messages que 841036
shared pool event statistics per sess 1718360
shared pool fixed allocation callback 180
large pool free memory 8388608
另外,也可以
SQL> select * from v$buffer_pool;
ID NAME BLOCK_SIZE RESIZE_STA CURRENT_SIZE BUFFERS TARGET_SIZE TARGET_BUFFERS
---------- ------------------------------ ---------- ---------- ------------ ---------- -----------
PREV_SIZE PREV_BUFFERS LO_BNUM HI_BNUM LO_SETID HI_SETID SET_COUNT
---------- ------------ ---------- ---------- ---------- ---------- ----------
3 DEFAULT 16384 STATIC 36 2277 36 2277
0 0 0 0 3 3 1
(3)共享池(shared pool)
共享池太小时,性能会受到严重的影响,但是共享池太大,将花费太多的CPU来管理共享池。
主要有以下两部分构成:
第一、 SQL语句缓冲(library cache)
用户提交一个SQL语句时,首先要进行解析(Parse),Oracle会把解的结果存放在shared pool 的library cache,在第二次执行该语句时,不再解析,直接利用上次执行的结果,这样可以避免再次解。这也是第一次运行SQL语句比第二次运行相同的语句要快一些的原因。
使用
SQL> alter system flush shared_pool;
系统已更改。
可以清空共享池。
也可以用
SQL> select * from v$sqlarea;
和
SQL> select * from v$sqltext;
查询已解析的SQL语句。
要提高 Sharee_pool 的利用率,首先要使用变量Bind的方法书写SQL。
第二、 数据字典缓冲区(data dictionary cache):
Oracle 内部数据字典缓冲区。没有别的用处。
第三、 块缓冲区(database buffer cache):
所有数据都可以在这里缓冲。在这里,不再区数据文件、临时数据文件、回滚段文件等,只要是需要缓冲的,都可以存放到这里。
所有的块,使用两种列表来管理:
(1) 脏表(dirty list):最后由DBWR写入到磁盘。
(2) 不脏表(LRU list):使用最近最少使用算法(LRU:Least Recently used)来管理。
Database buffer cache可以划分成以下三种类型:
(1) Keep pool
(2) Defualt pool (Oracle 默认,但是可以通过 init.ora来更改)
(3) Recycle pool
由于操作系统的限制,如果不特殊设置,在32Bit的系统上,database buffer cache 最大可以达到1.7G。在64bit 的系统上,可以达到10G。
(4) 重做日志缓冲区(redo log buffer):
数据库的所有修改,都是按顺序写进redo log buffer.达到一定的条件时,由LGWR写入日志文件。
作用:用内存到内存的快速操作,可以加快数据库的操作。同时,日志文件批量写入要比分散写入的效率高。
日志文件就是用来恢复数据库的,为保持数据库的一致性与可恢复性,日志在redo log buffer 中存在的时间不会太长,最长不超过3秒。同时,日志容量不能太大,超过1M时,LGWR会将日志写入日志文件。因此,日志缓冲区一般在3M左右,大于3M没有太大的意义。
(5) Java Pool:
从Oracle8i 以后,加入了对Java的支持,Java pool用于运行JVM所需的内存空间。
(6) Large pool:
大池从Oracle 8 开始引入,主要用于分配大块的内存,处理比共享池大的内存。(不是因为Large pool大)。
作用:
第一、 采用MTS连接方式时,在Large pool中分配UGA(使每个线程都可以访问)。
第二、 采用RMAN备份时,用作磁盘I/O的缓存。
第三、 作并行运算时,用于进程间消息的缓存。
三、后台进程
后台进程是Oracle用于执行具体任务的进程,包括数据库的读写、恢复、监视等任务。(1)Server process:
负责和User Process连接通信,用于接收客户端的请收,并返回操作结果。
(2)DBWR(数据写进程)
将Database buffe cache中的脏数据写入到数据文件中。同时也管理空闲的Database Buffe cache。
DBWR是一个底层的进程,和用户进程没有关系。也不受前台客户进程的控制。
(3)Lgwr (日志写进程):
LGWR 将把LOG BUFFER CACHE 中的日志信息写入磁盘(日志文件)。是一个必须和前台用户进程通信的进程。如果数据库有任务的变化,都将产生重做日志,并写入日志缓冲区(log buffer cache),重做日志的格式如下:
SCN:000000100
数据块ID
对象ID = 801
数据行=02
修改后的数据=0011
LGWR触发时机:
[1] 用户提交时,LGWR将日志写入磁盘。
[2] DBWR需要写入数据的SCN号大于LGWR记录的SCN号,将触发LGWR写日志操作。
(4)SMON系统监控进程
主要工作;
[1] 系统启动时,实例恢复
[2] OPS节点失败时,进行失败节点的实例恢复。
[3] 调整回滚段到最优化状态
[4] 清除临时空间
[5] 清除OBJ$表
[6] 从不可用的文件中恢复事务
(5)PMON进程监控
PMON用于监控用户进程,清除失效用户的进程,释主用户进程所占用的资源,如回滚未提交的事务,释放锁,释放分配组失效用户的SGA资源。
(6)CKPT 进程检查点
在DBWR和LGWR同步数据文件和日志文件、控制文件时,将会引起文件这些文件头文件信息的不一致。CKPT用来同步这些文件的头文件信息。
CKPT有以下的运行时机:
[1] 用户触发
[2] 日志切换时
[3] 使用Normal,immediate,transcation来shutdown 数据库时
[4] 以下参数的设置:
LOG_CHECKPOINT_INTERVA LOG_CHECKPOINT_TIMEOUT FAST_START_IO_TARGET
四SCN(system change number):
可以用以下方法得到系统的SCN号:
SQL> select max(ktuxescnw * power(2,32) + ktuxescnb) scn from x$ktuxe;
SCN
----------
142955
SCN特点:
第一、 查询不会使SCN号增大;
第二、 更新时,数据库内部的SCN号也是不相同的,可以保证数据库恢复时的顺序;
第三、 维持数据一致性。
如查询数据时,首先要取得系统的SCN号,然后核对找到后的每一条数据的SCN号,如果该SCN号小于系统的SCN号,就认为没有改变,可以从数据缓冲区中取出,如果大于了系统SCN号,就从回滚段数据文件中取出原来缓冲的数据。