oracle的architecture,ORACLE 体系结构(Architecture of ORACLE)

一、

ORACLE

事例

1

ORACLE

实例

System   Global   Area(SGA)

Background   Process

被成为数据库的实例。

2

ORACLE

数据库

一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)

3

、系统全局共享区

System   Global   Area(SGA)

System   Global   Area

是一块巨大的共享内存区域,他被看做是

Oracle

数据库的一个大缓冲池,这里的数据可以被

ORACLE

的各个进程共用。其大小可以通过如下语句查看:

SQL>   select   *   from   v$sga;

NAME   VALUE

--------------------   ---------

Fixed   Size   39816

Variable   Size   259812784

Database   Buffers   1.049E+09

Redo   Buffers   327680

更详细的信息可以参考

V$sgastat

V$buffer_pool

主要包括以下几个部分:

a

共享池

(Shared   pool)

共享池是

SGA

中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的

CPU

来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下两个部分:

·SQL

语句缓冲

(Library   Cache)

当一个用户提交一个

SQL

语句,

Oracle

会将这句

SQL

进行分析

(parse)

,这个过程类似于编译,会耗费相对较多的时间。在分析完这个

SQL

Oracle

会把他的分析结果给保存在

Shared   pool

Library   Cache

中,当数据库第二次执行该

SQL

时,

Oracle

自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的

SQL

比第二次运行的

SQL

要慢一点的原因。

下面举例说明

parse

的时间

SQL>   select   count(*)   fromscpass   ;

COUNT(*)

----------

243

Elapsed:   00:00:00.08

这是在

Share_pool

Data   buffer

都没有数据缓

冲区的情况下所用的时间

SQL>   alter   system   flush   SHARED_POOL;

System   altered.

清空

Share_pool

,保留

Data   buffer

SQL>   select   count(*)   from   scpass   ;

COUNT(*)

----------

243

Elapsed:   00:00:00.02

SQL>   select   count(*)   from   scpass   ;

COUNT(*)

----------

243

Elapsed:   00:00:00.00

从两句

SQL

的时间差上可以看出该

SQL

Parse

时间约为

00:00:00.02

对于保存在共享池中的

SQL

语句,可以从

V$Sqltext

v$Sqlarea

中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的

Share   pool

,提高

SQL

语句的重用率必须先养成良好的变成习惯,尽量使用

Bind

变量。

·

数据字典缓冲区

(Data   Dictionary   Cache)

显而易见,数据字典缓冲区是

ORACLE

特地为数据字典准备的一块缓冲池,供

ORACLE

内部使用,没有什么可以说的。

b

、块缓冲区高速缓存

(Database   Buffer   Cache)

这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件

,

,户数据文件,临时数据文件,回滚段文件之分。也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由

DBWR

进程将修改后的数据写入磁盘。

这个缓冲区的块基本上在两个不同的列表中管理。一个是块的

(Dirty   List)

,需要用数据库块的书写器

(DBWR)

来写入,另外一个是不脏的块的列表

(Free   List)

,一般的情况下,是使用最近最少使用

(Least   Recently   Used,LRU)

算法来管理。

块缓冲区高速缓存又可以细分为以下三个部分(

Default   pool,Keep   pool,Recycle   pool

)。如果不是人为设置初始化参数

(Init.ora)

ORACLE

将默认为

Default   pool

由于操作系统寻址能力的限制,不通过特殊设置,在

32

位的系统上,块缓冲区高速缓存最大可以达到

1.7G

,在

64

位系统上,块缓冲区高速缓存最大可以达到

10G

c

、重做日志缓冲区

(Redo   log   buffer)

重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由

LGWR

进程将它写入磁盘。这些修改信息可能是

DML

语句,如

(Insert,Update,Delete)

,或

DDL

语句,如

(Create,Alter,Drop

)

重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于

3M

之后的重作日志缓冲区已经没有太大的实际意义。

d

Java

程序缓冲区

(Java   Pool)

Java

的程序区,

Oracle   8I

以后,

Oracle

在内核中加入了对

Java

的支持。该程序缓冲区就是为

Java

程序保留的。如果不用

Java

程序没有必要改变该缓冲区的默认大小。

e

、大池

(Large   Pool)

大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的内存,在

8.0

开始引入。

下面对象使用大池:

·MTS——

SGA

Large   Pool

中分配

UGA

·

语句的并行查询

(Parallel   Executeion   of   Statements)——

允许进程间消息缓冲区的分配,用来协调并行查询服务器

·

备份

(Backup)——

用于

RMAN

磁盘

I/O

缓存

4

、后台进程

(Background   process)

后台进程是

Oracle

的程序,用来管理数据库的读写,恢复和监视等工作。

Server   Process

主要是通过他和

user   process

进行联系和沟通,并由他和

user   process

进行数据的交换。在

Unix

机器上,

Oracle

后台进程相对于操作系统进程,也就是说,一个

Oracle

后台进程将启动一个操作系统进程;在

Windows

机器上,

Oracle

后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个

ORACLE.EXE

的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。

Unix

上可以通过如下方法查看后台进程:

ps   –ef   |   grep   ora_

#   ps   -ef   |   grep   ora_   |   grep   XCLUAT

oracle   29431   1   0   Sep   02   ?   2:02   ora_dbwr_SID

oracle   29444   1   0   Sep   02   ?   0:03   ora_ckpt_SID

oracle   29448   1   0   Sep   02   ?   2:42   ora_smon_SID

oracle   29442   1   0   Sep   02   ?   3:25   ora_lgwr_SID

oracle   29427   1   0   Sep   02   ?   0:01   ora_pmon_SID

a

Oracle

系统有

5

个基本进程他们是

DBWR(

数据文件写入进程

)

LGWR(

日志文件写入进程

)

SMON(

系统监护进程

)

PMON(

用户进程监护进程

)

CKPT(

检查点进程

,

同步数据文件

,

日志文件

,

控制文件

)

b

DBWR

将修改过的数据缓冲区的数据写入对应数据文件

维护系统内的空缓冲区

这里指出几个容易错误的概念

:

·

当一个更新提交后

,DBWR

把数据写到磁盘并返回给用户提交完成

.

·DBWR

会触发

CKPT

后台进程

·DBWR

不会触发

LGWR

进程

上面的概念都是错误的

.

DBWR

是一个很底层的工作进程,他批量的把缓冲区的数据写入磁盘。和任何前台用户的进程几乎没有什么关系,也不受他们的控制。至于

DBWR

会不会触发

LGWR

CKPT

进程,我们将在下面几节里讨论。

DBWR

工作的主要条件如下

·DBWR

超时

·

系统中没有多的空缓冲区用来存放数据

·CKPT

进程触发

DBWR

c

LGWR

将重做日志缓冲区的数据写入重做日志文件,

LGWR

是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构

:

SCN=000000001000

数据块

ID

对象

ID=0801

数据行

=02

修改后的数据

=0011

提交的时候,

LGWR

必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。从这点可以看出

LGWR

承担了维护系统数据完整性的任务。

LGWR

工作的主要条件如下

·

用户提交

·

1/3

重做日志缓冲区未被写入磁盘

·

有大于

1M

重做日志缓冲区未被写入磁盘

·

超时

·DBWR

需要写入的数据的

SCN

号大于

LGWR

记录的

SCN

号,

DBWR

触发

LGWR

写入

d

SMON

工作主要包含

·

清除临时空间

·

在系统启动时,完成系统实例恢复

·

聚结空闲空间

·

从不可用的文件中恢复事务的活动

·OPS

中失败节点的实例恢复

·

清除

OBJ$

·

缩减回滚段

·

使回滚段脱机

e

PMON

主要用于清除失效的用户进程,释放用户进程所用的资源。如

PMON

将回滚未提交的工作,释放锁,释放分配给失败进程的

SGA

资源。

f

CKPT

同步数据文件,日志文件和控制文件,由于

DBWR/LGWR

的工作原理,造成了数据文件,日志文件,控制文件的不一至,这就需要

CKPT

进程来同步。

CKPT

会更新数据文件

/

控制文件的头信息。

CKPT

工作的主要条件如下

·

在日志切换的时候

·

数据库用

immediate   ,transaction   ,   normal

选项

shutdown

数据库的时候

·

根据初始话文件

LOG_CHECKPOINT_INTERVAL

LOG_CHECKPOINT_TIMEOUT

FAST_START_IO_TARGET

的设置的数值来确定

·

用户触发

以下进程的启动需要手工配置

g

ARCH

当数据库以归档方式运行的时候,

Oracle

会启动

ARCH

进程,当重做日志文件被写满时,日志文件进行切换,旧的重做日志文件就被

ARCH

进程复制到一个

/

多个特定的目录

/

远程机器。这些被复制的重做日志文件被叫做归档日志文件。

h

RECO

负责解决分布事物中的故障。

Oracle

可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。

RECO

进程试图建立与远程服务器的通信,当故障消除后,

RECO

进程自动解决所有悬而未决的会话。

i

、服务进程

Server   Process

服务进程的分类

·

专用服务进程

(Dedicated   Server   Process)

一个服务进程对应一个用户进程

·

共享服务进程

(MultiTreaded   Server   Process)

一个服务进程对应多个用户进程,轮流为用户进程服务。

PGA   &   UGA

PGA   =   Process   Global   Area

UGA   =   User   Global   Area

他保存了用户的变量、权限、堆栈、排序空间等用户信息,对于专用服务器进程,

UGA

PGA

中分配。对于多线程进程,

UGA

Large   pool

中分配。

j

、用户进程

User   Process

在客户端,将用户的

SQL

语句传递给服务进程

5

、一个贯穿数据库全局的概念

----

系统改变号

SCN(System   Change   Number)

系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。

a.

查询语句不会使

SCN

增加,就算是同时发生的更新,数据库内部对应的

SCN

也是不同的。这样一来就保证了数据恢复时候的顺序。

b.

维持数据的一致性,当一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值