ORA-12520看oracle连接模式

由ORA-12520看oracle连接模式 - [ORACLE]
  • 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://xiekeli.blogbus.com/logs/93619549.html

    今天遇到一个数据库问题:ORA-12520: TNS:listener could not find available handler for requested type of server 。

    网上查了一下,大致有两种原因:

    • 数据库是专用服务器,但是在tnsname.ora配置中设置了连接方式为shared,这种情况下打开tnsname.ora, 把(server = shared) 改成 (server = dedicate);
    • 是由于process不够引起的;

    对照了一下症状,基本确定为process不够的原因;

    处理方法基本也是按网上说的加大process数量;

    1、查看process数量:

    2、查看session数量:

    3、更改系统参数:

    重启数据库,即可;

    可这里的process、session到底是什么含义?看来有必要理一理oracle连接模式的一些基础概念了:

    先来看看oracle建立连接的过程:

    Oracle网络命名解析完成以后,一个连接请求从客户端或中间层应用(都被认为是用户进程)传输到Oracle 网络监听器。监听器收到一个CONNECT 包,并且检查请求的服务是否是一个有效的服务名。如果是不需要服务名的连接(如:TNSPING请求),监听器识别出连接请求后什么也不做,如果请求的是非法的服务名,监听器会发送一个错误代码给用户进程;

    再来看看Oracle在不同的连接模式下有哪些区别?

    专用模式

    1、如果CONNECT 包请求的是一个有效的服务名,监听器会建立一个新的进程(即:Server Process ,在windows中对应线程)去处理这个连接。

    2、进程创建后,监听器连接该进程,并把初始化信息传给他,包括:用户进程的地址信息。至此,监听器不处理该连接的事务,所有工作都由对应的进程处理。

    3、Server Process 传回一个RESEND 包给用户进程;

    4、用户进程接收到RESEND 包后,又再次发送一个CONNECT 包(真罗嗦 :p);Server Process开始检查用户进程的身份识别证书(通常就是一个密码),如果验证通过就创建一个Session;

    5、Session建立以后,Server Process 就扮演一个服务器端的用户代理角色,主要负责:

    • 解析和运行所有该客户端的SQL语句;

    • 检查 database buffer cache 用于执行SQL语句的数据块数量;

    • 如果SGA中已经没有对应的数据块时,将必须的数据块从磁盘的数据文件中读入到SGA的database buffer cache 中;
    • 管理所有的排序操作,在server process 中有一部分叫Program Global Area (PGA),PGA包含了一块用于排序的内存区块就是the Sort Area;
    • 返回结果给用户进程;

    Server processes也处理一些特殊的操作,如bitmap 和hash连接。专用服务器进程消耗的内存数量取决于几个初始化参数设置:PGA_AGGREGATE_TARGET 和WORKAREA_SIZE_POLICY ,如果需要更高级的调优,可以对这些参数进行微调;

    在专用模式中,server processes 和用户进程的比例是1:1,每个server process都消耗系统资源,包括CPU和内存。

     

    【共享模式】

        每一个参与共享服务器架构的服务至少需要一个(通常不止一个)调度进程。当一个连接请求到来的时候,监听器并不创建一个专用服务器进程。取而代之的,监听器根据每个调度器的连接负载(并发连接数)为每个服务名维护一个有效的调度器列表。连接请求被路由到负载最轻的调度器上。在一个session期间,用户的连接都会持续保持在同一个调度器上。

        不像专用服务器进程,一个调度器可以管理上百个用户session。调度器实际中并不处理客户端的请求,而是将用户请求放到一个SGA共享池中的公共队列中;共享服务器进程(Shared Server processes),接管了大部分专用服务器进程的工作,将请求从队列中取出,并处理。

        由于一个用户session的请求有可能会被多个shared server processes处理,因此原来位于在Program Global Area (PGA)中的存储结构必须放在一个共享内存的地方,在共享模式中,这些存储区块是放在SGA的large pool 中的;

    处理请求的过程:

    当一个用户连接通过共享服务器架构提交一个数据库请求的时候:

    1、用户进程将请求发送给调度器;

    2、调度器将请求放入到SGA的公共队列中;

    3、下一个空闲的shared server 从队列中取出并处理请求;

    4、shared server 将响应(response )放到调度器的响应队列中,每个调度器都有自己的响应队列;

    5、调度器从他的响应队列中检索到对应响应。

    6、调度器将响应返回给用户;

    整个过程结束后,shared server 将被释放,并处理新的用户请求;

    关于请求队列:
    • 一个请求队列被所有的调度器共享.
    • Shared servers 监视着请求队列中是否有新的请求进入.
    • 请求是按先进先出 (FIFO)的原则进行处理的.没有优先级设置。

    一些相关的参数说明:

    • LARGE_POOL_SIZE 指定 large pool的字节数尺寸. oracle共享模式适用large pool 存储session的信息,而在专用模式中通常存储在PGA中。

     
    • SESSIONS 指定系统中能创建的最大session数量。这个参数可以根据实际情况进行调整;

    • PROCESSES 控制服务器端进程的数量.

     
    • LOCAL_LISTENER 定义监听器使用的协议和端口号. 如果你的监听器不是使用使用TCP/IP和1521端口,或者你有多个监听器,你必须配置LOCAL_LISTENER,这样调度器才能注册监听器.

    什么时候不适合用共享模式

    • 数据库管理
    • 备份和回复操作
    • 批处理和大负载量操作(如果在有大事务和长事务的OLTP系统中,系统会比原来更慢)
    • 数据仓库操作
  • posted @ 2011-05-12 09:38  蓝欣児  Views(6942)  Comments(0Edit  收藏  举报