您的位置:首页 > 其它

ORA-02080:database link is in use

2016-01-18 16:01 676 查看
ORA-02080:

database link is in use

Cause: a transaction is active or a cursor is open on the database link given in the alter session close database link <link> command.

Action: commit or rollback, and close all cursors

-----------------------------------

Cause:

由于大量使用dblink远程连接未正常释放所致,也可能是bug所致。

Solution:

一,最好不要大量使用dblink方式实时远程取数据,有大概如下几个缺点:

1,频繁对远程数据库创建连接,释放连接会有较大开销,特别是OLTP类数据库。

2,此类远程dblink连接session,如本地session不退出或手动释放,此类session是不会及时自动释放的。大量耗用远程数据库资源。

3,占用网络带宽

4,触发bug,此类bug很多

此类应用根绝实际需求可以用物化视图,触发器等方式替代.

注:切忌使用dblink嵌套dblink的访问方式,性能会非常糟糕,而且不稳定。

二,使用ALTER SESSION CLOSE DATABASE LINK dblink_name;语句来手动关闭远程dblink session.

在使用此语句前,切忌先执行commit;否则报错ORA-02080或者不能达到预期效果。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

db-link session在基于连接池的管理中可能会引起目标管理系统的Session泛滥,从而消耗进程资源。

最近出现一个关于db-link session的问题,在A数据库建立了一个DBLINK,其他有三台服务器利用DBLINK连接到A数据库,但是在应用中利用了连接池进行

session管理,当使用DBLINK时,在A数据库出现session快速增长,达到了顶峰从而导致进程资源消耗连接出现中断。

 

方式一:

使用命令

alter sesssion close database link <dblink_name>;

 

使用系统包

DBMS_SESSION.CLOSE_DATABASE_LINK(dblink_name);

 

 

此种方式需要用在应用程式当中,ORACLE文档说明,此方式只对当前session起作用,所以管理员SYS去关闭也是不成功的。

SQL> conn / as sysdba

Connected.

SQL> alter session close database link test;

ERROR:

ORA-02081: database link is not open

 

 

注意,在使用此方式的命令之前需要用commit命令首先提交,否则会出现ora-02080错误。

 

--eg:dblink

declare

  v varchar2(50);

  CURSOR r IS

    select first_name from t1@test;

begin

  open r;

  loop

    fetch r

      into v;

    exit when r%NOTFOUND;

  end loop;

  close r;

  commit;

  execute immediate 'alter session close database link test';

end;

/

 

 

 

方式二:

SQLNET.ORA文件中的参数设定(针对PROFILE的建立,限制用户资源使用)

SQLNET.EXPIRE_TIME= <inteval time>

注:用此方式会导致用户的会话都受到影响,除非DBLINK是单独使用一个用户。

 

 

方式三:

用SELECT查询并形成命令

select sid,

       serial#,

       username,

       osuser,

       machine,

       'alter system kill session ' || '''' || sid || ',' || serial# ||

       ''' immediate;' session_level

  from v$session

 where machine in ('DB01', 'DB02', 'DB03');

 

注意每个命令后面后加的immediate,没有加此关键字则v$session中的STATUS列会变为KILLED,但是资源并未释放。

利用方式三可以做成JOB定时kill session,但这样存在很大的风险。

 

总之,在使用DBLINK时一定要注意session的回收,在应用程序中使用

commit;

alter sesssion close database link <dblink_name>;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: