环境介绍
双机 操作系统:AIX 6.1 数据库版本:oracle 11g R1 64bit 主机名称:fly007
1、今天在数据库创建了5个dblink,在同一个会话中进行dblink查询测试时,当执行到第5条查询语句时,报ORA-02020 too many database links in use错误,注意,是通过dbink连接不同的数据库,如果是连接相同的数据库,是不会报该错误的,报错信息如下所示:
$hostname fly007 $ cat db_link.sql select sysdate from dual@to_fly1; select sysdate from dual@to_fly2; select sysdate from dual@to_fly3; select sysdate from dual@to_fly4; select sysdate from dual@to_fly5; $ sqlplus /nolog SQL> conn /as sysdba SQL> set echo on SQL> @db_link.sql SQL> select sysdate from dual@to_fly1; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly2; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly3; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly4; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly5; select sysdate from dual@to_fly5 ERROR at line 1: ORA-02020: too many database links in use
2、使用oerr查看该错误信息:
$ oerr ora 2020 02020, 00000, "too many database links in use" // *Cause: The current session has exceeded the INIT.ORA open_links maximum. // *Action: Increase the open_links limit, or free up some open links by // committing or rolling back the transaction and canceling open // cursors that reference remote databases.
3、根据以上提示,查看open_links参数,默认为4
SQL> show parameter open_links NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_links integer 4 open_links_per_instance integer 4
4、查看官方文档
OPEN_LINKS Property Description Parameter type Integer Default value 4 Modifiable No //即不可以在线更改该参数,需要重启数据库才能生效 Range of values 0 to 255 OPEN_LINKS specifies the maximum number of concurrent open connections to remote databases in one session.If you set OPEN_LINKS to 0, then no distributed transactions are allowed.
open_links 指定在一次会话中同时打开的与远程数据库的连接的最大数量。该值应等于或超过 SQL 语句中引用的数据库的数量,这样才能打开所有数据库以便执行该语句。 取值范围为:0 - 255 (如果为 0,不允许分布式事务处理)
OPEN_LINKS_PER_INSTANCE Property Description Parameter type Integer Default value 4 Modifiable No Range of values 0 to 4294967295 (4 GB -1) Real Application Clusters,Multiple instances can have different values. OPEN_LINKS_PER_INSTANCE specifies the maximum number of migratable open connections globally for each database instance.XA transactions use migratable open connections so that the connections are cached after a transaction is committed
open_links_per_instance指定 XA 应用程序中可移植的打开连接的最大数量。XA 事务处理使用可移植的打开的连接,以便在提交一个事务处理后能将这些连接高速缓存
5、Do not set open_links too high, it is better for the application to close database links when
no longer in use than to change the parameter to a high number
不建议将open_links参数改的太高,我们建议在不使用dblink的时候,应用程序应关闭dblink
6、每次用dblink连接远程数据库,即使只执行了select语句,也会启动一个事物; 所以必须提交!提交后,有两种方式可以关闭dblink,一种是退出该会话,这是隐式的方式,另外一种显示的关闭dblink:
alter session close database link 要关闭的dblink名称;
7、如果不关闭dblink,则连接的资源不会被释放,我们可以在远程数据库,执行如下语句,我们发现该远程会话会一直保留直到原会话退出或者当我们显示的关闭dblink后,才会退出:
select * from v$session t where t.machine='fly007';
这里要注意,需要先执行commit后,然后才能执行alter session close database link dblink_name成功,否则会报:ORA-02080: database link is in use
下面举例说明:
1、当使用dblink查询到第4条语句后,进行提交,执行到第5条查询语句,不再报错:
$hostname fly007 $ cat db_link.sql select sysdate from dual@to_fly1; select sysdate from dual@to_fly2; select sysdate from dual@to_fly3; select sysdate from dual@to_fly4; commit; select sysdate from dual@to_fly5; $ sqlplus /nolog SQL> conn /as sysdba SQL> set echo on SQL> @db_link.sql SQL> select sysdate from dual@to_fly1; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly2; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly3; SYSDATE ------------------ 27-DEC-13 SQL> select sysdate from dual@to_fly4; SYSDATE ------------------ 27-DEC-13 SQL> commit; Commit complete. SQL> select sysdate from dual@to_fly5; SYSDATE ------------------ 27-DEC-13
2、查询v$dblink视图
SQL> col db_link format a15; SQL> col IN_TRANSACTION format a15 SQL> select db_link,in_transaction from v$dblink; DB_LINK IN_TRANSACTION --------------- --------------- to_fly1 NO to_fly2 NO to_fly3 NO to_fly5 YES
3、关闭dblink,再查看v$dblink,返回空,所有dblink资源释放
SQL> alter session close database link to_fly1; Session altered. SQL> alter session close database link to_fly2; Session altered. SQL> alter session close database link to_fly3; Session altered. SQL> alter session close database link to_fly5; //to_fly5的事务还处于ACTIVE状态,需要先提交,才能关闭dblink ERROR: ORA-02080: database link is in use SQL> commit; Commit complete. SQL> alter session close database link to_fly5; Session altered. SQL> select * from v$dblink; no rows selected
4、查看数据库中总共有多少个dblink
SQL> select count(*) from dba_db_links; COUNT(*) ---------- 5
5、If you are not sure how many database links are opened up concurrently by your session's database
application, you can query v$dblink.
SQL> col in_transaction format a15 SQL> select in_transaction, count(*) from v$dblink group by in_transaction; IN_ COUNT(*) --- ---------- YES 1
6、修改open_links参数
SQL> alter system set open_links=10 scope=spfile;