Oracle体系结构总结(oracle体系结构是由数据库和什么组成)
mhr18 2024-09-15 21:53 20 浏览 0 评论
一、ORACLE体系结构组成
ORACLE体系结构主要分为:内存结构、进程结构、存储结构。内存结构主要由SGA和PGA构成;进程结构主要由用户进程和ORACLE进程组成;存储结构主要由逻辑存储和物理存储构成。
二、ORACLE内存结构
1、SGA系统全局区是Oracle Instance的基本组成部分,在实例启动时分配。是一组包含一个Oracle实例的数据和控制信息的共享内存结构。主要是用于存储数据库信息的内存区,该信息为数据库进程所共享(PGA不能共享的)。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
2、PGA是一块包含一个服务进程的数据和控制信息的内存区域。你每启动一个数据库进程就会在内存中创建一个pga,它是独有的,非共享。
三、SGA概述
系统全局区是数据服务中实例的必要组成部分,由很多小内存区共同构成,各个小内存区存放不同的信息,系统全局区用于暂存可以被所有进程( 服务进程和后台进程 )共享的信息,对系统的运行性能有好处,SGA在实例启动的时候自动分配 ,实例关闭时自动释放。SGA暂存系统的大量共享数据,对系统性能影响很大,所以需要为SGA选择适当的管理方式。
1、共享池(Shared Pool)
(1)数据字典缓存区(Data Dictionary Cache)
用于存放SQL语句相关的数据文件、表、索引、列、用户、其他的数据对象的定义和权限信息等。
(2)库缓存区(Librabry Cache)
该区域存放共享SQL和PL/SQL代码。服务器进程在执行语句时,首先会匹配库缓存,如果存在相同语句则无需编译直接使用已编译的执行计划。绑定变量不是在编译阶段赋值的,而是在运行阶段赋值的,因此含有绑定变量的SQL语句可以不用重新编译。
(3)SQL和PL/SQL结果缓存
2、大池(Large Pool)
大池是个可选的内存区域,可提供一个大的缓冲区供数据库的备份与恢复操作过程使用。数据库的备份恢复、执行具有大量排序操作的SQL语句、并行化的数据库操作时可能需要用到大池。
3、Java池(Java Pool)
JAVA池在数据库中支持JAVA 的运行,存放JAVA代码和JAVA语句的语法分析表
4、流池(Stream Pool)
用于缓存流进程在数据库间移动/复制数据时使用的队列消息。一般从重做日志中提取变更记录的进程和应用变更记录的进程会用到流池。
5、数据库缓存区(Database Buffer Cache)
用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,来优化数据库的I/O减少物理读/写。Oralce依据LRU算法对该内存区域进行block-level的更新.LRU算法(简单理解就是最近最小使用的数据调出内存)。
(1)脏缓存快(Dirty buffers)
数据被修改过并且已经commit但是还未写入磁盘的数据缓存块,脏缓存块最终被DBWn进程写入到磁盘的数据文件中永久保存。
(2)命中缓存块(Pinned buffers)
最近正在被访问的缓存块,始终被保留在数据高速缓存中,不会被写入数据文件。
(3)空闲缓存块(Free buffers)
该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。
6、日志缓冲区(Redo Log Buffer)
日志缓冲区是一块比较小的内存区域,它是用来短期存储将写入到磁盘中的重做日志信息。日志缓冲区也是为了减少磁盘IO,减少用户的等待时间。
四、PGA
PGA是指单个服务器进程或者单个后台进程所需的数据和控制信息。PGA是在用户进程连接到数据库并创建一个会话时自动分配。该区域内保留每个与oracle数据库连接的用户进程所需的内存,当一个用户会话结束,PAG就会释放。 排序区
1、排序区
当用户需要对数据进行排序时,系统会将需要排序的数据保存到PGA中的排序区内,然后在这个排序区内对这些数据进行排序。如果发现用户的很多操作都需要用到排序,那么为用户设置比较大的排序区,可以提高用户访问数据的效率。
2、会话区
会话区保存了会话所具有的权限、角色、性能统计等信息,通常都是由数据库系统自我维护。
3、 堆栈区
保存着绑定变量、会话变量、SQL语句运行时的内存结构等重要的信息,通常都是由数据库系统自我维护
4、游标区
游标区是一个动态的区域,当用户执行游标语句打开游标时,系统会在PGA中创建游标区,当关闭游标时,这个区域就会被释放。创建与释放需要占用一定的系统资源,花费一定的时间,如果频繁的打开和关闭游标,就会降低语句的执行性能。
五、进程结构
1、SMON
系统监视器进程,负责打开数据库时候的恢复、整理数据库表(段)空间的碎片等。它通过验证所有数据文件和联机重做日志文件来打开数据库。数据库状态置为open之后,SMON的主要工作内容就放在各种内部任务上,如合并空闲空间,处理表(段)空间碎片。
2、PMON
进程监视器进程,负责监视所有服务器进程,并且检查连接会话中的问题。如果会话异常中止,PMON会及时销毁对应的服务器进程,将PGA内存返回给系统空闲内存池,并回滚所有未提交的事务。
3、DBWn
数据库写进程,它主要负责将Database Buffer Cache中的脏缓冲区写入数据文件,做持久化。这里需要再次声明,数据库写进程DBWn是不受我们commit影响的,我们commit影响的是日志写进程LGWR。DBWn选择要写入的脏缓冲区的原则是:最近最少使用。也就是说,DBWn将最近最少使用的脏缓冲区写入数据文件。
以下四种情况,DBWn将执行写操作:
(1)没有可用的缓冲区
当数据被读取到Database Buffer Cache时,需要先查找空闲的缓冲区,也就是说既不脏也没被占用的缓冲区。如果长时间找不到空闲缓冲区,那么DBWn就会将某些脏缓冲区写入磁盘。完成之后,就有可用的空闲缓冲区了。
(2)脏缓冲区过多
第二种情况是脏缓冲区过多,这个多是由Oracle一个内部值决定的。
(3)每三秒钟(三秒钟超时)
第三种情况,三秒钟超时。DBWn每三秒钟会对一些缓冲区进行写操作。前面两种情况是强制写,而三秒钟超时意味着即使没有脏缓冲区,也要DBWn也要执行一次清理。
(4)遇到检查点
前面三种情况是部分写入(称为增量检查点或提高增量检查点位置),最后这种情况是全部写入,把所有的脏缓冲区全部写入数据文件。 ?前三种情况是在Oracle运行过程中自动执行的,不会给系统的I/O造成比较大的压力。但是在执行检查点的情况下,可能同时有非常大量的脏缓冲区需要写入磁盘,所以当时的磁盘I/O会到达顶峰,CPU使用率很可能会爆高到100%。因此,一般在不得已的时候才使用检查点:
4、LGWR
日志写进程,负责将日志缓冲区Log Buffer中的内容写入到磁盘的联机(重做)日志文件中,这个写入的过程称为“日志缓冲区转储”。当我们对数据做任何更改时(包括增删改),这个更改会写入到两个缓冲区,一个是Database Buffer Cache ,用于写入到数据文件;另一个是Redo Log Buffer,用于写入联机重做日志文件。为了防止丢失更改,LGWR进程几乎实时地将Redo Log Buffer写入到联机重做日志文件中。当我们commit时,会话挂起,LGWR执行写入操作,写入完成,事务标记为不可callback的已提交返回给会话,会话重新可用。
(1)会话发出commit
保证了已提交commit的事务中的所有变更都可以在联机重做日志中记录,这是数据库数据不丢失的保证。如果数据库损坏,可以在还原上一次备份的基础上,利用自上次备份以来的(归档)联机重做日志进行事务重做。当然,commit的事务会重新写入数据文件,未提交的事务不会持久化存储。
(2)日志缓冲区1/3满
日志缓冲区三分之一满的时候,也会使LGWR执行写操作。一般来说日志缓冲区只有MB级大小,应用程序(比如JAVA程序)会在不到一秒的时间生成足以充满1/3的重做内容(更改),所以说,LGWR会几乎实时地执行写操作。此后,在会话发出commit命令的时候,由于没有太多要一次性写入到日志中的内容,所以commit也几乎是实时完成的。
(3)DBWn要写入数据文件
为了防止瞬间断电等突发情况的发生而导致数据的不一致,DBWn在写入数据文件之前要执行日志写操作,因为日志写操作能提供数据在没有写入数据文件情况下的数据可恢复性。另外由于DBWn的写操作是有三秒钟超时的,而日志写操作必须要在DBWn之前执行一次,所以LGWR也就有了三秒钟超时的触发条件。
5、CKPT
执行CKPT进程会使得DBWn进行写操作。CKPT不再必须执行完全检查点,但是它必须跟踪重做日志中的增量检查点位置。在必要的时候,CKPT会执行增量检查点,以使得增量检查点的位置前移。增量检查点位置是发生故障时,重做开始的位置。CKPT使用当前检查点位置去刷新控制文件。
6、MMON
可管理性监视器进程,以前也叫Memory Monitor,内存监视器进程用于支持Oracle数据库的自我管理和自我调整的进程,简单地理解为“监视器的监视器”。
7、MMAN
MMAN,Memory Manager,内存管理进程,支持内存分配的自动管理。有了这个进程,我们DBA只需要去设置总的内存大小,SGA以及PGA等,MMAN会在DBA设置的总体大小范围内进行自动分配。
8、LREG
侦听器注册进程,它注册了有关数据库实例和Oracle网络监听调度程序的信息。这样,用户就可以通过侦听器连接到数据库。同时LREG还能根据工作负载与性能信息更新侦听器,这在多实例环境下是比较智能的。之前这个功能是由PMON来实现的。
9、ARCn
它将联机重做日志文件的内容写入到归档日志文件中。由于联机重做日志文件只有那么几组,每组几个文件,每个文件就几兆,它们会频繁地被刷新,不可能保留长期且完整的重做条目,所以,为了保证可恢复性,必须在联机重做日志文件被刷新前将其归档。如果启用了归档模式,ARCn将会启动,一旦ARCn异常,数据库实例将会挂起。ARCn最多有30个,命名为ARC1~ARC30。
10、RECO
RECO,Recoverer,恢复进程。它是在分布式架构下,解决分布式事务失败问题的进程。
相关推荐
- 一文读懂Prometheus架构监控(prometheus监控哪些指标)
-
介绍Prometheus是一个系统监控和警报工具包。它是用Go编写的,由Soundcloud构建,并于2016年作为继Kubernetes之后的第二个托管项目加入云原生计算基金会(C...
- Spring Boot 3.x 新特性详解:从基础到高级实战
-
1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...
- 「技术分享」猪八戒基于Quartz分布式调度平台实践
-
点击原文:【技术分享】猪八戒基于Quartz分布式调度平台实践点击关注“八戒技术团队”,阅读更多技术干货1.背景介绍1.1业务场景调度任务是我们日常开发中非常经典的一个场景,我们时常会需要用到一些不...
- 14. 常用框架与工具(使用的框架)
-
本章深入解析Go生态中的核心开发框架与工具链,结合性能调优与工程化实践,提供高效开发方案。14.1Web框架(Gin,Echo)14.1.1Gin高性能实践//中间件链优化router:=...
- SpringBoot整合MyBatis-Plus:从入门到精通
-
一、MyBatis-Plus基础介绍1.1MyBatis-Plus核心概念MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提...
- Seata源码—5.全局事务的创建与返回处理
-
大纲1.Seata开启分布式事务的流程总结2.Seata生成全局事务ID的雪花算法源码3.生成xid以及对全局事务会话进行持久化的源码4.全局事务会话数据持久化的实现源码5.SeataServer创...
- Java开发200+个学习知识路线-史上最全(框架篇)
-
1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...
- OpenResty 入门指南:从基础到动态路由实战
-
一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...
- 你还在为 Spring Boot3 分布式锁实现发愁?一文教你轻松搞定!
-
作为互联网大厂后端开发人员,在项目开发过程中,你有没有遇到过这样的问题:多个服务实例同时访问共享资源,导致数据不一致、业务逻辑混乱?没错,这就是分布式环境下常见的并发问题,而分布式锁就是解决这类问题的...
- 近2万字详解JAVA NIO2文件操作,过瘾
-
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。从classpath中读取过文件的人,都知道需要写一些读取流的方法,很是繁琐。最近使用IDEA在打出.这个符号的时候,一行代...
- 学习MVC之租房网站(十二)-缓存和静态页面
-
在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用、发邮件,并将通过UEditor上传的图片保存到云存储。在项目的最后,再学习优化网站性能的一些技术:缓存和...
- Linux系统下运行c++程序(linux怎么运行c++文件)
-
引言为什么要在Linux下写程序?需要更多关于Linux下c++开发的资料请后台私信【架构】获取分享资料包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdf...
- 2022正确的java学习顺序(文末送java福利)
-
对于刚学习java的人来说,可能最大的问题是不知道学习方向,每天学了什么第二天就忘了,而课堂的讲解也是很片面的。今天我结合我的学习路线为大家讲解下最基础的学习路线,真心希望能帮到迷茫的小伙伴。(有很多...
- 一个 3 年 Java 程序员 5 家大厂的面试总结(已拿Offer)
-
前言15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...最终有幸去了网易。但是要...
- 多商户商城系统开发全流程解析(多商户商城源码免费下载)
-
在数字化商业浪潮中,多商户商城系统成为众多企业拓展电商业务的关键选择。这类系统允许众多商家在同一平台销售商品,不仅丰富了商品种类,还为消费者带来更多样的购物体验。不过,开发一个多商户商城系统是个复杂的...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
-
Java SE Development Kit 8u441下载地址【windows版本】
-
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)