暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于DBLINK使用的一些问题

原创 范计杰 2020-05-09
3997

ORACLE实例与DBLINK相关的参数

open_links --限制每个session可以打开的database link 数量
open_links_per_instance --指定每个数据库实例全局可迁移(可共享并缓存)的最大打开连接数,供XA transactions使用。

SQL> @p open_links

NAME                                     VALUE
---------------------------------------- ----------------------------------------
open_links                               4
open_links_per_instance                  4

SQL> 

测试当session中使用dblink后,什么时侯关闭?

测试发现应用session 关闭时,同时关闭session open的dblink
或者可以使用以下sql主动关闭
alter session close database link TEST_LINK;

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 09:25:35
--执行使用DBLINK的查询后,创建了一个DBLINK SESSION
SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                           USERNAME
---------- -------------------------------- --------------------
       263 oracle@perf-monitor (TNS V1-V3)  GM

---退出重新登录
SQL> select sid,module,username from v$session where module  like 'oracle%';

no rows selected

SQL> 

public daabase link 重用是否会重用?减少DBLINK连接数占用

当多个session使用相关的dblink时,不会共用,每个session只能使用自己的打开DBLINK.
并且下面5个session打开了5个dblink,也可以验证open_links(=4)限制的不是实例级的。

--session 1
alter session set container=perfdb;

SQL> create public database link pub_test_link connect to gm identified by gm using '//192.168.56.1:1521/perfdb';

Database link created.

SQL> select sid,module,username from v$session where module  like 'oracle%';

no rows selected


SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 09:56:31

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> 


---session 2

alter session set container=perfdb;

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> 

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 09:57:29

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       150 oracle@perf-monitor (TNS V1-V3)                                  GM
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> 

SQL> commit;

Commit complete.
---session 3


SQL> alter session set container=perfdb;

Session altered.

SQL> 
SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       150 oracle@perf-monitor (TNS V1-V3)                                  GM
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 09:59:10

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       150 oracle@perf-monitor (TNS V1-V3)                                  GM
       519 oracle@perf-monitor (TNS V1-V3)                                  GM
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> 


---session 5

SQL> alter session set container=perfdb;

Session altered.

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 10:09:43

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       150 oracle@perf-monitor (TNS V1-V3)                                  GM
       263 oracle@perf-monitor (TNS V1-V3)                                  GM
       519 oracle@perf-monitor (TNS V1-V3)                                  GM
       681 oracle@perf-monitor (TNS V1-V3)                                  GM
       795 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> 


测试验证open_links限制的是每个session打开的dblink的数量

当一个session打开>open_links个dblink时,报错ORA-02020: too many database links in use

···
SQL> create public database link pub_test_link2 connect to gm identified by gm using ‘//192.168.56.1:1521/perfdb’;

Database link created.

SQL> create public database link pub_test_link3 connect to gm identified by gm using ‘//192.168.56.1:1521/perfdb’;

Database link created.

SQL> create public database link pub_test_link4 connect to gm identified by gm using ‘//192.168.56.1:1521/perfdb’;

Database link created.

SQL> create public database link pub_test_link5 connect to gm identified by gm using ‘//192.168.56.1:1521/perfdb’;

Database link created.

SQL> @dblinks

OWNER DB_LINK USERNAME HOST CREATED


SYS SYS_HUB SEEDDATA 20180207 20:11:23
PUBLIC PUB_TEST_LINK2 GM //192.168.56.1:1521/perfdb 20200506 10:15:31
PUBLIC PUB_TEST_LINK3 GM //192.168.56.1:1521/perfdb 20200506 10:15:34
PUBLIC PUB_TEST_LINK4 GM //192.168.56.1:1521/perfdb 20200506 10:15:39
PUBLIC PUB_TEST_LINK5 GM //192.168.56.1:1521/perfdb 20200506 10:15:44

8 rows selected.

SQL> select sysdate from dual@TEST_LINK;

SYSDATE

20200506 10:17:14

SQL> select sysdate from dual@PUB_TEST_LINK2;

SYSDATE

20200506 10:17:27

SQL> select sysdate from dual@PUB_TEST_LINK3;

SYSDATE

20200506 10:17:32

SQL> select sysdate from dual@PUB_TEST_LINK4;

SYSDATE

20200506 10:17:34

—当前SESSION打开第5个DBLINK时报错
SQL> select sysdate from dual@PUB_TEST_LINK5;
select sysdate from dual@PUB_TEST_LINK5
*
ERROR at line 1:
ORA-02020: too many database links in use
···

测试如果dblink session被kill掉,再次使用时会报错,不是自动重连。

SQL> alter session set container=perfdb;

Session altered.

SQL> select sid,module,username from v$session where module  like 'oracle%';

no rows selected

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 10:29:54

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       551 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> @kill sid=551

COMMANDS_TO_VERIFY_AND_RUN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
alter system kill session '551,14996'immediate -- GM@perf-monitor (oracle@perf-monitor (TNS V1-V3));

SQL> 
SQL> alter system kill session '551,14996'immediate -- GM@perf-monitor (oracle@perf-monitor (TNS V1-V3));

System altered.

SQL> select sid,module,username from v$session where module  like 'oracle%';

no rows selected

SQL> select sysdate  from dual@TEST_LINK;
select sysdate  from dual@TEST_LINK
                     *
ERROR at line 1:
ORA-04088: error during execution of trigger 'SYS.LOGON_DENIED_TO_ALERT'
ORA-00604: error occurred at recursive SQL level 1
ORA-02051: another session or branch in same transaction failed or finalized
ORA-02051: another session or branch in same transaction failed or finalized
ORA-02063: preceding line from TEST_LINK

session commit(没有事务也需要commit)之后kill dblink session,再次使用时不会报错

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 10:43:49

SQL> select sid,module,username from v$session where module  like 'oracle%';

       SID MODULE                                                           USERNAME
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
       645 oracle@perf-monitor (TNS V1-V3)                                  GM

SQL> @kill sid=645

COMMANDS_TO_VERIFY_AND_RUN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
alter system kill session '645,54133'immediate -- GM@perf-monitor (oracle@perf-monitor (TNS V1-V3));

SQL> commit;

Commit complete.

SQL> alter system kill session '645,54133'immediate -- GM@perf-monitor (oracle@perf-monitor (TNS V1-V3));

System altered.

SQL> select sid,module,username from v$session where module  like 'oracle%';

no rows selected

SQL> select sysdate  from dual@TEST_LINK;

SYSDATE
-----------------
20200506 10:44:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论