Oracle架构实现原理、含五大进程解析

目录

  • 目录
  • 前言
  • Oracle的体系结构
    • Oracle RDBMS架构图
    • 存储结构
      • 物理结构

        • Data Files
        • Redo Log Files
        • Control Files
        • Parameter File
        • Password File
      • 逻辑结构
      • 逻辑空间到物理空间的映射
    • 内存结构
      • 系统全局区SGA

        • 高速缓存缓冲区数据库缓冲区
        • 日志缓冲区
        • 共享池
        • 大型池
        • JAVA池
    • 进程结构
      • 用户连接进程

        • 程序全局区PGA
        • 用户进程User Process
        • Server Process服务进程
      • 后台进程
      • 数据库写入进程DBWn
      • 检查点CKPT
      • 进程监视进程PMON
      • 系统监视进程SMON
      • 重做日志文件和日志写入进程
      • 归档进程ARCn
    • 执行一条写入的SQL语句时在RDBMS中都发生了什么
  • 最后

前言

Oracle架构,讲述了Oracle RDBMS的底层实现原理,是Oracle DBA**调优排错**的基础理论。深入理解Oracle架构,能够让我们在Oracle的路上走的更远。对Oracle体系结构的理解是一个深远的过程,需要不断的更新修改,如有不对,还望指正。:)

Oracle的体系结构

Oracle RDBMS架构图

Oracle Server = 实例 + 数据库 (Instalce和Database是相互独立的)

  • 数据库 = 数据文件 + 控制文件 +日志文件
  • 实例 = 内存池SGA + 后台进程

==> Oracle Server = 内存池 + 后台进程 + 数据文件 + 控制文件 + 日志文件

一套Oracle RDBMS支持创建多个Database,而且每个Datacase是互相独立的。不同的Database拥有属于自己的全套相关文件,例如:有各自的密码文件,参数文件,数据文件,控制文件和日志文件。

Database由一些物理文件(存放在存储设备中的二维表文件)组成,我们的表存储在Database中。Database的内容不能被我们直接读取,必须通过Oracle instance来访问Database,一个Instance只能连接一个Database,但是一个Database可以被多个Instance连接。

将上面的Oracle架构图进行抽象分类,可以将Oracle架构抽象为:Oracle体系 = 内存结构 + 进程结构 + 存储结构

存储结构

Oracle RDBMS存储结构主要由Database组成。

又能够将Database分为物理结构逻辑结构来理解。

物理结构

Database物理结构:是Database在操作系统中的文件集合,即:磁盘上的物理文件,主要由数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件组成。

Data Files

数据文件是数据的存储仓库。

? 包括所有的数据库数据

? 只能属于一个数据库

? 来自于被称为”表空间”的数据库存储逻辑单元

? 可以直接被读进内存,在执行SQL语句的时候,会将相关的数据文件副本加载如数据缓冲区。

? 通过备份策略可以使数据文件得到保护

Redo Log Files

重做日志文件包含对数据库所做的更改操作记录,在Oracle发生故障时能够恢复数据。

能够恢复数据的原理:重做日志文件会按时间的顺序,将应用于数据库的一连串的变更向量(做了什么操作)存储起来(即将变更的地方标记起来)。其中包含了所有已经完成操作的信息和完成操作之前的数据库状态。如果数据文件受损,就可以将这些变更向量应用于数据文件备份来进行重做(重建)工作,将它恢复到发生故障的那一刻前的状态。重做日志文件又分为下面两种类型:

  • 联机重做日志文件:记录连续的数据库操作
  • 归档日志文件Archived Log Files:用于时间点恢复,当RedoLogFiles存满时,会对这些日志进行归档备份,以便以后还原数据时使用。
    • 查看redo log info
SQL> select member from v$logfile;    # v$logfile数据字典,记录了redolog文件的列表
 MEMBER
--------------------------------------------------------------------------------
 /u01/oradata/demo/redo03.log
 /u01/oradata/demo/redo02.log
 /u01/oradata/demo/redo01.log

Control Files

控制文件包含维护和验证数据库完整性的必要的信息。

它记录了联机重做日志文件、数据文件的位置、更新的归档日志文件的位置。它还存储着维护数据库完整性所需的信息。控制文件不过数MB,却起着至关重要的作用。

Parameter File

实例参数文件,当启动oracle实例时,SGA结构会根据此参数文件的设置内存,后台进程会据此启动。

Password File

用户通过提交username/password来建立会话,Oracle根据存储在数据字典的用户定义对用户名和口令进行验证。

逻辑结构

表空间就是典型的Oracle逻辑结构类型 —— 里面存放着若干的数据文件

表空间:用于存储数据库对象的逻辑空间,表空间是在数据库中开辟的一个空间,用于存放数据库的对象,它是信息存储的最大逻辑单位,是存放数据库文件的地方,其中数据又被存放在表空间中的数据文件中。一个数据库可以由多个表空间组成,Oracle的调优就是通过表空间来实现的。(Oracle数据库独特的高级应用)

表空间的作用:分类管理、批量处理; 将琐碎的磁盘文件整合、抽象处理成为逻辑结构。这样更加便于我们去管理数据库。

逻辑空间到物理空间的映射

段、区和块

内存结构

Oracle Instance是Oracle RDBMS的核心之一,作为整个RDBMS的管理中心。而Oracle Instance主要由内存池后台进程组成。

系统全局区SGA

查看SGA:本质就是内存池

SQL> conn /as sysdba
Connected.
SQL> show user;
USER is "SYS"
SQL> select * from v$sga;
NAME              VALUE
-------------------- ----------
Fixed Size      2022144
Variable Size         503317760
Database Buffers     1627389952
Redo Buffers           14753792

SQL> show sga
Total System Global Area 2147483648 bytes
Fixed Size          2022144 bytes
Variable Size         503317760 bytes
Database Buffers     1627389952 bytes
Redo Buffers           14753792 bytes

SGA(System Global Area)是与Oracle性能关系最大的核心部分,SGA内存池会在Instance启动时分配,在关闭时释放。在一定范围内,可以在Instance运行时通过自动方式响应DBA的指令。SGA包含了如下几种数据结构:

高速缓存缓冲区(数据库缓冲区)

数据库缓冲区是oracle执行SQL语句的区域

例如在更新数据时,用户执行的SQL语句不会直接对磁盘上的数据文件进行更改操作,而是首先将数据文件复制到数据库缓冲区缓存(就是说数据库缓冲区里会存放着SQL相关数据文件副本),再更改应用于数据库缓冲区缓存中这些数据块的副本。而且数据块副本将在缓存中保留一段时间,直至其占用的缓冲区被另一个数据库覆盖为止(缓冲区Size有限)。

在查询数据时,为了提高执行效率,查询的数据也要经过缓存。建立的Session会计算出那些数据块包含关键的行,并将它们复制到数据库缓冲区中进行缓存。此后,相关关键行会传输到Session的PGA作进一步处理。这些数据块也会在数据库缓存区缓存中保留一段时间。

一般情况下,被频繁访问的数据块会存在于数据库缓冲区缓存中,从而最大程度地减少对磁盘I/O的需要。

那什么时候会将被更新的数据块副本写入到磁盘中的数据文件呢?

答:如果在缓冲区缓存中存储的数据块与磁盘上的数据块不同时,那么这样的缓冲区常称为“脏缓冲区”,脏缓冲区中的数据块副本就必须写回到磁盘的数据文件中。

注意:数据库缓冲区缓存的大小会对性能产生至关重要的影响。

1. 缓存应足够大,以便能缓存所有被频繁访问的数据块。

2. 但也不能太大,以至于它会将极少被访问的块也一并加入到缓存中,这样会增长在缓存中搜索的时间。

3. 如果缓存过小,那么将导致磁盘I/0活动过多,因为频繁访问的数据块持续从磁盘读取,并由其他数据块使用和重写,然后再从磁盘读取。

数据库缓冲区缓存在Instance启动时被分配。从数据库9i开始,可以随时将其调大或调小。可以采用手动方式重调,也可以根据工作负荷自动重调大小(事务)。

修改缓冲区DB_CACHE_SIZE地方法

#Step1. 查看SGA的大小:因为DB_CACHE_SIZE的size受SGA的影响
SQL> show parameter sga_max_size;                               NAME                     TYPE    VALUE
                                        ------------------------------------ ----------- ------------------------------
                                        sga_max_size                 big integer 2G

#Step2. 查看show parameter shared_pool_size的大小
SQL> show parameter shared_pool_size;                   NAME                     TYPE    VALUE
                                        ------------------------------------ ----------- ------------------------------

shared_pool_size             big integer 0

#Step3. 计算DB_CACHE_SIZE的大小:shared_pool_size + db_cache_size = SGA_MAX_SIZE * 70%

#Step4. 修改DB_CACHE_SIZE的大小
SQL> alter system set db_cache_size=1433M scope=spfile sid=‘demo‘;

System altered.

SQL> conn sys /as sysdba
Enter password: ********
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size          2022144 bytes
Variable Size         503317760 bytes
Database Buffers     1627389952 bytes
Redo Buffers           14753792 bytes
Database mounted.
Database opened.

SQL> show parameter db_cache_size

日志缓冲区

日志缓冲区是小型的、用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域。主要作用是提供更加快的日志处理效率。

共享池

共享池的大小对性能产生重要影响

1. 它应该足够大,以便缓存所有频繁执行的代码和频繁访问的对象定义。

2. 但也不能过大,以至于连仅执行一次的语句也要缓存。

3. 如果共享池过小,则性能下降,因为服务器会话将反复抢夺其中的空间来分析语句,此后,这些语句会被其他语句重写,在重新执行时,将不得不再次分析。

4. 过大的共享池也会对性能产生不良影响,因为搜索需要的时间过长。

5. 如果共享池小于最优容量,则性能将下降。但有一个最小容量,如果低于此限度,则语句将失败。

确定最优容量是一个性能调整问题,大多数数据库都需要一个数百MB的共享池。有些应用程序需要1GB以上的共享池,但很少有应用程序能够在共享池小于100MB时充分运行。共享池内有下列三种数据结构:

  • 库缓冲:存储最近执行的代码
  • 数据字典缓存:存储最近使用的对象定义
  • PL/SQL缓冲区:存储的PL/SQL对象是过程、函数、打包的过程、打包的函数、对象类型定义和触发器。

手动的调整共享池的大小

select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components;   //显示可以动态重设大小的SGA组件的当前最大和最小容量

ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;

大型池

主要用途是供共享的服务器进程使用。

JAVA池

只有当应用程序需要在数据库中运行java存储程序时,才需要java池。

进程结构

进程结构主要是由后台进程用户连接进程组成。

用户连接进程

连接和管理用户访问 = 用户进程 + 服务进程 + PGA

程序全局区PGA

PGA是连接用户和Oracle的桥梁。

PGA用于为用户连接时分配内存、Oracle RDBMS需要使用这些内存来创建Instence、只有在Instance创建完成后,用户才能够通过Instance来连接并管理Oracle Database。

用户进程User Process

Oracle的connect连接和session会话与User Process紧密相关

1. connect连接:是User Process和Oracle Instance之间的通信通道,一个连接对应一个实例。

2. session会话:一个用户通过User Process与Oracle Instance建立连接后称之为一个会话,一个用户可以建立多个会话,即可以同时使用同一个用户可以多次的连接到同一个实例。多个会话可以使用同一个连接。

Server Process服务进程

用于处理User和Server之间的连接

后台进程

后台进程主要是完成数据库管理任务 ,后台进程是Oracle Instance和Oracle Database的联系纽带,分为核心进程和非核心进程。

1. 核心进程:核心进程,必须存在,有一个终止,所有数据库进程全部终止,实例崩溃!其中五大进程全都是核心进程。

2. 非核心进程:完成数据库的额外功能,非核心进程死亡数据库不会崩溃!

常用的核心进程

在访问数据库时,首先会启动实例。启动实例前要先分配SGA内存池,然后启动后台进程。数据库启动过程中必须启动上面的前五个进程。否则实例无法创建。

查看后台核心进程:

SQL> select name,description from v$bgprocess where paddr<>‘00‘;

NAME  DESCRIPTION
----- ----------------------------------------------------------------
PMON  process cleanup
PSP0  process spawner 0
MMAN  Memory Manager
DBW0  db writer process 0
LGWR  Redo etc.
CKPT  checkpoint
SMON  System Monitor Process
RECO  distributed recovery
CJQ0  Job Queue Coordinator
QMNC  AQ Coordinator
MMON  Manageability Monitor Process

NAME  DESCRIPTION
----- ----------------------------------------------------------------
MMNL  Manageability Monitor Process 2

数据库写入进程(DBWn)

Server process连接Oracle后,通过数据库写进程(DBWn)将数据缓冲区中的“脏缓冲区”的数据块写入到存储结构(数据文件、磁盘文件)

Database writer (DBWn)数据库写进程

只做一件事,将数据写到磁盘。就是将数据库的变化写入到数据文件。

该进程最多20 个,即使你有36 个CPU 也只能最多有20 个数据库写进程。

进程名称DBW0-DBW9 DBWa-DBWj

注意:数据库写进程越多,写数据的效率越高。该进程的个数应该和cpu的个数对应,如果设置的数据库写进程数大于CPU 的个数也不会有太明显的效果,因为CPU 是分时的。

检查点(CKPT)

Checkpoint (CKPT)检查点进程

主要用户更新数据文件头,更新控制文件和触发DBWn数据库写进程。

Ckpt 进程会降低数据库性能,但是提高数据库崩溃时,自我恢复的性能。我们可以理解为阶段性的保存数据,一定的条件满足就触发,执行DBWn存盘操作。

进程监视进程(PMON)

Process monitor (PMON)进程监测进程

PMON在后台进程执行失败后负责清理数据库缓存和闲置资源,是Oracle的自动维护机制。

  • 清除死进程
  • 重新启动部分进程(如调度进程)
  • 监听的自动注册
  • 回滚事务
  • 释放锁
  • 释放其他资

系统监视进程(SMON)

System monitor (SMON)系统监测进程

SMON启动后会自动的用于在实例崩溃时进行数据库实例自动恢复。

清除作废的排序临时段,回收整理碎片,合并空闲空间,释放临时段,维护闪回的时间点。

在老数据库版本中,当我们大量删除表的时候,会观测到SMON进程很忙,直到把所有的碎片空间都整理完毕。

重做日志文件和日志写入进程

主要用于记录数据库的改变和记录数据库被改变之前的原始状态,所以应当对其作多重备份,用于恢复和排错。

激活日志写入进程的情况:

- 提交(回车)

- 日志缓冲区超过1/3

- 每三秒

- 每次DBWn执行之前

归档进程(ARCn)

归档进程(ARCn)是非核心进程。

执行一条写入的SQL语句时在RDBMS中都发生了什么

1. 将SQL语句加载入数据库缓冲区

2. 将SQL语句要操作的数据文件副本加载入数据库缓冲区

3. 执行SQL语句,修改数据文件副本,形成“脏缓冲区”

4. CKPT检测到“脏缓冲区”,调用DBWn

5. 在DBWn运行之前,先运行了LGWR,将数据文件的原始状态和数据库的改变记录到Redo Log Files

6. 运行DBWn,将“脏缓冲区的内容写入到数据文件”

7. 同时CKPT修改控制文件和数据文件头

8. SMON回收不必要的空闲资源

最后

最后我们举个例子来看看Oracle RDBMS是怎么运作的

  1. 用户访问数据库之前提交一个请求,需要先启动一个实例
  2. 在启动实例之后用户可以连接到服务进程,完成建立连接
  3. 由服务进程调用PGA来为用户分配创建实例所必需的内存SGA
  4. 用户执行SQL语句,由服务进程接收到
  5. SQL语句通过服务进程到达Oracle Instance,再将SQL载入数据库缓冲区
  6. 服务进程通知Oracle Database将数据块加载到缓冲区中,生成数据块副本
  7. 并在数据库缓存区执行SQL语句
  8. 将用户登录、进程调用、数据文件的原始状态、数据库的改变记录到Redo Log Files
  9. 当数据库缓冲区出现了“脏缓冲区”时,将更新的内容写入数据文件
时间: 2024-08-19 11:10:41

Oracle架构实现原理、含五大进程解析的相关文章

Oracle架构实现原理(转)

Oracle RDBMS架构图 一般我们所说的Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle数据库管理系统,也称之为Oracle Server.而Oracle Server主要有两大部分: Oracle Server = 实例 + 数据库 (Instance和Database是相互独立的) 数据库 = 数据文件 + 控制文件 +日志文件 实例 = 内存池 + 后台进程 所以可以细分为: Oracle S

大神必修课系列之java 分布式架构的原理解析

分布式术语 1.1. 异常 服务器宕机 内存错误.服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用. 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上. 网络异常 有一种特殊的网络异常称为--网络分区 ,即集群的所有节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信. 磁盘故障 磁盘故障是一种发生概率很高的异常. 使用冗余机制,将数据存储到多台服务器. 1.2. 超时 在分布式系统中,一个请求除了成功和失败两种状态,还存在着超时状态. 可以

Spark(一): 基本架构及原理

Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一,与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势: Spark提供了一个全面.统一的框架用于管理各种有着不同性质(文本数据.图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求 官方资料介绍Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍

数据库学习之--Oracle 架构与MySQL架构对比

数据库学习之--Oracle 架构与MySQL架构对比 一.Oracle .MySQL应用对比 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连续12年销售额每年翻一番. Oracle成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A

JAVA读书推荐----《深入分析Java Web技术内幕》--《java多线程编程核心技术》--《大型网站技术架构 核心原理与案例分析》-《Effective Java中文版》

(1)  首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life. 目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客.这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是: 1.随便开篇点明该设计模式的定义 2.图文并茂讲解该设计模式中的结构 3.以详细的代码形式写一下该种设计模式的实现 4.补充内容 5.讲解该设计模式的优缺点 对于一个设计模式我们关

Oracle Shared Pool 原理

Oracle Shared Pool 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch,library cache lock,library cache pin. What is shared pool? Shared pool是SGA中的一部分,由于它是SGA的一部分,这意味着它可以被所有的进程所访问,Shared Pool当中主要包含了2部分:library cache和dicti

Java大型互联网-构建高并发和高可用的电商平台架构实践原理

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. "高可用性"(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性. 一. 设计理念 1. 空间换时间 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才是检索结果.首先,电商的搜索引擎并没有爬虫系统,因为所有的数据都是结构化的,一般都是微软的数据库或者 Oracle 的数据库,所以不用像百度一样用「爬虫」去不断去别的网站找内容,当然,电商其实也有自己的「爬虫」系统,一般都是抓取友商的价格,再对自己进行调整. 第二点,就是电商搜索引擎的过滤功能其实比

以属性为核心驱动的 全领域通用架构设计原理 (简称:属性架构原理)

以属性为核心驱动的全领域通用架构设计原理 (简称:属性架构原理) 联系方式:13547930387 Email:[email protected] 一.个人声明 我,参加工作也有5年多了,是一名普通的不能在普通的程序员,一直在使用公司自己的产品进行开发,因此技术比较菜,此设计完全是按照自己天真的想法而设计的,如果有不合理或很搞笑的地方,请轻拍,由衷的希望大家能提出宝贵的意见: 根据此设计原理我也做了一个简单的(demo)架构来支撑和验证此理论的可行性,由于技术功底不太好,有不合理之处请大家谅解,