Oracle dblink的鏈接模式的關係測試總結

這篇主要介紹一下database link因爲鏈接數據庫的方式不一樣遇到的一些問題,咱們知道鏈接ORACLE服務器的模式通常有兩種方式:專用服務器鏈接(dedicated server)和共享服務器鏈接(shared server)。此次遇到的案例服務是dblink跟鏈接ORACLE方式有關,固然本質緣由是什麼呢,這也是我這篇文章在探討的問題。下面經過案例來說述一下具體狀況:sql

 

咱們先來搭建測試環境,具體測試環境信息以下所示:數據庫

 

 

Server A:服務器

 

Server IP : 10.20.57.24session

DB Version: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 app

 

Server A是開啓了數據庫共享模式的。以下所示,shared_servers參數值爲10dom

 

clip_image001

 

Server B:ide

 

Server IP : 192.168.27.132測試

Oracle Database 10g Release 10.2.0.4.0 - 64bit Productionspa

 

咱們在Server B上面建立三個db link連接到Server A(注意三個db link的鏈接方式有所區別,區別:SERVER = SHARED、SERVER = DEDICATED、以及沒有指定SERVER的方式),以下所示:code

 

CREATE PUBLIC DATABASE LINK LINK_NODEFINE_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^" 
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = gsp.localdomain)
    )
  )';
 
 
CREATE PUBLIC DATABASE LINK LINK_SHARED_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^" 
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVER = SHARED)
      (SERVICE_NAME = gsp.localdomain)
    )
  )';
 
CREATE PUBLIC DATABASE LINK LINK_DEDIATED_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^" 
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVER = DEDICATED)
      (SERVICE_NAME = gsp.localdomain)
    )
  )';

 

而後咱們在Server A的TEST用戶下面新建表KERRY,以下所示:

 

SQL> CREATE TABLE TEST.KERRY(ID  NUMBER, NAME NVARCHAR2(32));
 
Table created.
 
SQL> INSERT INTO TEST.KERRY
  2  SELECT 100,'kerry' FROM DUAL;
 
1 row created.
 
SQL> commit;
 
Commit complete.

 

而後在客戶端鏈接到Server B(dedicated server方式),而後測試三種db link鏈接到Server A是什麼鏈接模式。以下測試所示:

 

 

1:在客戶端使用sqlplus鏈接到Server B,在Server B上使用db link查詢數據

 

SQL> show user;
USER 爲 "TEST"
SQL> select userenv('sid') from dual;
 
USERENV('SID')
--------------
           896
 
SQL> SELECT * FROM KERRY@LINK_NODEFINE_TEST;
 
        ID NAME
---------- ------------------------------------------------
       100 kerry
 
SQL>

 

clip_image002

 

 

使用sys用戶檢查會話鏈接方式

clip_image003

 

 

2:在Server A上使用下面SQL檢查經過db link鏈接過來的會話(查詢條件根據實際狀況調整),能夠確認使用LINK_NODEFINE_TEST連接過來的會話是共享服務器模式方式。關於SERVER爲NONE值,參考我這篇文章"v$session中server爲none與shared值解析".

 

SQL> show user;
USER is "SYS"
SQL> SELECT SID, SERIAL#,SERVER,MACHINE FROM V$SESSION 
  2  WHERE USERNAME='TEST' 
  3    AND MACHINE='mylnx01';
 
       SID    SERIAL# SERVER    MACHINE
---------- ---------- --------- ----------------------------------------------------------------
        67        506 NONE      mylnx01
 
SQL> 

 

而後繼續上面實驗,測試其它兩個db link,具體測試截圖,注意,這裏沒有退出會話,直接測試,因此,你會看到在Server A對應的會話也會增長到3個。

 

clip_image004

 

LINK_SHARED_TEST測試

 

SQL>SELECT * FROM KERRY@LINK_SHARED_TEST;

 

而後在SERVER A上查詢,你會發現LINK_SHARED_TEST的鏈接方式是SHARED SERVER,注意若是不想多個會話被幹擾,你能夠退出SQL*PLUS,而後從新登陸進行測試,每次就只能看到一個會話。

 

SQL> SELECT SID, SERIAL#,SERVER,MACHINE FROM V$SESSION 
  2  WHERE USERNAME='TEST' 
  3    AND MACHINE='mylnx01';
 
       SID    SERIAL# SERVER    MACHINE
---------- ---------- --------- ----------------------------------------------------------------
        67        506 NONE      mylnx01
        74         30 NONE      mylnx01
 
SQL> 
 
LINK_DEDIATED_TEST測試
 
SQL> SELECT * FROM KERRY@LINK_DEDIATED_TEST;

 

執行上面會話後,在SERVER A上執行下面查詢,你會發現LINK_DEDIATED_TEST對應的會話鏈接方式爲DEDICATED

 

 

SQL> SELECT SID, SERIAL#,SERVER,MACHINE FROM V$SESSION 
  2  WHERE USERNAME='TEST' 
  3    AND MACHINE='nbolnx01';
 
       SID    SERIAL# SERVER    MACHINE
---------- ---------- --------- ----------------------------------------------------------------
        67        506 NONE      mylnx01
        74         30 NONE      mylnx01
       135         32 DEDICATED mylnx01
 
SQL> 

 

而後咱們修改鏈接數據庫方式,從DEDICATED 改成SHARED,而後重複上面實驗,這裏限於篇幅,不作重複描述,測試實驗總結以下:

 

 

 

會話鏈接方式

LINK_NODEFINE_TEST

LINK_SHARED_TEST

LINK_DEDIATED_TEST

DEDICATED SERVER

SHARED SERVER

SHARED SERVER

DEDICATED SERVER

SHARED SERVER

SHARED SERVER

SHARED SERVER

DEDICATED SERVER

 

 

 

 

 

 

從測試結果能夠看出,若是目標服務器開啓了共享服務器模式,那麼在建立db link的時候,若是沒有指定鏈接方式爲DEDICATED SERVER的話,那麼無論使用db link以什麼方式鏈接到數據庫,db link都是以shared server方式鏈接到目標數據庫。

 

 

 

而後咱們在Server A關閉數據庫共享模式,而後再重複上面的測試實驗

 

SQL> alter system set shared_servers=0 scope=both;
 
System altered.
 
SQL> alter system set max_shared_servers=0 scope=both;
 
System altered.

 

 

部分測試截圖以下:

 

clip_image005

 

 

實驗總結:

 

會話鏈接方式

LINK_NODEFINE_TEST

LINK_SHARED_TEST

LINK_DEDIATED_TEST

DEDICATED SERVER

DEDICATED SERVER

ORA-12520錯誤

DEDICATED SERVER

SHARED SERVER

DEDICATED SERVER

ORA-12520錯誤

DEDICATED SERVER

 

 

 

 

 

 

若是Server A關閉了共享鏈接模式,那麼若是db link指定了SHARED SERVER的都報錯了,沒有指定鏈接方式的db link連接過去都是DEDICATED SERVER模式。

 

 

結論總結:

 

    dblink使用哪一種方式跟數據庫鏈接,跟建立dblink時指定的鏈接模式(CONNECT_DATA)有關,也跟dblink所指向的數據庫實例,是否開啓共享服務器模式與否有關。而跟使用dblink的會話使用哪一種鏈接方式沒有任何關係。

相關文章
相關標籤/搜索