Oracle筑基篇-体系结构概览
1、体系结构一览
今天梳理Oracle的整体的体系结构,后面再详细梳理其中重要的那些结构。
图1 Oracle体系机构思维导图
2、组件作用概述
Oracle有两大块组成,一大块是 Oralce实例(oracle instance)一大块是 Oralce数据库(oracle database),Oracle数据库是实实在在存储在硬盘上的三类文件:数据文件、日志文件和控制文件。
数据库启动起来以后,首先在内存划出一块空间来给Oracle使用,这个块内存叫Oracle内存,接着会启动一堆进程,我们把内存和进程统称为Oracle实例,只有数据库启动起来以后才有实例的产生,oracle数据库关闭后就没有oracle实例了。
Oracle各个部分介绍如表1所示:
表1 Oracle体系结构表
组成 | 介绍 | ||
SGA | 数据库缓冲区高速缓存 | 数据库缓冲区高速缓存,也称为缓冲区高速缓存,是用于存储从数据文件读取的数据块副本的内存区域。缓冲区是缓冲区管理器用来暂时缓存当前或最近使用的数据块的主内存地址。所有同时都连接到一个数据库实例的用户,以共享方式访问缓冲区高速缓存。 | |
重做日志缓冲区 | 重做日志缓冲区是 SGA 中的一个循环式缓冲区,用来存储对数据库所做更改的重做条目。重做条目包含用于重建(或重做)由 DML 或 DDL 操作对数据库所做更改所需的信息。数据库恢复将重做条目应用到数据文件,以重建丢失的更改。 | ||
共享池 | 共享池缓存各种类型的程序数据。例如,共享池存储已解析的 SQL、 PL/SQL 代码、 系统参数、和数据字典信息。几乎数据库中发生的每个操作 都涉及到共享池。例如,如果用户执行一个 SQL 语句,则 Oracle 数据库会访问共享池。 | ||
大池 | 可选的内存区域,提供比共享池更大的内存分配 , 避免性能开销并更好地满足大型内存请求。 用于共享服务器的 UGA、Oracle XA 接口、并行执行中的消息缓冲区、RMAN I/O 缓冲区等。 比共享池更适合分配较大内存。 | ||
Java池 | 存储 Java 虚拟机 (JVM) 内的会话特定 Java 代码和数据的内存区。存储 Java 类的共享部分以及每个会话的 Java 状态数据。专用于 Java 会话空间的对象和数据。 可通过 Java 池顾问提供统计信息并调整池的大小,当 statistics_level 设置为 TYPICAL或更高时,Java 池顾问在内部会被打开。这些统计信息在顾问被关闭时会被重置。 | ||
流池 | 流池用于存储缓冲的队列消息,并为 Oracle 流的捕获进程和应用进程提供 内存。流池专门由 Oracle 流使用。 如果没有专门配置流池,则其大小从零开始。池池的大小由 Oracle 流按需动态增长。 | ||
固定SGA | 固定 SGA 是内部的内务管理区域。 1.有关数据库及其实例状态的一般信息,后台进程需要访问这些信息 2.进程间通讯的信息,如有关锁的信息 | ||
PGA | SQL 工作区 | 工作区是在 PGA 中为内存密集型操作分配的私有内存区。例如,排序操作 使用排序区来对一组行进行排序。同样,哈希联接操作将其左侧数据为输入,并使用哈希区来创建一个哈希表,而位图合并操作则使用位图合并区来合并从扫描多个位图索引检索到的数据。 | |
会话内存 | 专用服务器私有的,共享服务器共享共享的 | ||
私有 SQL 区 | 私有 SQL 区保存了有关某个已解析的 SQL 语句的信息,和其他特定于会话的信息。当服务器进程执行 SQL 或 PL/SQL 代码时,该过程使用其私有SQL 区域,来存储绑定变量值、 查询执行状态信息、和查询执行工作区。 | ||
进程结构 | 客户端进程 | 这些进程被创建和维护,主要用来运行应用程序代码或 Oracle 工具。 多数环境中都由单独的计算机来运行客户端进程。不属于Oracle。 | |
后台进程 | 与数据库实例同时启动,并执行一些维护任务,如 执行实例恢复、清理进程、将重做缓冲区写入磁盘等。 | ||
服务端进程 | 基于客户端请求,执行相应的工作。例如,这些进程解析 SQL 查询、将查询放入共享池、为查询 创建并执行查询计划、和将数据从数据库缓冲区高速缓存(或 从磁盘)读入缓冲区。 | ||
从属进程 | 为后台进程或服务器进程执行额外任务。 | ||
控制文件 | 每个 Oracle 数据库都有一个控制文件。 控制文件包含指定数据库物理结构的元数据,包括数据库名称,及数据库文件的位置和名称等。 | ||
数据文件 | 每个 Oracle 数据库都有一个或多个物理数据文件,其中包含数据库的所有数据。数据库的逻辑数据结构,如表和索引,在物理上存储在 这些数据文件中。 | ||
重做日志文件 | 每个数据库都有一个联机重做日志,它包含两个或更多联机重做日志文件。 一个联机重做日志由许多重做项组成(也称为重做记录), 以记录对数据所做的所有更改。 |
3、RAC + ADG架构图
Oracle实例和数据库一般是1:1的关系,但也有些多个实例对应一个数据库,生产中也较常用,这种架构再Oracle中叫做RAC,开发中称作集群,目的是为了提高数据库的高可用性以及吞吐能力,一台数据库宕机之后另一台还能接着工作。
比如下面这个19cRAC+ADG是我工作场景用的比较多的架构,双主双备,相当于4个实例对应两个数据库。
一个用户要访问数据库,他连接到的是实例,通过实例来访问数据库,比如有100个用户要访问数据库,RAC架构(左边的两个数据库实例)通过负载均衡算法(轮询、随机、负载等)实现50个用户访问实例一,50个用户访问实例二,从理论上讲数据库并发提升了2倍,这就是Oracle的RAC技术,当然也有4个实例对应一个数据库。
ADG(右边的两个数据库实例)通过应用右边的日志和归档实现数据同步从而实现数据库的容灾,也可以用来提供读取服务,甚至再主库双实例都宕机的情况下实现主备切换,不影响对外提供服务.
图2 Oracle19c RAC + ADG架构
todo
Oracle实例作为Oracle工作的主要地方,其结构值得我们研究。其中最重要的是shared pool和buffer cache两个缓存区,作为缓存对象的地方,是OOM内存泄露的重灾区。这篇文章不详细介绍,后续看看能不能图解内存结构。