10分钟了解Oracle体系结构

对于一门技术的学习 , 尤其是像Oracle database这种知识体系极其庞杂的技术来讲 , 从宏观上了解其体系结构是至关重要的 。同时 , 个人认为 , 未必是专业DBA人员才需要了解其体系结构(固然对于数据库专业人员来讲 , 这些都是必备知识了) , 一般的技术人员如果对其有较深入的了解 , 也是大有益处的 , 毕竟技术思想很多时候都是相通的嘛 。本文就从不同维度 , 如Oracle的内存结构 , 进程结构 , 存储结构等方面做相应描述 。
目录
一、什么是Oracle数据库?
二、交互流程
三、实例内存结构和进程结构
四、Oracle存储结构
五、总结
首先我们来说说基础的概念吧
众所周知 , Oracle DataBase是一款关系型数据库管理系统(不了解何谓关系型数据库的童鞋自行google , baidu) , 同类的产品还有MySQL , sqlServer等 , 很多时候 , 我们会把那个承载我们核心数据的系统笼统地成为数据库服务器 , 但从严格意义上来讲Oracle DataBase是由两个部分组成:

10分钟了解Oracle体系结构

文章插图
 
实例:实例是数据库启动时初始化的一组进程和内存结构
数据库:数据库则指的是用户存储数据的一些物理文件
正因为如此我们一般才会说 关闭和启动实例 , 加载卸载数据库 , 就是这个道理 。
从实例和数据库的概念上来看 , 我们能知道 , 实例暂时的 , 它不过是一组逻辑划分的内存结构和进程结构 , 它会随着数据库的关闭而消失 , 而数据库它其实就是一堆物理文件(控制文件 , 数据文件 , 日志文件等等) , 它是永久存在的(除非磁盘损坏) 。数据库和实例通常是一对一的 , 这种结构我们成为单实例体系结构;当然还有一些复杂的分布式的结构 , 一个数据库可以对多个实例 , 像Oracle的RAC(有兴趣的童鞋可以了解下) 。
下面是从网上找的一张图 , 描述了单实例体系结构大致的交互流程
10分钟了解Oracle体系结构

文章插图
 
1.用户和用户进程交互用户进程可以是一般的客户端软件 , 像Oracle的sqlplus , sql developer,或者是一些驱动程序等等都属于用户进程 。
2.用户进程和服务器进程交互服务器进程有时会称为前台进程 , 当然是相对于后台进程(后面会提到的数据库写入器 , 日志写入器等)来说的 , 服务器进程的主要作用就是处理连接到当前实例的用户进程的请求 , 对客户端发来的sql进行执行并返回执行结果 。在专有服务器结构中 , 用户进程和服务器进程是一对一的 , 也就是说 , 当监听程序监听到客户端来了一个请求 , 会为其分配一个对应的服务器进程 。还有一种结构为共享服务器 , 这种结构就不是一个用户进程对应一个服务器进程了 , 会通过调度程序进行协调处理 , 关于共享服务器连接 , 本文就不在赘述了 。
 上面描述了一些我们在进行数据库连接操作的时候 , 大致的交互流程是什么样的 。下面 , 我们就来看看Oracle 的实例内存结构
(由于内存结构和进程结构关系较紧密 , 进程会作用到对应的内存区域 , 比如数据库写入器作用到数据库缓冲区缓存中 , 日志写入器会作用到日志缓冲区 , 所以内存结构和进程结构会相互配合地进行描述)
oracle实例内存结构由两部分组成SGA(系统全局区)和PGA(用户全局区)组成 , SGA是一块共享的内存区域 , 也是最大的一块内存区域;PGA则是用户会话专有的内存区域 , 每个会话在服务器端都有一块专有的内存区域就是PGA 。本文主要对SGA进行分析描述 。SGA组成如下
10分钟了解Oracle体系结构

文章插图
 
数据库缓冲区缓存&数据库写入器缓冲区缓存 是Oracle用来执行sql 的工作区域 , 在更新数据时 , 用户会话不会直接去更新磁盘上的数据 , 想想 , 如果允许这么做 , 那么频繁的磁盘IO对于系统性能的影响是毁灭性的 。所以 , 实际的处理流程是这样的:


推荐阅读