ORA-02080:database link is in use

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>;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值