ORA-02020產生的原因及解決辦法

wmlm發表於2008-07-24
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 ;

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

sql> conn
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

SQL> select count(1)
2 from
a,
3
b,
4
c,
5
d,
6
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
from where rownum<7;
查詢依然正常,看來不是併發的,也不能斷定,
在PL/SQL中的一個CMD中執行下述
select * from
where rownum<2;
select * from
where rownum<2;
select * from
where rownum<2;
select * from
where rownum<2;
select * from
where rownum<2;
select * from
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 ;
select count(1) from
;
select count(1) from
;
select count(1) from
;
select count(1) from
;
select count(1) from
;

SQL> select count(1) from ;
select count(1) from

*
ERROR at line 1:
ORA-02020: too many database links in use


SQL> select count(1) from ;

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

SQL> select count(1) from ;

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

SQL> select count(1) from ;

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

SQL> select count(1) from ;

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章