oracle的体系结构
Oracle 的体系结构
把这张图分成上下两部分
上面的部分是内存数据: 存在于内存中 在内存中的数据没实体在大方框中的部分我们把这部分称之为实例 实例由 SGA( 共享全局区 ) 和一组后台进程组成,椭圆部分是私有的 ,user process 是客户端进程比如 SQLPLUS,server process 是服务器端进程。
下面的部分是物理数据: 存在于存储介质 ( 通常 FS 或 raw 或 ASM) 上,我们把这部分称之为数据库。
而实例+ 数据库就是大众所谓的数据库通称 , 而实际他们完全是两个概念
一般来讲" 物理的 " 都是参照对象的下层而言的
例如:OS 的物理层 就是硬件
而oracle 是基于 OS 的软件 , 顾 OS 的部分对 oracle 而言就是物理的 .
一、实例 instance
实例是访问数据库的正常模式的唯一途径( 排除 DUL 等工具 )
一个实例只能打开一个数据库
一个数据库可以被多个实例访问(RAC)
实例由内存结构和一组后台进程组成
ORACLE INSTANCE是一个数据库文件进行实例化提供的服务,而它也是我们体系结构的核心
实例如何运行:
一个实例运行起来就好比大商场开张
你要开张卖商品 就需要有空间 比如营业厅, 老板办公室 , 经理办公室 , 财务室等等
这些空间在我们系统中就是要申请的内存区域
华宇商场空间的总体使用面积该多大?
当你买下( 租下 ) 这块商场空间时 , 生活中会签合同 合同中表明了他购买的这个面积的范围,之后这个商场空间就随你去规划去使用了 .
那么这里的合同 在数据库中就是参数文件
参数文件是实实在在存在于你硬盘或裸设备中的.
参数文件决定着实例初始化的形态
大商场想开张, 有了商场空间后 , 还缺什么 ? 人!商场里需要不同岗位的人员来维持这个店的正常运转,这些人就相当于后台进程 他们各尽其职。
为什么说是后台进程?
实例运转需要进程来维护, 包括写数据 , 写日志 , 实例恢复等等
你是去商场买商品 你也是一个进程
导购接待你卖商品 导购也是一个进程
所以区分一下他们:
你就是用户进程( 比如 sqlplus)
导购就是属于服务进程(linux 下 ps 可以查到进程名 oracle$ORACLE_SID)
你和导购之间建立起来的就是session( 对于专属模式是进程和会话一对一 , 共享模式一对多 )
维护实例运转的就是后台进程
二、 内存结构
内存由SGA 和 PGA 组成,分别代表系统全局区和私有全局区。
S可以理解成 SYSTEM, 也可以理解成 SHARE 。
P可以理解成 PROCESS,PRIVATE
1、 SGA :系统全局区
每个实例只有一个SGA, 生命周期是实例的启停, SGA 随之创建消亡
用于存储数据库信息的内存区,该信息为数据库所有进程所共享。
SGA中包含的组件 :
shared_pool 共享 SQL 和 PLSQL 的执行计划和数据字典对象等信息
他又分为两部分:
1.data dict cache 也叫 rowcache 加速 SQL 的解析
使用过的字典 就会缓存在这里 再次使用这个字典就直接从内存获取
这些统计的信息在 v$rowcache 中记录
2.library cache: 加速解析 减少语句重解析
SQL文本 , 解析树和执行计划就在这里
db buffer cache
数据库缓冲缓存区 缓冲被访问的数据块.
每次从磁盘向内存缓冲数据的单位由 db_block_size=8192 决定
这个区域缓冲的数据保持时间也由LRU 算法决定
redo log buffer
联机( 重做 ) 日志缓冲区 记录数据库的每个改动向量
就是记录有顺序的SQL 条目
这些SQL 条目包括系统的改动和 UNDO 的改动 , 用户数据的改动
将一个人的工资由800 改成 1000 还没提交就断电
这时数据有可能写盘 下次启动时就通过回滚段中的改前镜像和日志进行 恢复
如果提交了数据有可能没写盘 这时断电 下次启动就通过日志重做
主要是为了数据的增删改过程记录日志的 提高数据安全性
large pool(9I引入 )
大池 存放对那些复杂的程序包分析、RMAN 、 UGA( 共享模式 ) 、异步 IO 等相关的数据
java pool(9I引入 )
JAVA池 存放 JAVA 存储过程的分析信息。
stream pool(10g引入 )
流池 为流复制服务提供数据缓冲缓存
其他资源
比如固件,lock,latch 统计数据等等
2、 PGA: 程序全局区
整个实例有很多PGA, 对应的是进程 , 一个进程一个 PGA, 生命周期是进程的 创建和消亡
PGA中主要包含排序区和 UGA( 专有模式 ) 的信息
3、 UGA: 用户全局区
存储session 信息和解析执行计划的
它的位置比较特殊
如果是专有模式( 默认 ) 进程和会话是一对一的 ,UGA 会存在 PGA 中
如果是共享模式 进程和会话是一对多的关系,UGA 会存在 large pool 中
但large pool 没内存可分时 会存在于 SHARED POOL 中
PGA和 UGA 的区别
PGA是服务于进程的,它包含的是进程的信息 .
UGA是服务于会话的,它包含的是会话的信息 .
四、主要的后台进程
维护实例的进程并不是全都开启的,很多都是特定服务才有的特定进程,特定服务启动特定进程才随之出现,在众多实例进程中有5 个必须进程。
1.SMON 系统监视进程
1.空间管理 : 定期合并空间 ( 老版本才有 ) 定期回收临时段
2.实例恢复 :( 服务器掉电了 实例意外终止 ) 恢复的方法 : 先前滚 ==> 后回滚 ==> 释放资源
前滚 将数据库中的SQL( 包括提交的和未提交的 ) 全部重新做一遍
回滚 将没提交的SQL 句从数据库中将老的镜像取出覆盖
释放资源 将前滚和回滚中使用到的资源释放
2.DBWn n指的是 0-9 a-j 多个写进程的区分 将脏块写盘
触发写的条件
1.产生检查点
2.脏数据缓冲区达到阀值 默认 10%
3.扫描整个 data buffer 没有空闲 data buffer 中包含脏的和未脏的 优先写脏数据列表 再写未改的
4.timeout超时 如果 DBWR 没事做 会被每三秒唤醒一次去巡检 写不写不一定
5.集群环境的 ping 请求触发多实例的数据写请求
6.表级别的 truncate 或 drop 也会触发数据写
7.修改表空间的 read only
8.做表空间的 offline( 离线 )
9.热备份 begin backup 命令
3.PMON 进程监视器
1.清理与实例非法断开的 server_procese 残留的资源 非正常终止的用户进程产生的垃圾资源
2.负责重启以外死掉的调度器 ( 网络监听中使用的 )
3.将实例的信息注册到监听程序
4.CKPT 把新的检查点写入指定位置
1.调度数据写 dbwN
2.将新检查点写数据文件头
3.将新检查点写控制文件中的数据文件头的记录
5.LGWR 只有一个进程 不会向数据写进程那么多 因为写要求有顺序 将 redo log buffer 里的条目 写到 redo 文件
触发写的条件
1.commit
2.redo log buffer 1/3满
3.redo log buffer 日志缓冲区达到 1M
4.写日志优先
当DBWR 要写脏数据时 , 要检查脏数据对应的日志是否写盘 , 如果日志还没写 , 会优先写日志
5.3秒写一次
五、DB 的结构
从运行中的数据库来看有两大类
1.离线文件 ( 非核心 )
参数文件 密码文件 归档日志
2.在线文件 ( 核心 )
数据文件 控制文件 联机日志文件( 重做日志 )
以后会专门讲每种文件的作用 维护方法
这里只简要描述一下
数据文件 存放系统数据和用户数据的空间
控制文件 描述着数据库结构和形态
重做日志 记录着数据库中的一切改动数据的SQL 条目
参数文件 实例初始化的形态说明
密码文件 sys 管理员的密码验证文件
归档日志 重做日志的备份文件
后面我会具体讲解每个部分,这里只是简单的从整体概括。