暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle体系结构详解

原创 kobrey 2021-07-19
488

对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的。同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专业人员来讲,这些都是必备知识了),一般的技术人员如果对其有较深入的了解,也是大有益处的,毕竟技术思想很多时候都是相通的嘛。本文就从不同维度,如Oracle的内存结构,进程结构,存储结构等方面做相应描述。

目录

一、什么是Oracle数据库?

二、交互流程

三、实例内存结构和进程结构

四、Oracle存储结构

五、总结

首先我们来说说基础的概念吧

一、什么是Oracle数据库?

众所周知,Oracle DataBase是一款关系型数据库管理系统(不了解何谓关系型数据库的童鞋自行google,baidu),同类的产品还有mySql,sqlServer等,很多时候,我们会把那个承载我们核心数据的系统笼统地成为数据库服务器,但从严格意义上来讲Oracle DataBase是由两个部分组成:

实例:实例是数据库启动时初始化的一组进程和内存结构

数据库:数据库则指的是用户存储数据的一些物理文件

正因为如此我们一般才会说 关闭和启动实例,加载卸载数据库,就是这个道理。

从实例和数据库的概念上来看,我们能知道,实例暂时的,它不过是一组逻辑划分的内存结构和进程结构,它会随着数据库的关闭而消失,而数据库它其实就是一堆物理文件(控制文件,数据文件,日志文件等等),它是永久存在的(除非磁盘损坏)。数据库和实例通常是一对一的,这种结构我们成为单实例体系结构;当然还有一些复杂的分布式的结构,一个数据库可以对多个实例,像Oracle的RAC(有兴趣的童鞋可以了解下)。

二、交互流程

下面是从网上找的一张图,描述了单实例体系结构大致的交互流程

1.用户和用户进程交互

用户进程可以是一般的客户端软件,像Oracle的sqlplus,sql developer,或者是一些驱动程序等等都属于用户进程。

2.用户进程和服务器进程交互

服务器进程有时会称为前台进程,当然是相对于后台进程(后面会提到的数据库写入器,日志写入器等)来说的,服务器进程的主要作用就是处理连接到当前实例的用户进程的请求,对客户端发来的sql进行执行并返回执行结果。在专有服务器结构中,用户进程和服务器进程是一对一的,也就是说,当监听程序监听到客户端来了一个请求,会为其分配一个对应的服务器进程。还有一种结构为共享服务器,这种结构就不是一个用户进程对应一个服务器进程了,会通过调度程序进行协调处理,关于共享服务器连接,本文就不在赘述了。

3.服务器进程和实例进程交互

4.实例和数据库进程交互

上面描述了一些我们在进行数据库连接操作的时候,大致的交互流程是什么样的。下面,我们就来看看Oracle 的实例内存结构

三、实例内存结构和进程结构

(由于内存结构和进程结构关系较紧密,进程会作用到对应的内存区域,比如数据库写入器作用到数据库缓冲区缓存中,日志写入器会作用到日志缓冲区,所以内存结构和进程结构会相互配合地进行描述)

oracle实例内存结构由两部分组成SGA(系统全局区)和PGA(用户全局区)组成,SGA是一块共享的内存区域,也是最大的一块内存区域;PGA则是用户会话专有的内存区域,每个会话在服务器端都有一块专有的内存区域就是PGA。本文主要对SGA进行分析描述。SGA组成如下

数据库缓冲区缓存&数据库写入器

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

select ename,salary from emp where name=‘东方不败’;

我们来看这么一条简单的查询语句,oracle是如何处理的。首先,当用户提交了该条sql语句,由对应的用户进程(比如我们常用的sql developer)将其发送给服务器,监听程序监听到该条请求,会为其建立一个对应的服务器进程,然后服务器进程会先扫描缓冲区中有没有包含关键行(“东方不败”)的数据块,如果有,这就算一次缓存命中了,然后相关行会传输到PGA进行进一步处理,最终经过格式化后展示给用户;如果没有命中,那么服务器进程会首先将对应行复制到缓冲区内,然后再返回给客户端。

DML(insert,update,delete)操作同理,加入用户发送一条update语句,服务进程依然先去扫描缓冲区,如果缓存命中,则直接更新,数据变脏;如果没有命中,由服务器进程将对应数据块先从磁盘上复制到缓冲区内,再进行更新操作。

脏缓冲区

如果缓冲区存储的块和磁盘上的块不一致,该缓冲区就叫做“脏缓冲区”,脏缓冲区最终会由数据库写入器(DBWn)写入到磁盘中去。

数据库写入器(DBWn)

数据库写入器是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。

作用:简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。

数据库缓冲区缓存这块内存区域和数据库写入器这块是比较重要的概念,别的数据库产品像mySql也都有对应的实现,只不过叫法不一样罢了。了解这块的时候,要时刻意识到会话是不会直接更新磁盘数据的,会话的更新,插入,删除包括查询等都是先作用到缓冲区上,随后,DBWn会将其中的脏缓冲区转储到磁盘上去。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论