ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于ORA-02020: 过多的数据库链接在使用中 错误的进阶研究

关于ORA-02020: 过多的数据库链接在使用中 错误的进阶研究

原创 Linux操作系统 作者:lnwxzyp 时间:2009-12-28 01:18:40 0 删除 编辑
    最近遇到了ORA-02020的错误,通过对这一错误的解决,终于搞懂了一些深层次的东西。
首先查看数据库的相关参数:(tool:PL/SQL Developer→command window)
SQL> show parameter open_links

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
open_links                           integer     4

这个参数是说允许4个数据库连接同时打开。 为此进行测试:
(tool:PL/SQL Developer→command window)

SQL> SELECT * FROM dual@link_1;

DUMMY
-----
X

SQL> SELECT * FROM dual@link_2;

DUMMY
-----
X

SQL> SELECT * FROM dual@link_3;

DUMMY
-----
X

SQL> SELECT * FROM dual@link_4;

DUMMY
-----
X

SQL> SELECT * FROM dual@link_5;

DUMMY
-----
X

已经使用了5个数据连接并没有发生错误,换成生产当中报错的表继续进行测试:
(tool:PL/SQL Developer→SQL window)
SELECT * FROM log@link_1;
SELECT * FROM log@link_2;
SELECT * FROM log@link_3;
SELECT * FROM log@link_4;
SELECT * FROM log@link_5;
第五个数据连接报错:ORA-02020: 过多的数据库链接在使用中。经过一番测试发现log表的数据量比较大,有上万条记录,在执行语句之后 commit和rollback图标就成了高亮形式,一旦第5个也会变成高亮图标之前就会报错 又经过测试,发现选取的记录达到26条及以上时就会出现高亮的commit和rollbak图标,低于26条则不会出现。但是在(tool:PL/SQL Developer→command window)下测试的时候并不报错。
SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<27;

     LEVEL
----------
         1
         2
       ...
        26

SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<27;

     LEVEL
----------
         1
         2
       ...
        26

SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<27;

     LEVEL
----------
         1
         2
       ...
        26

SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<27;

     LEVEL
----------
         1
         2
       ...
        26

SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<27;

     LEVEL
----------
         1
         2
       ...
        26

并没有发生报错的情况,同时commit和rollback的图标也没有发生变化,使用for update选项来进行测试 (tool PL/SQL developer→command window)

SQL> SELECT LEVEL FROM dual@dblink_1 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@dblink_2 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;

SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE

ORA-02020: 过多的数据库链接在使用中

这次错误出现了,网上查到解决的办法:alter session close database link link_name,但是在执行之后发现报错

SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;

SQL> ALTER SESSION CLOSE DATABASE LINK link_1;

ALTER SESSION CLOSE DATABASE LINK link_1

OORA-02080: 数据库链接正在使用中

看到这个错误,我这里实际出错的情况是存储过程当中多个合并查询连接不同的数据库,才出现了错误,于是继续测试:

SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> ALTER SESSION CLOSE DATABASE LINK link_1;

OORA-02080: 数据库链接正在使用中

依然还是报错,这说明并不是多个以上在使用以后才能够关闭数据连接,他们并不存在依赖关系。 由于是commit和rollback图标点亮之后才出现的错误,于是我先尝试对每一条语句执行后进行提交或回滚操作:

SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> ROLLBACK;

Rollback complete

SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> ROLLBACK;

Rollback complete

SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> COMMIT;

Commit complete

SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> ROLLBACK;

Rollback complete

SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> COMMIT;

Commit complete

SQL> SELECT LEVEL FROM dual@link_6 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> ROLLBACK;

Rollback complete

使用了6个数据连接并没有发生报错的情况,而这个时候使用关闭数据连接的语句也不起作用

ALTER SESSION CLOSE DATABASE LINK link_1

ORA-02081: 数据库链接未打开

最后进行一次测试,这次才恍然大悟:
SQL> SELECT LEVEL FROM dual@dblink_1 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@dblink_2 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> COMMIT;

Commit complete

SQL> ALTER SESSION CLOSE DATABASE LINK dblink_1;

Session altered

SQL> ALTER SESSION CLOSE DATABASE LINK dblink_2;

Session altered

SQL> ALTER SESSION CLOSE DATABASE LINK link_3;

Session altered

SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;

     LEVEL
----------
         1

SQL> COMMIT;

Commit complete

SQL> ALTER SESSION CLOSE DATABASE LINK link_4;

Session altered

看到这里,相信大家也明白了吧,也能够很容易的得出结论:
1.26条以上的记录并且在sql window窗口下(存储过程里面也一样)超过4个数据库连接,才会发生错误,如果没有达到26条记录,那么放心的使用多个数据库连接吧,不会有什么影响。
2.使用alter session关闭数据连接的前提是已经有4个以内的数据库连接”被使用“(相信大家已经明白 被使用是什么概念)并且最近被使用的数据连接已经被提交或者回滚的情况下可以使用,否则会出现”ORA-02080: 数据库链接正在使用中“的错误




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12216142/viewspace-623702/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    129
  • 访问量
    737293