oracle 会话是什么?

2024年 5月 10日 104.3k 0

原文: DBA的思想天空- p27-30

搞过网络编程的朋友可能早就听说过会话这个概念了。两个网络设备要进行通信,必须先建立起一个会话,这个会话就是承载所有通信工作的逻辑载体。再往前追溯,会话的概念来自通信行业,不过 Oracle 会话的本质更类似于网络设备之间的通信。

 

大家都知道网络通信有面向连接的协议,也有面向无连接的协议。面向连接的协议一般适用于上下文和状态十分关键的应用场合。Oracle的会话正是具有这样的特征,所以采用面向连接的通信协议,目前最常用的就是 TCP/P协议。出于安全考虑,在建立会话之初,Oracle需要通过安全认证,这也就是我们常见的“数据库登录”,Oracle的术语称为LOGON。在 LOGON的时候,首先 Oracle 客户端通过 SQL*Net协议或者 BEQ协议创建一个服务进程。

 

如果通过 SQL*Net协议,客户端首先要和监听器通过 TCP/IP、SPX等面向连接的网络协议建立通信会话,由监听器创建一个服务进程,客户端进程将网络通信会话重定向到这个服务进程,随后,客户端进程和服务进程建立通信会话。大家可能注意到了,老白在这里说了很多次“通信会话”,这么说就是为了区别与 Oracle 的会话。

 

和客户端通信的服务进程也就是
Oracle 术语中所说的前台进程,客户端和前台进程建立了通信会话并不等于说 Oracle的会话已经建立了,会话是一个更为虚拟的概念。大家先不要着急,等老白一步一步地进行剖析。客户端和服务进程完成通信会话的握手后,首先将LOGON 所需要的信息发送给前台进程。前台进程收到这些信息后,执行一个被称为LOGON的操作,校验用户和权限。这个校验工作可以有多种方式,最常见的是通过
SYSTEM表空间中的 USER$表中保存的用户名和密码进行校验。

 

Oracle还支持其他方式的用户名、密码校验方式,比如操作系统校验、外部安全设备校验(LDAP)。完成LOGON操作后,系统会在数据库服务器的 SGA中创建一个会话的数据结构,这个数据结构被称为SESSION STATE
OBJECT,Oracle 内部数据结构为 ksuse。在《Oracle RAC日记》中,老白曾介绍过这个结构

会话建立后,就成为客户进程和数据库实例之间的沟通渠道和桥梁,执行客户端对数据库的操作,包括执行 SOL。不过会话是一个逻辑结构,必须依赖于其容器--服务进程(也叫前台进程 )。在独立服务器模式下,每个会话对应一个独立的服务进程,Oracle 也提供了一种共享服务器模式,在这种模式下,一个服务进程可以为多个会话服务,换句话说,一个服务进程可以成为多个会话的容器。

 

在共享服务器模式下,一般会配有一个或者多个调度进程(DISPATCHER,比如D000)和一组服务进程,这些服务进程的最大数量受到 max_shared_servers 参数控制。当监听进程接收到来自客户端的连接请求时,不是创建独立的服务进程,而是使用现有的服务进程池来提供服务。监听进程首先会和调度进程通信,找到可用的服务进程,调度进程会将这个服务进程及其通信端口号发送给监听进程,监听进程将网络通信连接重定向到这个服务进程,完成客户端和服务进程之间的握手

 

在共享服务器模式下,由于多个会话共享一个服务进程,因此服务进程作为共享资源,也可能成为一个瓶颈。如果使用同一个服务进程的几个共享会话中有一个执行了时间很长、开销很大的 SQL,那么其他会话将会处于等待状态。

 

共享服务器模式在早期的数据库系统中的使用是比较广泛的,因为早期的服务器内存资源有限,如果使用独立服务器模式,内存资源将会十分紧张而使用共享服务器模式可以在内存资源有限的情况下,支持大量的数据库会话。在目前内存资源十分充裕的情况下,共享服务器模式的应用就越来越少了,一个进程为一个会话服务,可以有效地提高系统总体的吞吐能力。

 

不过,共享服务器模式也并不是完全没有了用武之地,尤其是现在服务器性能有了大幅提高对于某些没有使用连接池的,以短连接为主的应用来说,如果执行的大多数是开销较小的SQL那么使用共享服务器模式可以避免由于应用软件使用短连接而导致的数据库连接风暴,因为这种数据库连接避免了频繁启动和关闭服务进程带来的性能问题。

 

共享服务器模式还用于数据库连接穿透 NAT防火墙。我们经常会碰到这样的应用场合,客户端在防火墙外,而服务器在防火墙内,出于安全考虑,数据库服务器的服务IP通过NAT解释为外网的 ,提供给防火墙外的客户端使用。

 

不过 SQL*Net 连接在穿透防火墙时往往会出现问题,由于 SQL*Net在连接时首先连接监听器,然后由 LISTNER分配一个服务进程,再将连接重定向到服务进程。正是这种重定向操作,会导致客户端出现“TNS-12535”之类的错误。为了解决这个问题,Oracle 提供了一个技术,叫做 Connect Manager(CMAN),CMAN是一个 SQL*Net的代理。当外网的客户端要连接数据库服务器时,首先不连接监听,而是连接CMAN,CMAN作为代理,接受客户端的连接,然后将SQL*Net 包进行转发。

 

为了避免连接过程中出现的重定向问题,CMAN 采用了预先连接的连接池技术,CMAN在启动时就建立了一个连接池,并和数据库的服务进程建立了连接。因此客户端通过CMAN连接数据库时,不需要建立新的网络连接就可以穿透 NAT的防火墙。为了提高CMAN的效率,CMAN连接池使用了共享服务器技术,这样一个服务进程就可以为多个通过CMAN连接的客户端提供会话服务。

 

从上面的讨论中,我们了解了会话及其容器服务进程之间的关系。会话是依赖于其服务进程一旦服务进程出现故障,会话也将会出现故障。因此,如果想要终止某个会话正在进行的操的,作,有两种办法,一是杀死该会话,我们可以通过alter system kill session命令杀死这个会话;此外,也可以直接杀死会话对应的服务进程。

 

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论