`
futeng
  • 浏览: 263768 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

用户连接时间超出限制时长(ORA-00604 ORA-02399)

阅读更多

背景

一个入库频繁的应用同时报了 (ORA-00604 + ORA-02399)错误,后续数据再也不能入库。

错误日志

 

ORA-00604: error occurred at recursive SQL level 1
ORA-02399: exceeded maximum connect time, you are being logged off
ORA-02399: exceeded maximum connect time, you are being logged off

 

Oracle官方文档

ORA-00604

ORA-00604 error occurred at recursive SQL level num
Cause: An error occurred while processing a recursive SQL statement. A recursive SQL statement is one that applies to internal dictionary tables.
Action: If the situation described in the next message on the stack can be corrected, do so; otherwise, contact customer support.

ORA-02399

ORA-02399 exceeded maximum connect time, logging off
Cause: A user has exceeded the maximum time allowed to be connected to the database.
Action: The user must reconnect to the database.

分析

不是很能理解ORA-00604的错误,着重看了ORA-02399,大致意思如下:
原因:用户连接数据库时间超出了所允许的最大时长
办法:该用户需要重连数据库
考虑到出问题的应用确实是一刻也不停的操作数据库,而且建立的长连接也未曾释放,很可能超出了Oracle数据库限定的最大连接时长。

在网上很幸运的查询到Andrew Reid的一篇文章,里面专门测试了连接时长的问题。
实验中设置了Profile Connect_time时长为1分钟,而在超过1分钟后当前session在做sql操作也报了如下错误:

 

SQL> select to_char(sysdate,'hh24:mi:ss')
  2  time_now from dual
  3  /
select to_char(sysdate,'hh24:mi:ss')
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-02399: exceeded maximum connect time, you are
being logged off
ORA-02399: exceeded maximum connect time, you are
being logged off
SQL>

 

惊奇的发现,ORA-00604与ORA-02399确实连着一起来了。

至此可以确定,由于该用户连接数据库的最大时间受限制,导致了上述问题的发生。

解决

简单的有两个解决方法:

  1. 应用处超时重连;
  2. 数据库对该用户取消连接时长限制;

本例简单的使用方法2来说明问题。

1. 查询用户所属Profile

Oracle Profile用来限定对用户访问数据库做一定限制。

 

SQL> set lines 100
SQL> col profile for a15
SQL> col resource_name for a30
SQL> col limit for a14 
SQL> select username,profile from dba_users where username='CRXJ_ALARM';
USERNAME                       PROFILE
------------------------------ ------------------------------
CRXJ_ALARM                     DEFAULT

 

可以看到当前使用用户CRXJ_ALARM所属DEFAULT这个默认的PROFILE。

2. 查看DEFAULT内容

 

SQL> select * from dba_profiles where profile = 'DEFAULT';
Warning: connection was lost and re-established
PROFILE                        RESOURCE_NAME                    RESOURCE_TYPE LIMIT
------------------------------ -------------------------------- ------------- ----------------------------------------
DEFAULT                        COMPOSITE_LIMIT                  KERNEL        UNLIMITED
DEFAULT                        SESSIONS_PER_USER                KERNEL        UNLIMITED
DEFAULT                        CPU_PER_SESSION                  KERNEL        UNLIMITED
DEFAULT                        CPU_PER_CALL                     KERNEL        UNLIMITED
DEFAULT                        LOGICAL_READS_PER_SESSION        KERNEL        UNLIMITED
DEFAULT                        LOGICAL_READS_PER_CALL           KERNEL        UNLIMITED
DEFAULT                        IDLE_TIME                        KERNEL        15
DEFAULT                        CONNECT_TIME                     KERNEL        180
DEFAULT                        PRIVATE_SGA                      KERNEL        UNLIMITED
DEFAULT                        FAILED_LOGIN_ATTEMPTS            PASSWORD      10
DEFAULT                        PASSWORD_LIFE_TIME               PASSWORD      180
DEFAULT                        PASSWORD_REUSE_TIME              PASSWORD      UNLIMITED
DEFAULT                        PASSWORD_REUSE_MAX               PASSWORD      UNLIMITED
DEFAULT                        PASSWORD_VERIFY_FUNCTION         PASSWORD      NULL
DEFAULT                        PASSWORD_LOCK_TIME               PASSWORD      1
DEFAULT                        PASSWORD_GRACE_TIME              PASSWORD      7
16 rows selected

 

可以发现在CONNECT_TIME 设置为180分钟。由于大部分数据库用户都使用默认profile因此还是新建一个专属示例用户的profile来的保险。

3. 新建用户Profile

  1. 创建profile

CREATE PROFILE CRXJ_ALARM_PROFILE LIMIT
COMPOSITE_LIMIT UNLIMITED
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
IDLE_TIME 15
CONNECT_TIME UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7;

 

2 验证是否创建成功

 

SQL> select * from dba_profiles where profile = 'CRXJ_ALARM_PROFILE';
PROFILE                        RESOURCE_NAME                    RESOURCE_TYPE LIMIT
------------------------------ -------------------------------- ------------- ----------------------------------------
CRXJ_ALARM_PROFILE             COMPOSITE_LIMIT                  KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             SESSIONS_PER_USER                KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             CPU_PER_SESSION                  KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             CPU_PER_CALL                     KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             LOGICAL_READS_PER_SESSION        KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             LOGICAL_READS_PER_CALL           KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             IDLE_TIME                        KERNEL        15
CRXJ_ALARM_PROFILE             CONNECT_TIME                     KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             PRIVATE_SGA                      KERNEL        UNLIMITED
CRXJ_ALARM_PROFILE             FAILED_LOGIN_ATTEMPTS            PASSWORD      10
CRXJ_ALARM_PROFILE             PASSWORD_LIFE_TIME               PASSWORD      UNLIMITED
CRXJ_ALARM_PROFILE             PASSWORD_REUSE_TIME              PASSWORD      UNLIMITED
CRXJ_ALARM_PROFILE             PASSWORD_REUSE_MAX               PASSWORD      UNLIMITED
CRXJ_ALARM_PROFILE             PASSWORD_VERIFY_FUNCTION         PASSWORD      DEFAULT
CRXJ_ALARM_PROFILE             PASSWORD_LOCK_TIME               PASSWORD      1
CRXJ_ALARM_PROFILE             PASSWORD_GRACE_TIME              PASSWORD      7
16 rows selected

 

3. 修改示例用户的Profile

SQL> alter user CRXJ_ALARM profile CRXJ_ALARM_PROFILE;
User altered.

 

4. 查看示例用户Profile

SQL> select username,profile from dba_users where username='CRXJ_ALARM';
USERNAME                             PROFILE
------------------------------------------------------------ ---------------
CRXJ_ALARM                             CRXJ_ALARM_PROFILE

 

至此完成修改。

引用文章

ORA-02396: exceeded maximum idle time
ORACLE user profile配置/管理/维护
Server Messages ORA-00000 to ORA-25699
Oracle Enterprise Manager (Example 1)
CONNECT_TIME

 

转载请标明作者和原文链接

ifuteng#gmail.com 2014/10/30

 

3
1
分享到:
评论

相关推荐

    《转载》ora-00020超出最大进程数

    在Oracle数据库系统中,"ORA-00020 超出最大进程数"是一个常见的错误,通常出现在用户尝试创建新的会话或进程时,但数据库已经达到了其配置的最大进程限制。这个错误可能会影响到数据库的正常运行,阻止用户执行查询...

    ora_error大全.doc

    22. **ORA-12027**: 指示一个操作超出了时间限制。 23. **ORA-12028**: 与LOB(大型对象)处理有关,可能是LOB操作失败。 24. **ORA-12029**: 读取或写入LOB数据时出现问题。 25. **ORA-12030** 和 **ORA-12031**...

    Oracle错误代码大全.pdf

    25. ORA-00051: 等待资源超时,这可能是因为资源被长时间占用。 26. ORA-00052: 超出最大入队资源数,数据库资源管理限制。 27. ORA-00053: 超出最大入队数,这与数据库的并发处理能力有关。 28. ORA-00054: 资源...

    oracle 数据库错误一览表

    二、ORA-01422:精确提取超出了最大允许数量 当使用SQL查询返回的结果集超过默认的最大行数(通常为1000行)时,会出现此错误。可以通过设置SQL*Plus的ROWCOUNT参数来提高限制,或者调整查询以返回更少的行。 三、...

    ORACLE错误代码文档

    提示用户的会话已被系统自动结束,可能是由于长时间无操作或资源限制。 14. ORA-00029: 会话不是用户会话 指示会话不是由有效的数据库用户创建的,可能是权限或认证问题。 15. ORA-00030: 用户会话 ID 不存在。 ...

    oracle错误一览表

    - **解决方法**: 可以通过增加`LICENSE_MAX_SESSIONS`参数的值来提高最大会话数限制,或者优化现有会话的使用情况,减少不必要的长时间运行的连接。 **ORA-00019: 超出最大会话许可数** - **描述**: 类似于ORA-...

    Oracle错误代码集合[参考].pdf

    17. ORA-17070 至 ORA-17094: 包括数据大小超出限制、VARRAY溢出、操作不支持、值冲突以及并发级别和结果类型的问题。 18. ORA-17095 至 ORA-17099: 这些错误涵盖了各种内部错误、不允许的操作、创建结果集失败以及...

    Oracle错误编码大全[文].pdf

    3. ORA-00254: 归档控制字符串错误,可能是格式不正确或超出长度限制。 4. ORA-00259和ORA-00260: 这些错误涉及到当前日志不能被存档,可能是因为日志正在被使用或未准备好归档。 解决这些问题通常需要数据库管理员...

    ORACLE错误一览表

    例如,在用户表中,如果用户名字段被定义为唯一,则试图插入一个已经存在的用户名将导致ORA-00001错误。 ### ORA-00017:Ựø¼ 这通常意味着由于某种原因,如资源限制、等待时间过长等,Oracle无法完成请求的操作...

    oracle异常处理

    15. `Not_logged_on` (ora-01012):在未连接到 Oracle 数据库时执行 PL/SQL 代码。 16. `Program_error` (ora-06501):PL/SQL 内部错误。 17. `Rowtype_mismatch` (ora-06504):宿主游标变量和 PL/SQL 游标变量类型...

    预定义异常

    1. **ACCESS_INTO_NULL (ORA-06530)** - 描述:尝试对未初始化的对象赋值。 - 举例:当试图访问一个尚未创建或初始化的对象时,例如通过调用其方法或属性。 2. **CASE_NOT_FOUND (ORA-06592)** - 描述:在`CASE`...

    Oracle21个预定义异常

    - **异常描述**:访问嵌套表或VARRAY元素时下标超出范围时触发。 - **错误代码**:ORA-06533 - **场景示例**:在操作嵌套表或VARRAY数组时,若下标超过了现有元素的数量,将引发此异常。 #### 16. SUBSCRIPT_...

    关闭空闲连接

    这个问题通常出现在服务器需要优化性能、减少资源消耗或者防止因长时间未使用的连接占用资源而导致的问题。在本案例中,我们将主要探讨如何处理Oracle数据库中的空闲连接问题。 标题“关闭空闲连接”指的是在数据库...

    Oracle错误码大全

    例如,对于ORA-01438(值超出列的最大长度)这样的错误,大全中可能建议我们在设计表结构时合理设置字段长度,或者在插入数据时确保数据符合列的定义。 在使用"Oracle错误码大全"时,我们可以根据压缩包内的RAR.txt...

    oracle异常(最全异常收集)

    - 赋值操作超出变量容量限制。 - **解决方案**: - 确保变量类型与赋值数据类型一致。 - 检查并修正赋值操作中的数据范围。 #### ORA-6504:ROWTYPE_MISMATCH - **异常说明**:行类型不匹配。 - **常见原因**:...

    sqlldr报超出字符长度错误

    在使用SQL*Loader工具导入数据时,可能会遇到超出字符长度限制的错误。这类问题通常出现在需要将包含较长字符串的数据加载到表中时,而目标列定义的长度不足以容纳实际数据的情况。本文将围绕SQL*Loader字符长度错误...

    oracle常见Exception

    当尝试对数据进行非法操作或操作超出了数据的有效范围时,系统会抛出`VALUE_ERROR`(ORA-06502)异常。 **解决方法:** 1. **范围检查**:在执行操作前进行必要的范围检查。 2. **使用CASE WHEN语句**:通过CASE ...

    Oracle Exception汇总(自定义Oracle异常)

    16. **SUBSCRIPT_BEYOND_COUNT** (ORA-06533): 当尝试访问嵌套表或VARRAY元素的下标超出其范围时,会触发此异常。确保下标在有效范围内。 17. **SUBSCRIPT_OUTSIDE_LIMIT** (ORA-06532): 当使用嵌套表或VARRAY元素...

    oracle最全面的错误疑难解决方案和总结文档

    2. ORA-01422:精确提取超出了允许范围 此错误通常发生在使用SQL查询时,试图从一个返回多行的子查询中提取单个值。解决方法是使用聚合函数(如MAX或MIN)或调整查询以处理多个结果。 3. ORA-01555:快照过旧 当...

    Oracle中提示无法分配超出 7 的 MINEXTENTS (在表空间 PERFSTAT 中)

    在Oracle数据库管理过程中,可能会遇到ORA-01659错误:“无法分配超出 7 的 MINEXTENTS(在表空间 PERFSTAT 中)”。此错误表明数据库在尝试为某个对象(如表或索引)分配额外的空间时遇到了限制,具体来说是...

Global site tag (gtag.js) - Google Analytics