1、在xxxx上进行使用dblink查询表空间的时候,
遇到:ora-02020,导致无法再次使用dblink查询。
oracle $ 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.
报错说明很明显:dblink使用太多,已达到open_links的限制。
2、下面就开始查询这个值:
show parameter open_links
-----------------------------
open_links 4
open_links_per_instance 4
最大值是4.
3、查看当前使用的dblink:
select db_link from v$dblink;
------------------------------
DBL_YXGG
DBL_HNYYK_SO3
DBL_HNYYK_SO2
DBL_BHGG
确实已经达到了4个。
所以再次使用dblink查询的时候,就会报Ora-02020错误。
4、怎么解决这问题?
其实在,Action中就说明的很清楚,
(1)修改参数open_links
查询这个参数的修改是否需要重启实例:
select name,issys_modifiable,isinstance_modifiable,isses_modifibal from v$parameter where name='open_links';
----------------------------------------------------
open_links false false false
结果显示,这个参数为静态参数,需要 重启实例才能生效,修改命令如下:
alter system set open_links=(0-255) scope=sfpile;
重启实例。
(2)当session退出时:
select count(*) from v$dblink;
count(*)
-----------
0
(3)使用commit 或者 rollback
当前使用的dblink:
select db_link from v$dblink;
--------------
DBL_YXGG
DBL_HNYYK_SO3
DBL_HNYYK_SO2
DBL_BHGG
执行一次commit或者rollback,再次进行使用dblink查询,无报错,查询结果如下:
查询如下:
select db_link from v$dblink;
---------------
DBL_YXGG
DBL_HNYYK_SO3
DBL_HNYYK_SO2
DBL_HNYYK_SO4
发现显示的dblink名称,之后最后一个在改变,(进行多次,现象是一样的)。
总结:
在使用dblink的情况下,查询和DML操作都会造成分布式事务,长查询和没有及时提交或回滚事务都很容易造成ORA-02020报错。
因此应特别注意使用dblink的事务需及时提交或回滚事务,避免长查询。
在设置open_links时应了解应用开发商方面使用dblink的查询语句执行时间和查询密度,才能做出最有效的调整。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29677883/viewspace-2123975/
,如需转载,请注明出处,否则将追究法律责任。