ITPub博客

首页 > 数据库 > Oracle > [20160818]关闭数据库会话的dblink.txt

[20160818]关闭数据库会话的dblink.txt

原创 Oracle 作者:lfree 时间:2016-08-19 09:51:41 0 删除 编辑

[20160818]关闭数据库会话的dblink.txt

--昨天在跟别人聊天提到说对方的数据库出现session长时间存在事务无法提交的情况,问我什么回事。
--实际上很简单,问题很有可能出在使用dblink的情况,通过测试说明问题并且学习如何关闭链接。

1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create public database link "loopback"
connect to scott
identified by "book"
using '127.0.0.1/BOOK';

--我以前提到,这样可以dblink的测试,满足dblink的测试需求。

2.测试:
SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         1
--注意测试前仅仅1个会话username='SCOTT'。

SCOTT@book> select * from dept@loopback;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SCOTT@book> column XIDUSN_XIDSLOT_XIDSQN format a30
SCOTT@book> select dbms_transaction.local_transaction_id()   XIDUSN_XIDSLOT_XIDSQN from dual ;
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.11.1182

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.11.1182

    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS            USED_UBLK  USED_UREC XID              ADDR             START_DATE          C70
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------- ---------- ---------------- ---------------- ------------------- ----------------------------------------------------------------------
        10         11       1182          0          0          0          0 ACTIVE                    1          1 0A000B009E040000 000000008194F210 2016-08-19 09:43:27 ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU10_1197734989$' XID 10 11 1182;
                                                                                                                                                                          ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU10_1197734989$';
                                                                                                                                                                          ALTER SYSTEM DUMP DATAFILE 0 BLOCK 0;
--很明显执行dblink,会产生事务。

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         2
--现在变成了2个username='SCOTT'。        

--如果这个时候执行如下:
SCOTT@book> alter session close database link loopback;
ERROR:
ORA-02080: database link is in use

--必须要先commit。
SCOTT@book> commit ;
Commit complete.

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         2

SCOTT@book> alter session close database link loopback;
Session altered.

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         1

--要发一个commit,在执行后面的语句才能关闭alter session close database link loopback;。

总结:
1.使用dblink会执行事务。
2.如果应用大量使用dblink访问数据库,消耗的连接会很可观,即使你commit,dblink的连接也没有断开,要关闭必须执行:
  commit或者rollback,才能执行alter session close database link loopback;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2123710/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4010
  • 访问量
    7981626