本帖最后由 信息发布软件 于 2017-8-22 23:52 编辑
先来看一个图,这个图取自于上面提到的教材,这个图对于从整体上理解ORACLE的体系结构组件,非常关键.
下面来解释下这个图.
对于一个数据库系统来说,假设这个系统没有运行,我们所能看到的和这个数据库相关的无非就是几个基于操作系统的物理文件,这是从静态的角度来看,如果从动态的角度来看呢,也就是说这个数据库系统运行起来了,能够对外提供服务了,那就意外着数据库系统启动了自己的一个实例,综合以上2个角度,oracle如何定义上述描述呢?
我们来引入第一个概念,oracle服务器,所谓oracle服务器是一个数据库管理系统,它包括一个oracle实例(动态)和一个oracle数据库(静态)。oracle实例是一个运行的概念(如操作系统的进程),提供了一种访问oracle数据库的方式,始终打开一个,并且只能打开一个oracle数据库,oracle实例有SGA和一些后台服务进程组成,在后台服务进程当中,DBWn PMON CKPT LGWR SMON是必备的后台进程,而ad queue,rac,shared server,ad replication则是可选的,之所以可选,要们是因为离开它oracle也能正常运行,要么是一些高级的功能才可以用得到。
oracle数据库是一个被统一处理的的数据的集合,从物理角度来看包括三类文件数据文件,控制文件,重做日志文件。从逻辑角度来看,oracle数据库至少包含一个表空间,表空间至少包含一个段,段由区做成,区有块组成。需要注意的是表空间可以包含若干个数据文件,段可以跨同一个表空间的多个数据文件,区只能在同一个数据文件内。
oracle还设计了其他的关键文件用来为整个系统服务,如配置文件,密码文件,归档日志文件,还有还有用户进程和服务进程,现在可以简单理解下执行sql语句就要用到这2个进程。
下表是SGA和PGA的总结
SGA | SHARE POOL
(共享池)
用如下命令可以调整
ALTER SYSTEM SET
SHARED_POOL_SIZE=64M
| LIBRARY CACHE
(库高速缓存)
1存储最近使用的SQL和PL/SQL语句信息
2包括SHARED SQL和SHARED PL/SQL
3用LRU算法管理
4大小由SHARE POOL大小决定
|
DATA DICTIONARY CACHE
(数据字典高速缓存)
1数据库中最近使用的定义的集合
2包含数据库文件,表,索引,列,用户,权限和其他的数据库对象相关信息
3在语法分析阶段,服务器进程会在数据字典中查找用于对象解析和验证访问的信息
4将数据字典信息高速缓存到内存中,可缩短查询和DML的响应时间
5大小由共享池的大小决定
|
DATABASE BUFFER CACHE
(数据缓冲区高速缓存)
| 1存储已从数据文件检索到的数据的复本
2大幅提高读取和更新数据的性能
3使用LRU算法管理
4主块的大小由DB_BLOCK_SIZE确定
|
REDO LOG BUFFER
(重做日志缓冲区)
| 1记录对数据库数据块作的全部更改
2主要用来恢复
3其中记录的更改被称作重做条目
4重做条目包含用于重新构建或重做更改的信息
5大小由LOG_BUFFER定义
|
LARGE POOL
(大型池)
| 1 SGA可选的内存区
2分担了共享池的一部分工作
3用于共享服务器的UGA
4用于I/O服务器进程
5备份和恢复操作或RMAN
6并行执行消息缓冲区(前提PARALLEL_POOL_SIZE=TRUE)
7不使用LRU列表
8大小由LARGE_POOL_SIZE确定
|
JavaPOOL
(Java池)
| 1存储JAVA命令服务分析要求
2安装和使用JAVA时必须的
3大小有JAVA_POOL_SIZE确定
|
PGA | PRIVATE SQL AREA
(专用SQL区)
专用SQL区的位置取决于为会话建立的连接类型。在专用服务器环境中,专用SQL区位于各自服务器进程的PGA中。在共享服务器环境中,专用SQL区位于SGA中。
管理专用SQL区是用户进程的职责。用户进程可以分配的专用SQL区的数目始终由
初始化参数OPEN_CURSORS来限制。该参数的缺省值是50。
| PERSISTEN AREA
(永久区)
包含绑定信息,并且只在关闭游标时释放
|
RUNTIME AREA
(运行时区)
在执行请求时的第一步创建。对于INSERT、UPDATE和DELETE命令,该区在执行语句后释放,对于查询操作,该区只在提取所有行或取消查询后释放。
|
SESSION MEMORY
(会话内存)
| 包含为保留会话变量以及与该会话相关的其它信息而分配的内存。对于共享服务器环境,该会话是共享的而不是专用的。
|
SQL WORK AREAS
(SQL工作区)
| 用于大量占用内存的操作,如排序、散列联接、位图合并和位图创建。
工作区的大小可进行控制和调整
|
下表是后台进程总结
DBWn | DBWn延迟写入数据文件,直到发生下列事件之一:
•增量或正常检查点
•灰数据缓冲区的数量达到阈值
•进程扫描指定数量的块而无法找到任何空闲缓冲区时
•出现超时
•实时应用集群(Real Application Clusters, RAC)环境中出现ping请求
•使一般表空间或临时表空间处于脱机状态
•使表空间处于只读模式
•删除或截断表
•执行ALTER TABLESPACE表空间名BEGIN BACKUP操作
|
LGWR | LGWR在下列情况下执行从重做日志缓冲区到重做日志文件的连续写入:
•当提交事务时
•当重做日志缓冲区的三分之一填满时
•当重做日志缓冲区中记录了超过1 MB的更改时
•在DBWn将数据库缓冲区高速缓存中修改的块写入数据文件以前
•每隔三秒
|
SMON
| 例程恢复
–前滚重做日志中的更改
–打开数据库供用户访问
–回退未提交的事务处理
•合并空闲空间
•回收临时段
|
PMON
| 进程失败后,后台进程PMON通过下面的方法进行清理:
•回退用户的当前事务处理
•释放当前保留的所有表锁或行锁
•释放用户当前保留的其它资源
•重新启动已失效的调度程序
|
CKPT
| •在检查点发信号给DBWn
•使用检查点信息更新数据文件的标头
•使用检查点信息更新控制
启动检查点的原因如下:
•确保定期向磁盘写入内存中发生修改的数据块,以便在系统或数据库失败时不会丢失数据
•缩短例程恢复所需的时间。只需处理最后一个检查点后面的重做日志条目以启动恢复操作
•确保提交的所有数据在关闭期间均已写入数据文件
由CKPT写入的检查点信息包括检查点位置、系统更改号、重做日志中恢复操作的起始位置以及有关日志的信息等等。
注:CKPT并不将数据块写入磁盘,或将重做块写入联机重做日志。
|
ARCn | •可选的后台进程
•设置ARCHIVELOG模式时自动归档联机重做日志
•保留数据库的全部更改记录
|
最后,举一个用户提交sql语句的的例子来结束本文,如果用户想提交sql语句,那么首先你必须要连接到oracle实例,连接到oracle实例有三种途径,1如果用户登陆到运行oracle实例的操作系统上,则通过进程间通信进行访问2C/S结构访问3三层结构.
1、物理结构
Oracle物理结构由控制文件、数据文件、重做日志文件、参数文件、归档文件、口令文件组成
一个数据库中的数据存储在磁盘上物理文件,被使用时,调入内存。其中控制文件、数据文件、重做日志文件、跟踪文件及警告日志(trace files,alert files)属于数据库文件;参数文件(parameter file)口令文件(password file)是非数据库文件。
数据文件:存储数据的文件.数据文件典型地代表了根据他们使用的磁盘空间和数量所决定的一个Oracle数据库的容积。
由于性能原因,每一种类型的数据放在相应的一个或一系列文件中,将这些文件放在不同的磁盘中。
types:
.data dictionary .data
.redo data .index
.temporary data 等等
控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件.
控制文件内容
◆数据库名
◆表空间信息
◆所有数据文件的名字和位置
◆所有redo日志文件的名字和位置
◆当前的日志序列号
◆检查点信息
◆关于redo日志和归档的当前状态信息
控制文件的使用过程
控制文件把Oracle引导到数据库文件的其它部分。启动一个实例时,Oracle 从参数文件中读取控制文件的名字和位置。安装数据库时,Oracle 打开控制文件。最终打开数据库时,Oracle 从控制文件中读取数据文件的列表并打开其中的每个文件。
重做日志文件
含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件.
跟踪文件及警告日志(Trace Files and Alert Files)
在instance 中运行的每一个后台进程都有一个跟踪文件(trace file)与之相连。Trace file 记载后台进程所遇到的重大事件的信息。
警告日志( Alert Log)是一种特殊的跟踪文件,每个数据库都有一个跟踪文件,同步记载数据库的消息和错误.
参数文件:包括大量影响Oracle数据库实例功能的设定,如以下设定:
◆数据库控制文件的定位
◆Oracle用来缓存从磁盘上读取的数据的内存数量
◆默认的优化程序的选择.
和数据库文件相关,执行两个重要的功能
1〉为数据库指出控制文件
2〉为数据库指出归档日志的目标
归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
口令文件:认证哪些用户有权限启动和关闭Oracle例程.
2、逻辑结构(表空间、段、区、块)
表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。
段:是对象在数据库中占用的空间.
区:是为数据一次性预留的一个较大的存储空间.
块:ORACLE最基本的存储单位,在建立数据库的时候指定.
3、内存分配(SGA和PGA)
SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反,PGA 是只被一个进程使用的区域,PGA 在创建进程时分配,在终止进程时回收.
4、后台进程
包括数据写进程(Database Writer,DBWR)、日志写进程(Log Writer,LGWR)、系统监控(System Monitor,SMON)、进程监控(Process Monitor,PMON)、检查点进程(Checkpoint Process,CKPT)、归档进程、服务进程、用户进程)
数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件
日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
进程监控:负责在一个Oracle 进程失败时清理资源
检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。CKPT进程不将块写入磁盘,该工作是由DBWR完成的。 init.ora文件中 CHECKPOINT_PROCESS 参数控制CKPT进程的使能或使不能。缺省时为FALSE,即为使不能。
归档进程:在每次日志切换时把已满的日志组进行备份或归档
服务进程:用户进程服务。
用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。
5、SCN(System ChangeNumber):
系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
Oracle架构,讲述了Oracle RDBMS的底层实现原理,是Oracle DBA**调优和排错的基础理论。深入理解Oracle架构,能够让我们在Oracle的路上走的更远。本文主要是在对RDBMS的底层组件功能和实现原理有一定的了解的情况下,结合自身的工作经验提出了对Oracle调优和排错的思路。**当然,对Oracle体系结构的理解是一个深远的过程,需要不断的更新修改,如有不对,还望指正。:)
Oracle RDBMS架构图
一般我们所说的Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle数据库管理系统,也称之为Oracle Server。而Oracle Server主要有两大部分:
Oracle Server = 实例 + 数据库 (Instance和Database是相互独立的)
数据库 = 数据文件 + 控制文件 +日志文件 实例 = 内存池 + 后台进程
所以可以细分为: Oracle Server = 内存池 + 后台进程 + 数据文件 + 控制文件 + 日志文件
一台Oracle Server支持创建多个Database,而且每个Datacase是互相隔离而独立的。不同的Database拥有属于自己的全套相关文件,例如:有各自的密码文件,参数文件,数据文件,控制文件和日志文件。
Database由一些物理文件(如:存放在存储设备中的二维表文件)组成。二维表存储在Database中,但Database的内容不能被用户直接读取,用户必须通过Oracle instance才能够访问Database,一个Instance只能连接一个Database,但是一个Database可以被多个Instance连接。
将上面的Oracle RDBMS架构图进行抽象分类,可以将Oracle架构抽象为:Oracle体系 = 内存结构 + 进程结构 + 存储结构
内存结构
Oracle Instance是Oracle RDBMS的核心之一,负责RDBMS的管理功能。Oracle Instance主要由内存池SGA和后台进程组成。
系统全局区SGA
内存池SGA的默认Size,会在安装Oracle的时候会根据LinuxOS的sysctl.conf参数文件来决定:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
查看SGA的Size:
SQL> conn /as sysdba
Connected.
SQL> show user;
USER is "SYS"
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2022144
Variable Size 503317760
Database Buffers 1627389952
Redo Buffers 14753792
SQL> show sga
Total System Global Area 2147483648 bytes #对应kernel.shmmax = 2147483648
Fixed Size 2022144 bytes
Variable Size 503317760 bytes
Database Buffers 1627389952 bytes
Redo Buffers 14753792 bytes