暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle会话超时设置1:在sqlnet.ora和listener.ora中设置

原创 听见风的声音 2023-02-15
6019


       Oracle数据库会话管理中一个重要的内容是会话超时管理,会话超时管理由涉及到会话创建超时,会话空闲超时、会话故障超时,会话超时的配置也比较复杂,可以在Oracle net services中设置,也可以设置实例级别的超时和用户级别的超时,这篇文章先介绍在Oracle net services中的会话超时设置,net services是一个比较大的概念,容易和net混淆,这里先对这两个概念做一下介绍。

1 Oracle net services简介

     Oracle net services是分布式异构环境下的企业级连接方案,可以简化网络配置和管理的复杂性,网络性能最大化,提高网络诊断能力。

Oracle net services由三个主要的组件,Oracle net,Oracle listener和Oracle 连接管理器。

      Oracle net 负责建立和维护客户应用程序与数据库服务器之间的连接,在它们之间交换信息。Oracle net 部署于网络中的每一台计算机上。Oracle net在系统中位置和作用可以从下面的官网上图中看到。


      Oracle listener,将客户连接请求转交给服务器,在连接建立后,客户端和Oracle 服务器直接通信。其在架构中的位置和功能可以从另一张官网中的图中看到。


监听只在连接建立的过程中起作用,因而在监听的日志中,可以看到大量连接建立的信息,包括连接成功或者是异常的信息,而看不到连接建立后(如连接超时,连接异常)的信息。

      Oracle连接管理器不是必备组件,它同客户端或者服务器分开,位于自己的计算机上。为数据库代理或者屏蔽请求。



2 在sqlnet.ora中设置会话超时

   2.1 SQLNET.EXPIRE_TIME

      这个参数的单位是分钟,指定一个事件间隔。默认值是0,设置为大于0的值之后,Oracle在指定间隔发送一个check消息验证客户端/服务器连接依然活跃。如果探测到一个终结的或者是不再使用的连接,会返回一个错误,导致服务进程退出。主要用于确保客户端异常终结之后,连接不会无限期处于open状态。这个参数主要用于数据库服务器端。这个参数设置为大于0的值后,会额外产生网络业务,尽管非常小,也可能影响网络性能。

    2.2 SQLNET.RECV_TIMEOUT和SQLNET.SEND_TIMEOUT

     SQLNET.RECV_TIMEOUT这个参数的单位是秒,设置数据库服务器在客户端建立连接之后等待客户端的时间。客户端建立连接后必须在这个指定间隔内发送一些数据,在客户端时常关闭或者异常的环境下,推荐设置这个参数。如果客户端在这个时间间隔内没有发送任何数据,数据库服务器在sqlnet.log中记录一条ORA-12535: TNS:operation timed out

或者 ORA-12609: TNS: Receive timeout occurred消息。没有这个参数,数据库服务器可能会永久等待异常或关闭的客户。这个参数缺省没有设置值。这个参数也可以用户客户端,设置客户端等待服务器发送数据的时间间隔。

      SQLNET.SEND_TIMEOUT这个参数的单位也是秒,设置的是数据库在客户端建立连接后完成一个发送操作的时间。也是推荐在客户端时常关闭或者异常的环境下设置,如果没有这个参数,数据库服务器的发送操作可能在客户端关闭或异常时一直等待。也可以用于客户端。

   2.3 SQLNET.INBOUND_CONNECT_TIMEOUT和SQLNET.OUTBOUND_CONNECT_TIMEOUT

      这两个参数设置连接创建时的超时设置,SQLNET.INBOUND_CONNECT_TIMEOUT单位时秒,设置用户创建连接的超时时间,如果用户不能再设置的时间内创建连接,完成认证,数据库服务器终结连接,并且在sqlnet.log文件中记录客户的 IP地址及一条 ORA-12170错误,客户端会收到一条RA-12547: TNS:lost contact 或者一条 ORA-12637: Packet receive failed错误消息。这个参数的缺省值时60.

     SQLNET.OUTBOUND_CONNECT_TIMEOUT的单位也是秒,设置了这个超时时间后,用于客户建立到服务器的连接时,如果在指定的时间内没有建立连接,终止连接试图,客户收到一条ORA-12170: TNS:Connect timeout occurred错误。如果没有这个参数,当数据库服务器所在的主机不可达时,到数据库服务器的客户连接请求可能会被阻塞TCP connect timeout 定义的时间间隔,缺省为60秒。

2.4 TCP.CONNECT_TIMEOUT

       这个参数的单位时秒,缺省值是60,设置客户建立至数据库服务器的tcp连接的超时时间。如果在这个指定的时间间隔内没有创建tcp连接,连接企图被终止,客户收到RA-12170: TNS:Connect timeout occurred错误。这个值是

SQLNET.OUTBOUND_CONNECT_TIMEOUT的子集,SQLNET.OUTBOUND_CONNECT_TIMEOUT是指客户端建立到数据库实例连接的时间。

3 listener.ora中的超时设置

     INBOUND_CONNECT_TIMEOUT_listener_name参数设置在网络连接建立后,客户完成至监听器连接请求的时间。如果在这个指定时间内服务器没有收到客户的连接请求,终结连接并在监听日志内记录客户端的IP address 和一条ORA-12525:TNS: listener has not received client's request in time allowed 错误。这个参数的缺省值是60秒。

4 默认设置下的连接超时

        如果不做任何设置,这几个参数的值是什么,数据库版本不同,这几个参数的值可能也会有变化。在Oracle 19C中的超时设置应该是这样的,TCP.CONNECT_TIMEOUT是60秒,其它的都没有值或者为0,也就是不生效。在客户创建到数据库服务器的连接过程中如果超时或者异常会有报错,连接建立后则没有任何超时机制。

5  验证SQLNET.RECV_TIMEOUT参数

       单机数据库安装时不会创建sqlnet.ora文件,在$ORACLE_HOME/network/admin/samples目录下有一个sqlnet.ora文件的示例,这个示例文件里面的内容都是注释,对大部分参数,这里面都做了详细的说明,包括参数的意义、用途,默认值,建议值等,在设置sqlnet.ora的值时,最好能够仔细阅读一下这个文件,默认值能够满足要求的就用默认值,将默认值和对参数的注释说明去掉,这里使用的sqlnet.ora文件很简单,只有两行

sqlnet.RECV_TIMEOUT = 20
diag_adr_enabled = OFF

          第一个参数前面已经做了说明,设置第二个参数的原因是从Oracle 11G开始,diag_adr默认是启用的,sqlnet的跟踪和日志文件都是由Oracle的自动诊断管理的,看起来没有以前

那个直接。sqlnet.ora默认的路径设置在$ORACLE_HOME/network/admin/下,以oracle用户登录,在这个目录下创建sqlnet.ora文件,输入上面两行并保存后启动数据库和监听,用sqlplus使用连接串登录到数据库

[oracle@dbserver ~]$ sqlplus test@dbserver:1521/"ORCL"

先运行一条查询语句

SQL> select count(*) from t_test;

COUNT(*)
----------
9


20秒之后再运行这条语句
SQL> /
select count(*) from t_test
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 7764
Session ID: 62 Serial number: 39341

第二次运行这条语句是连接已经被关闭。

查看数据库服务器的sqlnet.log文件,文件位于$ORACLE_HOME/network/log目录下,里面有这样一条信息

***********************************************************************
Fatal NI connect error 12170.

VERSION INFORMATION:
TNS for Linux: Version 19.0.0.0.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Version 19.3.0.0.0
Time: 15-FEB-2023 02:23:01
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out

这个简单的小实验可以验证,当设置了SQLNET.RECV_TIMEOUT这个参数之后,客户端在建立连接后,每隔20秒就要向数据库服务器发送以下数据,否则连接就会被数据库服务器断开。这个参数可以用来控制空闲连接时间,设置了这个值,可以避免连接泄露问题。





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论