Oracle体系结构:聊聊session与process

提前声明:本篇文章讨论的是专用服务器模式下的session和process;不讨论共享服务器模式,因为共享服务器现在真的应用的很少了,独占才是主流。共享服务器往往都是用在资源紧张的场合 ,而且独占服务器模式有独立的PGA;而共享服务器的PGA里只有一个松散的栈区,其余结构都在SGA中。 


目录

session的生成 

session与processes的关系

session与processes的查看

processes的设置思路

processes的修改


DBCA建库配置选项-processes

开局一张图,故事慢慢讲。上面这张图是对于一个Oracle数据库而言,是第一次与process和session接触。这张图是在部署Oracle进行DBCA建库时的配置选项;Oracle对它的描述是:指定操作系统用户进程可以同时连接到数据库的最大数量,这个参数的值包括用户进程和Oracle的后台进程。这个界面是在配置processes数;同时这个配置也决定了session的大小。关于它们的详细信息,请大家耐心阅读下面的描述。

session的生成 

在叙述session生成之前,大家先想象一个场景:

①我本人,需要去医院看病。

②到了医院后,因为对医院并不了解,所以先去了导医台;工作人员告诉了我医院的大概情况。

③了解完情况,我开始去挂号,申请预约医生给我看病。

④医院此时正好有处于闲暇状态的医生,于是通过叫号系统反馈给我可以过来看病了。

⑤我在收到通知后,赶往指定科室和医生碰面,开始看病。

上面这个例子是我结合我的工作环境编的,细节上大家不必纠结。在流程上,我本人就相当于“用户进程”,医生就相当于“server process”;我和医生碰面就相当于产生了“会话” 。在我和医生见面之前发生了很多步骤,那么Oracle在产生会话前也发生了很多的步骤。这些步骤可以总结如下:

①客户端产生一个用户进程(user process),开始向Oracle服务端发出连接请求。           

②用户进程在监听上的实例注册区找到目标Oracle数据库的实例信息。    

③获取到实例信息后,向Oracle申请server process进程。                          

④Oracle生成server process进程,且将准许连接信息通过实例注册区反馈给用户进程。

⑤用户进程收到准许连接信息后找到server process,生成会话(session)。        

以上是会话生成的全过程,从这个过程中是可以提取出几个关键的要点:

  • Oracle生成server process

Oracle收到请求后,生成server process;那是在哪里生成的呢?【在内存区域PGA中的UGA中生成】UGA,user global area:用户全局会话区。

  • Oracle通过监听连接到Oracle

用户进程通过监听,获取到实例信息后,向Oracle正式发出server process请求。那么如果监听崩溃了,会话是否会受到影响呢?【新的会话无法产生,已经产生的会话不会受到影响】

  • Oracle生成server process

Oracle产生server process的数量是有上限的,还记得我们开局的那张图吗?上面就配置了process的最大值,而且Oracle的后台进程还占用了一部分的process。所以当process总量达到Oracle配置的上限时,就不能再生成process了。此时Oracle就会报错 “ORA-00020: maximum number of processes (2048) exceeded”。

session与processes的关系

再强调一遍;在独占(专用)服务器和共享服务器两种模式中,session和processes的关系是不一样的。本篇只会针对独占服务器模式进行叙述。

关于共享和独占模式我也在另一篇文章里简单介绍过了,有需要的同学可以去看下:

文章链接:Oracle体系结构:网络管理-CSDN博客

数量关系

数量关系其实很好理解,这篇文章的第一张DBCA建库配置图大家还记得吧,上面只配置了processes的最大数量,没有配置session的值。因为session的最大值不需要配置,记住哦,是压根不需要我们动手去配置,它会根据processes的最大值去自动设置。而且它们之间的数量比例关系在各个版本中的算法都略有差异,我在这里总结了一下。

10g 

session = 1.1 * processes + 5

11g 

session = 1.1 * processes + 22 

12c,19c

  session = 1.5 * processes + 22

我负责的其中一个项目用的是11g,但现在夜深人静,没有了远程方式....;所以只能给各位同学看下我自己本地的12C、19C的session和processes的值。

12C

同学们可以看到这是12C版本,processes值是300(和DBCA建库配置中的一样哦),session的值是472 = 1.5 * 300 + 22;符合我们上面的公式。

[oracle@oracle12ctwo ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Apr 8 22:03:29 2024

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  838860800 bytes
Fixed Size                  8626240 bytes
Variable Size             322965440 bytes
Database Buffers          499122176 bytes
Redo Buffers                8146944 bytes
Database mounted.
Database opened.
SQL> SELECT value FROM v$parameter WHERE name = 'processes';

VALUE
--------------------------------------------------------------------------------
300

SQL> SELECT value FROM v$parameter WHERE name = 'sessions';

VALUE
--------------------------------------------------------------------------------
472

19C

同学们可以看到这是19C版本,processes值是300,session的值是472 = 1.5 * 300 + 22;也符合我们上面的公式。

[oracle@oracle19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 9 22:32:10 2024
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to an idle instance.

  
SQL> startup
ORACLE instance started.

Total System Global Area  838858176 bytes
Fixed Size                  8902080 bytes
Variable Size             373293056 bytes
Database Buffers          448790528 bytes
Redo Buffers                7872512 bytes
Database mounted.
Database opened.
SQL> SELECT value FROM v$parameter WHERE name = 'processes';

VALUE
--------------------------------------------------------------------------------
300

SQL> SELECT value FROM v$parameter WHERE name = 'sessions';

VALUE
--------------------------------------------------------------------------------
472

对应关系

在本篇【session的生成】章节中,已经叙述了在独占模式下,user process 找到对应 server process 产生会话。那么在数据库层面,此时对于已经建立的session,一个session对应一个process。

说到这里,不晓得大家有咩有疑问?不应该是一个session对应两个process吗?user process 和 server process。那么又回到开局那张DBCA建库配置图了,图中英文描述的意思是“指定操作系统用户进程可以同时连接到数据库的最大数量,这个参数的值包括用户进程和Oracle的后台进程”。这句话讲的很清楚,processes 限制的是同时连接到Oracle的user process数量。

session与processes的查看

上文已经叙述了session和process的关系。对于数据库运维来讲,我们咋可能记得住建库的时候设置的processes最大值是多少。那么我们可以通过查询下面的SQL来查看。

  • 查看当前数据库process最大值 
select value from v$parameter where name = 'processes';
  • 查看当前数据库session最大值
 SELECT value FROM v$parameter WHERE name = 'sessions';
  •  查看当前已使用进程数
select count(*) from v$process;
  • 查看当前已使用会话数
select count(*) from v$session;
  • 查看process、session历史最大值 
SELECT 
resource_name,
max_utilization,--自上次启动以来,达到的最大值
limit_value --最大限制
FROM v$resource_limit 
WHERE resource_name IN ('processes','sessions');
  • 查看当前连接最多的主机是哪些 
SELECT machine,COUNT(*) FROM v$session GROUP BY machine ORDER BY 2 DESC; 

其实上面写来写去都是对 v$session、v$process、v$resource三个动态性能视图的查询;可写的花样太多了,大家想要再进一步深入研究就必须得对这三张视图特别熟悉。

另外:

除了对session和process进行监控之外,以上视图还可以联合v$sql等视图将查询效率低下的SQL是在哪台机器上运行的给揪出来、或者可以将哪台机器最近做了什么删表删字段操作给揪出来等等。因为本篇重点还是讲会话和进程,在这块就不多展开了。

processes的设置思路

processes的大小是非常重要的!设置的太大没有意义。

如果设置的太小,就不能满足实际业务的需要,一旦用户进程接近processes最大值,应用系统就会开始变的很卡(实际经历); 一旦超过processes的最大值,数据库就会开始报错:ORA-00020: maximum number of processes (2048) exceeded;而如果并发用户已经达到SESSIONS的值时,又有新会话连接进来,就会报错:ORA-00018:maximum number of sessions exceeded 。此时数据库会发生宕机,我们再次启动数据库后只能通过AWR报告来查看分析这段时间内哪些主机连接较高。

所以在设置processes值的时候,必须充分考虑该Oracle数据库所承担的业务压力。在最高峰时,最大可能会有多少用户进程连接;并在此基础上再增加一些(可以增加个小几百)。

而且最好在DBCA建库时就思考清楚给多少processes值!

processes的修改

在确保您当前的用户有足够的权限之后,执行以下SQL。执行完后,需要重启数据库才能生效哦。这也是为什么上文提到最好在DBCA建库时就思考清楚给多少processes值的原因,因为生产数据库怎么能随便重启呢!

 alter system set processes=500 scope=spfile;

那么session的参数该怎样修改呢?当然是不用手工修改啦,前文提到过session的值是根据process的值自动设置的,设置的规则请看上文【session与process的关系】章节。


❀❀❀  感谢您的阅读哦!❀❀❀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stable-diffusion-webui怎么样增加自己训练的LoRA模型?

不怕笑话,我曾经为了找这个功能,居然搞了半天时间,结果还没有搞定。 后来再不断地研究各种教程,就是没有发现这个功能,无意间发现有一个人贴了一张图片, 他只是介绍放到这个目录,他没有告诉我这个目录怎么样来的,因为我在同样的位置上没有这个目录。 这样我训练出来…

探究 ChatGPT 的心脏--Transformer(基础知识第一篇)

Transformer 是 ChatGPT 的核心部分,如果将 AI 看做一辆高速运转的汽车,那么 Transformer 就是最重要的引擎。它是谷歌于 2017 年发表的《Attention is All You Need》中提出的 Sequence-to-sequence 的模型,诞生之后便一统江湖,在…

Flutter学习11 - Future 与 FutureBuilder

1、Future 可以利用 Future 实现异步调用 1.1、Future 的两种形式 自定义一个结果类 class Response {String _data;Response(this._data); }自定义方法实现 Future Future<Response> testFuture() {var random Random();int randomNumber random.nextInt(10);if …

DHCP抓包分析

DHCP动态路由配置协议&#xff0c;是C/S架构&#xff0c;由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程&#xff1a; 如何解决IP地址的冲突&#xff1a; ▫ DHCP服务器端&#xff1a;收到DHCP DISCOVER报文时&#xff0c;给客户端分配IP地址前会发…

智能运维场景 | 科技风险预警,能实现到什么程度?

[ 原作者&#xff1a;擎创夏洛克&#xff0c;本文略做了节选和改编 ] 每次一说到“风险预警”&#xff0c;就会有客户问我们能做怎样的风险预警。实际上在智能运维厂商来说&#xff0c;此风险非彼风险&#xff0c;不是能做银行的业务上的风险预警&#xff08;比如贷款风险等&a…

自动化测试框架 Selenium(3)

目录 1.前言 2.等待方式 2.1死等 2.2智能等待 3.游览器操作 3.1游览器最大化 3.2设置游览器的宽 高 3.3 游览器的前进和后退 3.4游览器滚动条 1.前言 本篇博客,我们将继续Selenium自动化测试的学习.在前面的章节中,俺介绍了Selenium是怎么回事,和键盘鼠标操作.还有url和…

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题&#xff09;&#xff01…

ruoyi-nbcio-plus基于vue3的flowable的支持自定义业务流程处理页面detail.vue的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Qt | 信号与槽 原理、连接、断开(面试无忧)

1、信号和槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。 2、Qt 的部件类中有一些已经定义好了的信号和槽,通常的作法是子类化部件…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(1)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(1) 零、00时光宝盒 1009 Rejections 1009 拒绝 Once, there was an old man, who was broke, living in a tiny house and owned a beat-up car. 有一次&#xff0c;有一个老人&#xff0c;他破产了&#…

谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本

打开谷歌google浏览器提示&#xff1a;无法更新Chrome&#xff0c;Chrome无法更新至最新版本&#xff0c;因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站&#xff0c;造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…

Netty源码解析-服务启动过程

文章目录 前言简单Netty服务器启动代码示例主线NioEventLoopGroup初始化关键代码 前言 Netty是一个高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。它的服务启动过程涉及多个组件和步骤&#xff0c;下面我将对Netty的服务启动…

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

腾讯云向量数据库——RAG七天入门课笔记

目录 前言一、RAG介绍1-0、引言-大语言模型的不足1-1、向量数据库定义1-2、工作原理1-3、优点1-4、与传统数据库的区别1-5、RAG应用痛点 二、数据处理的难点——解析和拆分2-1、复杂文档格式-解析过程中的问题2-2、复杂文档解决流程2-3、Chunk拆分的问题以及如何改进 三、相似性…

【GitHub技术全面解析及游戏开发者的应用】

GitHub技术全面解析及游戏开发者的应用 GitHub作为全球最大的开源代码托管平台&#xff0c;不仅为软件开发者提供了一个强大的工具&#xff0c;也为游戏开发者带来了前所未有的便利。在游戏开发领域&#xff0c;GitHub的技术可以帮助开发者更高效地管理代码、协作开发、分享资…

10 - 镜像管理之:部署高可用harbor

之前介绍了部署单点harbor&#xff0c;这里重点说下Harbor高可用集群方案的部署&#xff0c;目前主要有两种主流的Harbor高可用集群方案&#xff1a; 1&#xff09;双主复制 2&#xff09;多harbor实例共享后端存储 1 Harbor双主复制高可用集群 1.1 主从同步 harbor官方默认提供…

arm64位系统中编译ffmpeg

大致过程仍然和x86平台一致&#xff1a; ./configure xxxxmakemake install 所需要变化的是需要在 ./configure xxxx 后面多加几个编译选项 cd ffmpeg ./configure (x64下的依赖配置&#xff1a;......)--prefixbin --archaarch64 --target-oslinux --enable-cross-compile …

redis的客户端操作

文章目录 前言Java客户端Jedis准备工作引入JedisJedis的基本使用方法String类型的操作List类型操作Hash类型操作Set类型操作Zet类型的操作 JavaSpring客户端创建项目引入SpringDataRedis配置 redis 服务地址创建 Controller具体实例 前言 Redis是用单线程来处理多个客户端的访…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…

Linux_网络编程套接字_2

文章目录 一、预备知识认识端口认识TCP协议认识UDP协议网络字节序 二、socket编程接口1.socket常见API2.socket结构总结 3.其他接口1.IP地址《》整数 inet_addr等等2.读取报文 - recvfrom 三、简单的UDP网络程序 - 聊天室1.源代码展示 四、TCP1.编写TCP服务器程序1.创建套接字 …