读书频道 > 网站 > 网页设计 > DBA的思想天空:感悟Oracle数据库本质
1.4.4 是谁在执行SQL
12-11-16    奋斗的小年轻
收藏    我要投稿   
本书重在介绍Oracle 数据库的性能调优方法及相应的工作思路,但并不拘泥于技术细节。作者结合多年的丰富经验,借助大量真实案例剖析了相关技术原理,阐述了理论知识在实践中的应用方法,并总结出思路是道,操作...立即去当当网订购

“是谁在执行SQL?”这个问题看似很简单,不过要认真考虑起来,却也不那么简单。很多工作了7、8年的DBA可能还真的没有认真考虑过这个问题。最初,老白一直以为是Oracle的后台进程在执行SQL,然后将执行的结果返回给客户端进程。直到学习了TWO TASK这个概念后,才知道在客户端连接到数据库时,Oracle会创建一个服务进程(Server Process),Oracle的客户端通过和该进程通信来完成SQL的执行。

现在回头一想,如果是Oracle的后台进程来执行SQL,那么在一个大型的数据库系统中,会有数千甚至上万个客户端在访问数据库,光凭几个Oracle后台进程是肯定无法完成这个任务的,这样就会出现瓶颈。从这个角度来看,服务进程应该是执行SQL的“最佳人选”了。在独立服务器模式下,每个Oracle会话都拥有一个独立的服务进程,如果让它来担当执行SQL的角色,那么就不会出现资源瓶颈了。

事实上,Oracle也是这样安排的,TWO TASK的服务器端的服务进程,担当的就是这样一个角色。客户端要执行的SQL,通过SQL*Net或者BEQ(客户端和数据库服务器运行在同一台服务器上时,可以不通过SQL*Net,而直接通过IPC通信协议BEQ来通信)发送给服务进程,由它来完成SQL的执行。

我们可以更加深入地理解一下这方面的概念。先要问大家一个问题,执行SQL的主体是什么?可能很多DBA会觉得有些迷惑了,怎么什么简单的问题到了老白这里都变得那么不确定了呢?执行SQL的主体是会话(Session)呀,执行SQL的呼叫是由会话发起的,会话是Oracle数据库用户进行SQL操作的唯一渠道。

那么下一个问题又来了,会话又是什么呢?搞过网络编程的朋友可能早就听说过会话这个概念了。两个网络设备要进行通信,必须先建立起一个会话,这个会话就是承载所有通信工作的逻辑载体。再往前追溯,会话的概念来自通信行业,不过Oracle会话的本质更类似于网络设备之间的通信。大家都知道网络通信有面向连接的协议,也有面向无连接的协议。面向连接的协议一般适用于上下文和状态十分关键的应用场合。Oracle的会话正是具有这样的特征,所以采用面向连接的通信协议,目前最常用的就是TCP/IP协议。出于安全考虑,在建立会话之初,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日记》中,老白曾介绍过这个结构,具体如图1-1所示。


 

图1-1显示的是SESSION STATE OBJECT的信息,这个信息只包含了会话的基础信息,会话相关的数据结构十分复杂,已经超出了本书的讨论范围,因此不做更多的描述。

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

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

在共享服务器模式下,由于多个会话共享一个服务进程,因此服务进程作为共享资源,也可能成为一个瓶颈。如果使用同一个服务进程的几个共享会话中有一个执行了时间很长、开销很大的SQL,那么其他会话将会处于等待状态。共享服务器模式在早期的数据库系统中的使用是比较广泛的,因为早期的服务器内存资源有限,如果使用独立服务器模式,内存资源将会十分紧张,而使用共享服务器模式可以在内存资源有限的情况下,支持大量的数据库会话。在目前内存资源十分充裕的情况下,共享服务器模式的应用就越来越少了,一个进程为一个会话服务,可以有效地提高系统总体的吞吐能力。

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

共享服务器模式还用于数据库连接穿透NAT防火墙。我们经常会碰到这样的应用场合,客户端在防火墙外,而服务器在防火墙内,出于安全考虑,数据库服务器的服务IP通过NAT解释为外网的IP,提供给防火墙外的客户端使用。不过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 SESSION KILL命令杀死这个会话;此外,也可以直接杀死会话对应的服务进程。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站