這篇主要介紹一下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
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>
使用sys用戶檢查會話鏈接方式
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個。
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.
部分測試截圖以下:
實驗總結:
會話鏈接方式 |
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的會話使用哪一種鏈接方式沒有任何關係。