今天分享oracle数据库的体系架构, 主要包括数据库内存结构、后台进程和存储结构三部分内容。
一、Oracle数据库内存结构
Oracle实例的组成
● 用它来访问数据库
● 只能打开一个数据库
● 由内存和后台进程结构组成
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算法决定
default 数据块向内存加载时的默认位置(必须存在)
keep 一些常驻内存的块(默认没开启)
recycle 不被频繁使用的块(默认没开启)
非标准块池.数据块的大小从9I开始可以是2,4,8,16,32这几种,单位是K
和db_block_size相同大小的buffer池 称之为标准块池
其他池则称之为非标准块池
redo log buffer :
联机(重做)日志缓冲区 记录数据库的每个改动向量、就是记录有顺序的SQL条目
这些SQL条目包括系统的改动和UNDO的改动,用户数据的改动
主要是为了数据的增删改过程记录日志的 提高数据安全性
large pool:
大池 存放对那些复杂的程序包分析、RMAN、UGA(共享模式)、异步IO等相关的数据
java pool:
JAVA池 存放JAVA存储过程的分析信息。
用户与数据库建立连接过程图解:
用户进程和服务进程建立连接
一般都是通过TCP协议连接的
用户进程发起连接请求到监听器
监听器接收到连接请求后验证用户的合法性
服务器端产生一个服务进程和用户进程之间建立连接和会话
并为这个服务进程分配一段私有内存PGA作为工作区.
PGA包含两个主要区域:
Stack Space:包含绑定变量和pl/sql数组相关信息
UGA:游标信息 一条SQL执行时的游标信息
会话信息 当前会话的相关信息
工作区:
排序区 当前会话的内存排序的维护
哈希区 多表连接时HASH JOIN过程中使用的内存区域
位图建立区 建立位图索引时可占用的内存区域
位图融合区 多个位图索引合并 or and 运算时占用的区域
注意:工作区内存不足时,会将数据转至临时表空间去.
二、Oracle数据库后台进程
DBWR:将 db_buffer_cache 中的脏块写回到数据文件,可以有多个进程
GWR:将logbuffer中的日志写入到redo文件,commit或者3秒或写满都可促使它工作
CKPT: 更新控制文件与数据文件使其同步,触发DBWR进程,使其将脏读缓存块写入数据文件。
SMON: 当实例崩溃后,DB-buffer-cache中的脏块没写盘,下次启动后需要用数据文件中的数据块(历史版本)和redo进行恢复,实例恢复则由此进程完成,并且当内存中的临时段长时间没使用时,由SMON清理掉
PMON:当一个会话意外断开后,残留在系统中的垃圾,比如锁信息,服务进程等,从dbf中读取数据块到db-buffer-cache,向监听告知当前实例的信息,称之为动态注册,会在启动时,以及相关参数变更时,1分钟一次的条件达成而触发,监听只有知道实例的存在才能为用户建立连接
ARCN:负责归档.因为redo组是循环覆盖方式使用.在覆盖前将redo备份下来叫归档如果数据库之前做了备份,备份以来的redo覆盖了,则以往的备份不能向前恢复.生产库都要归档.除非对数据丢失有容忍的情况下.热备的前提就是归档
三、Oracle数据库存储结构
Oracle server的组成:
oracle11g的逻辑存储结构和物理存储结构:
一个数据库是由多个表空间构成、一个表空间由一个或多个数据文件组成 、一个数据文件由一个或多个区组成 、一个段由一个或多个区构成、一个区由多个连续的oracle数据块组成。
Oracle逻辑存储结构:
表空间:由一个或多个数据文件组成
块:oracle数据库中最小的存储单位
盘区:由一个或多个数据块组成
段:一组盘区,这组盘区组成了被oracle视为一个单位的数据库对象,如表或索引
Oracle物理存储结构:
数据文件
重做日志文件
控制文件
归档日志文件
初始化参数
警报和跟踪日志文件
备份文件
密码文件