详解oracle实例内存结构和进程结构
mhr18 2024-09-15 21:53 24 浏览 0 评论
由于内存结构和进程结构关系较紧密,进程会作用到对应的内存区域,比如数据库写入器作用到数据库缓冲区缓存中,日志写入器会作用到日志缓冲区,所以在这里我把内存结构和进程结构会相互配合地进行描述~
Oracle实例内存结构的组成结构:
oracle实例内存结构由两部分组成SGA(系统全局区)和PGA(用户全局区)组成,SGA是一块共享的内存区域,也是最大的一块内存区域;PGA则是用户会话专有的内存区域,每个会话在服务器端都有一块专有的内存区域就是PGA。
SGA组成
篇幅有限,下面对数据库缓冲区、日志缓冲区、共享池做主要介绍
数据库缓冲区缓存
通过指定 DB_CACHE_SIZE 参数的值,可以配置缓冲区高速缓存。缓冲区高速缓存可存放数据文件中块大小为 DB_BLOCK_SIZE 的数据块的副本。缓冲区高速缓存是 SGA 的一部分;因此所有用户都可以共享这些块。 缓冲区缓存 是Oracle用来执行sql 的工作区域,在更新数据时,用户会话不会直接去更新磁盘上的数据,想想,如果允许这么做,那么频繁的磁盘IO对于系统性能的影响是毁灭性的。所以,实际的处理流程是这样的:
select ename,salary from emp where name='阿里巴巴';
首先,当用户提交了该条sql语句,由对应的用户进程(比如我们常用的sql developer)将其发送给服务器,监听程序监听到该条请求,会为其建立一个对应的服务器进程,然后服务器进程会先扫描缓冲区中有没有包含关键行("阿里巴巴")的数据块,如果有,这就算一次缓存命中了,然后相关行会传输到PGA进行进一步处理,最终经过格式化后展示给用户;如果没有命中,那么服务器进程会首先将对应行复制到缓冲区内,然后再返回给客户端。
DML(insert,update,delete)操作同理,加入用户发送一条update语句,服务进程依然先去扫描缓冲区,如果缓存命中,则直接更新,数据变脏;如果没有命中,由服务器进程将对应数据块先从磁盘上复制到缓冲区内,再进行更新操作。
脏缓冲区
如果缓冲区存储的块和磁盘上的块不一致,该缓冲区就叫做“脏缓冲区”,脏缓冲区最终会由数据库写入器(DBWn)写入到磁盘中去。
数据库写入器(DBWn)
数据库写入器是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。
作用:简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。
数据库缓冲区缓存这块内存区域和数据库写入器这块是比较重要的概念,别的数据库产品像mySql也都有对应的实现,只不过叫法不一样罢了。了解这块的时候,要时刻意识到会话是不会直接更新磁盘数据的,会话的更新,插入,删除包括查询等都是先作用到缓冲区上,随后,DBWn会将其中的脏缓冲区转储到磁盘上去。
DBWn什么时候写入?
DBWn是个比较懒的进程,它会尽可能少的进行写入,在以下四种情况它会执行写入:
a.没有任何可用缓冲区(不得不写啊)
b.脏缓冲区过多
c.3秒超时(最晚3秒会执行一次写入)
d.遇到检查点,即checkPoint(检查点),检查点是个Oracle事件,遇到检查点,DBWn会执行写入。比如实例有序关闭的时候会有检查点,DBWn会将所有脏缓冲区写入到磁盘上去的,这很容易理解,要保持数据文件的一致性。
日志缓冲区
重做日志缓冲区是一个循环缓冲区;服务器进程可以用新条目覆盖重做日志缓冲区中已写入磁盘的条目。LGWR 进程的写速度通常都很快,足以确保缓冲区中始终有存储新条目的空间。LGWR 进程将重做日志缓冲区写入磁盘上的活动联机重做日志文件(或活动组成员)中。LGWR 进程将 LGWR 上次写入磁盘以来进入缓冲区的所有重做条目复制到磁盘。
当我们执行一些DML操作(insert,update,delete),数据块发生改变了,产生的变更向量则会写入到重做日志文件中去。有了这些记录,当系统由于断电等因素突然宕掉,数据库缓冲区缓存内的大量脏数据还没来得及写入到数据文件中去,在重新启动的时候,会有一个实例恢复的过程,在此过程中就应用了重做日志记录来使数据保持一致;或者数据库遭遇了物理损坏,比如磁盘损坏了,此时可以通过Oracle的备份恢复工具(如RMAN)进行数据恢复,原理就是 提取备份集-->应用重做日志文件中的变更记录。
日志缓冲区
日志缓冲区是一块比较小的内存区域,它是用来短期存储将写入到磁盘中的重做日志文件中的变更向量的。
日志缓冲区存在的意义依然是为了减少磁盘IO,减少用户的等待时间,试想下,如果每一次用户DML操作都要进行等待重做记录被写入到磁盘中去,体验会有多差劲。
日志写入器(LGWR)
顾名思义,日志写入器(LGWR)就是把日志缓冲区内的内容写入到磁盘的重做日志文件中去,相比数据库写入器(DBWn),日志写入器就勤快多了。
以下三种情况LGWR会执行写入:
a.commit时写入
前面提过,DBWn的写入和commit没有任何关系,如果commit时数据库没有任何记录,那数据就真的丢失了,Oracle 的重做日志就是为了保证数据安全而存在的,commit时,会话会先挂起,等待LGWR将这些记录写入到磁盘上的重做日志文件中,才会通知用户提交完成。所以,LGWR在commit时执行写入,是为了确保事务永不丢失。
b.日志缓冲区的占用率达到1/3。
c.DBWn要写入脏缓冲区前
共享池
共享池是最复杂的SGA结构,大小通过 SHARED_POOL_SIZE 指定。
常见的几个共享池组件:
1.库缓存:库缓存这块内存区域会按已分析的格式缓存最近执行的代码,这样,同样的sql代码多次执行的时候,就不用重复地去进行代码分析,可以很大程度上提高系统性能。
2.数据字典缓存:存储oracle中的对象定义(表,视图,同义词,索引等数据库对象),这样在分析sql代码的时候,就不用频繁去磁盘上读取数据字典中的数据了
3.PL/SQL区:缓存存储过程、函数、触发器等数据库对象,这些对象都存储在数据字典中,通过将其缓存到内存中,可以在重复调用的时候提高性能。
作为DBA,以上内容是必须掌握的,如果大家有兴趣的话可以多了解下这方面内容~
觉得还可以的话动动手指点下关注哦。
相关推荐
- 一文读懂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)