ORA-02020产生的原因及解决办法

J2EE应用连接ORACLE数据库,使用了多个数据库链路进行查询,遇到ORA-02020错误,前人虽有解决方法,但原理不很清楚,因此要搞个明白......(凡涉及到公司机密的地方,均以XXX代替,观者自酌)[@more@]

测试目的:
解决XXX遇到的ORA-02020问题
验证open_links参数的确切含义,是一个会话中的多个链路?还是一个链路多个表同时访问?

测试流程:
1 测试一个数据库链路中的一个查询关联5个表
2 测试多个数据库链路的同时查询

具体步骤:
1 测试一个数据库链路的一个查询中的关联5个表
查看可用的TNSNAMES ORA
在orcl2上建立一个db_link
使用这个db_link编写一个多表关联的查询

2 测试多个数据库链路的同时查询
查看可用的TNSNAMES ORA,能不能再创建4个db link?
再创建4个不同数据库的链路
同时使用5个数据库链路进行查询


SQL> desc user_db_links
Name Null? Type
----------------------------------------------------- -------- ---------------

DB_LINK NOT NULL VARCHAR2(128)
USERNAME VARCHAR2(30)
PASSWORD VARCHAR2(30)
HOST VARCHAR2(2000)
CREATED NOT NULL DATE

SQL> col db_link for a20
SQL> col host for a20
SQL> select db_link,username,host from user_db_links;
no rows selected
SQL> create database link sgfp_56 connect to sgfp identified by sgfp using 'sgfp_10.10.10.56';

Database link created.

-- 首先测试一个链路中多表查询情况
SQL> select db_link,username,host from user_db_links;

DB_LINK USERNAME HOST
-------------------- ------------------------------ --------------------
SGFP_56 SGFP sgfp_10.10.10.56

SQL> select count(1) from user_tables@sgfp_56;

COUNT(1)
----------
250

sql> conn sgfp/sgfp@sgfp_10.10.10.56
sql> create table ww_tbl1 (col1 number(2));
sql> create table ww_tbl2 (col1 number(2));
sql> create table ww_tbl3 (col1 number(2));
sql> create table ww_tbl4 (col1 number(2));
sql> create table ww_tbl5 (col1 number(2));
sql> create table ww_tbl6 (col1 number(2));
sql> select count(1)
from ww_tbl1 a,
ww_tbl2 b,
ww_tbl3 c,
ww_tbl4 d,
ww_tbl5 e
where a.col1 = b.col1
and a.col1 = c.col1
and a.col1 = d.col1
and a.col1 = e.col1
;
COUNT(1)
----------
0
sql> insert into ww_tbl1 values (1);
sql> insert into ww_tbl2 values (1);
sql> insert into ww_tbl3 values (1);
sql> insert into ww_tbl4 values (1);
sql> insert into ww_tbl5 values (1);
sql> insert into ww_tbl6 values (1);
sql> commit;
SQL> select count(1)
2 from ww_tbl1 a,
3 ww_tbl2 b,
4 ww_tbl3 c,
5 ww_tbl4 d,
6 ww_tbl5 e
7 where a.col1 = b.col1
8 and a.col1 = c.col1
9 and a.col1 = d.col1
10 and a.col1 = e.col1
11 ;

COUNT(1)
----------
1
sql> conn tuner/tuner@orcl2
SQL> select count(1)
2 from ww_tbl1@sgfp_56 a,
3 ww_tbl2@sgfp_56 b,
4 ww_tbl3@sgfp_56 c,
5 ww_tbl4@sgfp_56 d,
6 ww_tbl5@sgfp_56 e
7 where a.col1 = b.col1
8 and a.col1 = c.col1
9 and a.col1 = d.col1
10 and a.col1 = e.col1;

COUNT(1)
----------
1

SQL> /

COUNT(1)
----------
1

SQL>
-- 小结:上述证明,在一个SQL中关联多表超过4个是可以的,下面继续看看在一个SESSION中多个查询的情况
使用PL/SQL进行测试
。。。(转到制证中心处理常口的备份日志问题,处理完毕,继续上面的研究)。。。

连接到人口库上,
新增一个数据库链路
create database link rkxx 。。。
打开PL/SQL,开6个SQL窗口,进行查询
取6个查询语句
select 'select * from '||tname||'@rkxx;' from tab@rkxx where rownum<7;
查询依然正常,看来不是并发的,也不能断定,
在PL/SQL中的一个CMD中运行下述
select * from CZRKxxx@rkxx where rownum<2;
select * from CZRKxxx@rkxx where rownum<2;
select * from CZRKxxx@rkxx where rownum<2;
select * from CZRKxxx@rkxx where rownum<2;
select * from CZRKxxx@rkxx where rownum<2;
select * from CZRKxxx@rkxx where rownum<2;
依然可以查询。???

如何模拟出这个错误呢?pl/sql从版本6换成版本7
打开一个SQL,同时执行6个查询,依然没有问题,怎么办?

只能回公司,增加5个数据库链路再次战斗。。。
创建以下数据库链路
CGSEN_10.10.10.8
HTJSCGS_10.10.10.8
ORCL_10.10.10.34
ORCL_10.10.10.26
GS12366_166

create database link cgsen_8 xxx

create database link htjscgs_8 xxx

create database link ORCL_34 xxx

create database link ORCL_26 xxx
create database link GS12366_166xxx


select db_link,username,host from user_db_links;
DB_LINK USERNAME
------------ ------------------------------
CGSEN_8 CGSZS
GS12366_166 SYSTEM
HTJSCGS_8 HCGS
ORCL_26 DUCK
ORCL_34 SCOTT
RKXX RKXX_ZS
SGFP_56 SGFP

6 rows selected.

select count(1) from user_tables@htjscgs_8 ;
select count(1) from user_tables@ORCL_34 ;
select count(1) from user_tables@ORCL_26 ;
select count(1) from user_tables@GS12366_166 ;
select count(1) from user_tables@sgfp_56 ;
select count(1) from user_tables@dxpt_35;

SQL> select count(1) from user_tables@htjscgs_8 ;
select count(1) from user_tables@htjscgs_8
*
ERROR at line 1:
ORA-02020: too many database links in use


SQL> select count(1) from user_tables@ORCL_34 ;

COUNT(1)
----------
4

SQL> select count(1) from user_tables@ORCL_26 ;

COUNT(1)
----------
188

SQL> select count(1) from user_tables@GS12366_166 ;

COUNT(1)
----------
138

SQL> select count(1) from user_tables@sgfp_56 ;

COUNT(1)
----------
256

SQL>

ora-02020 错误终于出来了!!
这次的原因是因为open_lins_per_instance=4 open_lins=4,下面进行验证
5个查询没有问题,需要再增加一个db link;

create database link dxpt_35 connect to xxx

错误再次出现

总结如下:
参数设置:
SQL> show parameter open_links

NAME TYPE VALUE
------------------------------------ ----------- -----
open_links integer 5
open_links_per_instance integer 4

错误场景:
打开一个会话,
连接5个不同的数据库链路
再连接第6个数据库链路时,报ORA-02020: too many database links in use
对应ORACLE文档上所云:每个会话打开的数据库链路数量不能超过open_links设置的参数。
结论:看来增大open_links,可以解决这个问题.

open_links_per_instance又有什么用呢?

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

转载于:http://blog.itpub.net/271063/viewspace-1007769/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值