oracle数据库体系架构详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库体系架构详解相关的知识,希望对你有一定的参考价值。
1,Oracle的体系结构、进程管理与结构组件详细介绍
User process:连接到数据库服务器的进程,用户通过它跟数据库进行交互。但是User process不能直接和数据库进行交互,它必须和服务器的组件Server process进行连接。
Server process:服务器进程,用来解释由User process传递过来的sql语句,负责commit和rollback,参与IO。启动Server process的时候会分配一块内存区域,叫做PGA(Process Global Area),分为四个部分:堆栈(指向其他PGA内存结构的指针)、session info(保存会话的信息)、cursor info(每个会话游标的信息)、Sort Area(排序区)。PGA区域是私有区域,不能被其他进程所共享
2,根据示图,便于我们记忆,示图分三部分组成,左侧User Process、Server Process、PGA可以看做成Clinet端,上面的实例(Instance)和下面的数据库(Database)及参数文件(parameter file)、密码文件(password file)和归档日志文件(archived logfiles)组成Oracle Server,所以整个示图可以理解成一个C/S架构。 Oracle Server由两个实体组成:实例(instance)与数据库(database)。这两个实体是独立的,不过连接在一起。在数据库创建过程中,实例首先被创建,然后才创建数据库。在典型的单实例环境中,实例与数据库的关系是一对一的,一个实例连接一个数据库,实例与数据库也可以是多对一的关系,即不同计算机上的多个实例打开共享磁盘系统上的一个公用数据库。这种多对一关系被称为实际应用群集(Real Application Clusters,RAC)RAC极大提高了数据库的性能、容错与可伸缩性(可能耗费更多的存储空间)并且是oracle网格(grid)概念的必备部分。
下面我们来详细看一下oracle数据库的体系架构
Oracle体系架构主要有两大部分组成:数据库实例(Instance)和数据库文件(database)
数据库实例
指数据库服务器的内存及相关处理程序,它是Oracle的心脏。与Oracle性能关系最大的是SGA(System Global Area,即系统全局区活共享内存区),SGA包含三个部分:
1、数据缓冲区,可避免重复读取常用的数据;
2、日志缓冲区,提升了数据增删改的速度,减少磁盘的读写而加快速度;
3、共享池,使相同的SQL语句不再编译,提升了SQL的执行速度。
oracle数据库实例的另一部分就是一些后台进程了,他主要包括:
1.系统监控进程(SMON)
2.进程监控(PMON)
3.数据库写进程(DBWR)
4.日志写进程(LGWR)
5.检验点进程(CKPT)
6.其他进程(Others)
这些后台进程合起来完成数据库管理任务
在访问数据库的时候。器后台先启动实例。启动实例前要先分配内存区。然后在启动后台进程。数据库启动过程中必须启动上面的前五个进程。否则实例无法创建。
注意:在启动oracle数据库的时候。因为有些进程是在开机启动项中自动启动的。所以占用了很大一部分内存。如果您电脑上还有一些其他占用内存比较大的程序。在启动oracle数据库的时候有可能会因内存不足而启动失败。
Oracle服务器
Oracle服务器包括两部分:数据库实例和数据库文件。他们构成了也就是所谓的数据管理系统(DBMS)
物理结构:oracle的物理结构指的其实就是一些存在硬盘上的各种文件。其最终目的就是存储和获取相关数据。这些存在硬盘上的文件组成了oracle数据库的物理结构
Oracle中主要包括三种文件:
1.数据文件
2.控制文件
3.重做日志文件
参数文件和密码文件:
参数文件:定义了数据库实例的特性,他是正文文件
密码文件:授予用户启动和关闭数据库的实例。主要有二进制数据组成
Oracle数据库的内存结构:SGA和PGA
SGA:数据库实例的一部分。数据库实例的启动会首先分配系统全局区(SGA)
1.共享池:共享sql和pl/sql代码,即把解析的sql代码在这里缓存,PL/SQL不仅缓存还共享。这样大大提高了直接访问磁盘获得sql的速度。
1)库高速缓存:存储最近使用过的sql语句。利用LRU(最近最少使用)算法来管理缓存。最近最少使用算法是一种比较常用的算法。在这里当库高速缓存接近满的时候。它会把缓存中最近最少使用的数据清除缓存中。加入新的缓存sql。
查看共享池的大小使用参数shared_pool_size
Sql>show parameter shared_pool_size
设置共享池大小
Sql>alter system set shared_pool_size=16M
注:在下面的的内容中。如果提到有关参数。如没有特殊说明。设置和查看参数值都是用以上类似方法。以后就不在重复了。并且这些参数必须是在以系统管理员system登陆时才能查看和修改。用类似scott用户是不能查看和修改的。
Oracle提供了DB_CACHE_SIZE(数据库大小)和DB_BLOCK_BUFFERS(数据库块个数)设置库高速缓存的大小,即为两者的成绩。
2)数据字典高速缓存
存储数据文件、表、索引、列、用户、权限信息和其他一些数据库对象的定义。把相关的数据字典信息放入缓存来提高查询的响应时间。其大小取决于共享池的大小。
2.数据库高速缓存
存储了最近从数据文件读入的数据块信息或用户更改后需要写回数据库的数据信息。内存读取比磁盘读取的速度快的多。提高了访问速度。这里的存取也采用了LRU(最近最少使用)算法。
Oracle数据库引入了缓冲区顾问参数(Buffer cache advisory parameter)用于启动和关闭统计信息。这些信息用于预测不同缓冲区的大小导致的不同行为特性。三种状态:OFF:ON:READY
设置顾问缓存为开启状态后。可以通过动态性能视图:v$db_cache_advice查看缓冲区的建议信息
3.重做日志缓存
在执行insert、update等操作后。数据发生了改变。这些变化的数据在写入数据库高速缓存前会先写入重做日志缓冲区。包括变化之前的数据。可以通过初始化参数log_buffer查看它的大小。此参数为静态参数,不能修改。
4.大池和java池
大型池(Large Pool)
在SGA中大型池是可选的缓冲区。它可以根据需要有管理权进行配置。它可以提供一个大的区以供象数据库的备份与恢复等操作。
在以下几种情形下会启用:
一,backup 和 restore 操作的时候
二,当启动UGA, I/O slaves的时候
三,设置MTS服务器的时候,用户信息的存放也使用到Large Pool
可以使用以下命令进行更改Large Pool的大小:
ALTER SYSTEM SET Large_Pool_Size = 64m;
Java池用于编译java语言编写的指令。通过java_pool_size查看和修改大小。大小由数据库在SGA自动分配和管理。所以查看的时候值为0;
Oracle的连接和会话
连接 (connection)与会话 (session)这两个概念均与用户进程 (user process)紧密相关,但二者又具有不同的含义。
连接 :用户进程和 Oracle 实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和 Oracle 进程)或网络软件(network software)(当数据库应用程序与 Oracle 服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。
会话 :用户通过用户进程与 Oracle 实例建立的连接[此处连接与上文中的连接含义不同 ,主要指用户和数据库间的联系 ]。例如,当用户启动 SQL*Plus 时必须提供有效的用户名和密码,之后 Oracle 为此用户建立一个会话。从用户开始连接到用户断开连接(或退出数据库应用程序)期间,会话一直持续。
Oracle 数据库中的同一个用户可以同时创建多个会话。例如,用户名/密码为的SCOTT/TIGER 用户可以多次连接到同一个 Oracle 实例。
当系统没有运行在共享服务模式下时,Oracle 为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。
5,以执行一条SQL语句为例,从发出SQL语句到返回结果集,可以分为三个部分:
5.1,解析:
(1)还原成ASCII码,生成hash_value
(2)到PGA中匹配hash_value,进行快速软解析,如果在PGA中没有找到,就到Library Cache中匹配hash_value,进行软解析
(3)如果都没有找到,就转入硬解析(语法分析:SQL语句是否符合语法要求、语义分析:SQL语句中对象是否存在、安全审核:发出SQL的用户是否有权限执行操作、由优化器进行优化、行资源生成)。
5.2.执行:按照执行计划查找需要的数据和对象
5.3.获取:将找到的数据返回给User process
Instance(实例):访问数据库的手段,包括SGA(System Global Area)、实例进程
SGA包括:
Shared Pool(共享池):
Library Cache:缓存SQL语句的执行计划
Data Dictionary Cacche:保存最近访问过的数据字典的行
Database Buffer Cache(数据库缓冲区):以8K为单位,缓存硬盘数据的副本(缓冲IO的瓶颈),使用LRU(最近最少使 用原则)机制进行空间管理。
Large Pool(大池):保存与SQL、PLSQL不相关的数据,比如做数据备份还原恢复时候所用到的块。
Java Pool:为java的编译提供缓存
Streams Pool:缓存流复制数据,如果启用了流复制而又没有定义Streams Pool,oracle会分配shared pool的10%来作 为Stream Pool。
Log Buffer:保存redo条目,所有条目的变化,将来参与recover。
后台进程
PMON(Process Monitor)进程监视器:监控其他非主要核心进程,如果异常进行重启,清理由于User Process异常导致的垃圾数据、在实例的动态注册时,负责向监听进程注册实例,在集群环境,每60秒收集一次当前节点的CPU压力,实现Load Balance基于CPU压力的负载均衡,
DBWn(Database Writer):把Database Buffer Cache里面的脏数据同步到物理硬盘中,使数据同步,其中n的取值从0~9,a~z,一共36个,默认是一个。触发条件包括:CKPT(检查点)、Database Buffer Cache达到存储上限(存储容量的10%)、Database Buffer Cache没有可用空间进行写操作、timeout、RAC Ping Request集群环境中的ping请求,表级别的truncate或者drop操作、tablespace readonly、tablespace offline、begin backup。
SMON(System Monitor)系统监控进程:空间管理(合并空闲临时段、回收临时段)、实例恢复(涉及前滚后滚、锁机制)
CKPT(CheckPoint)检查点:调度数据写进程,将完成的检查点写到数据文件头,将完成的检查点写到控制文件。
LGWR(Log Writer)日志写进程:将Log Buffer里面的内容写到硬盘的联机日志二进制文件中。触发条件包括:commit、达到日志缓冲区空间的1/3,timeout、任何一次数据写之前都要先写日志。
RECO(Recover):在分布式系统下,完成分布式环境中的事务的恢复。
CJQ0:作业队列的调度进程:调度job队列。
Jnnn:作业从属进程,为作业服务的进程。
ARCn:归档进程。
QMNn:队列监视器。
MMAN:内存管理。
MMON:内存监控。
MMNL:内存指示灯。
数据库在硬盘的存储方式
ControlFile 控制文件:记录数据库的物理信息、数据库属性、数据库名字、ID号、创建时间、resetlog change number、角色等记录数据库物理信息一致性的文件,至少一个。
RedLogFile 联机日志文件:记录所有数据块的变化(LogBuffer中保存的条目),至少两个。
DataFile 数据文件:一个数据库可以包括65535个文件,每个文件可以管理最多4M个Oracle块。
PasswordFile 口令文件:记录超级用户的名字和口令,用来做超级用户的审核。
ParameterFile 参数文件:记录所有非默认值的初始化参数,约束实例的行为。
TraceFile 跟踪文件:ASII码格式的文本文件,记录数据库工作时的一些信息和一些报错内容,用来做trouble shooting。
ArchivedLogFile 归档日志文件:RedoLogFile的镜像备份。
以上是关于oracle数据库体系架构详解的主要内容,如果未能解决你的问题,请参考以下文章