這篇主要介紹一下database link由於連接資料庫的方式不同遇到的一些問題,我們知道連接ORACLE伺服器的模式一般有兩種方式:專用伺服器連接(dedicated server)和共用伺服器連接(shared server)。這次遇到的案例服務是dblink跟連接ORACLE方式有關,當然本質... ...
這篇主要介紹一下database link由於連接資料庫的方式不同遇到的一些問題,我們知道連接ORACLE伺服器的模式一般有兩種方式:專用伺服器連接(dedicated server)和共用伺服器連接(shared server)。這次遇到的案例服務是dblink跟連接ORACLE方式有關,當然本質原因是什麼呢,這也是我這篇文章在探討的問題。下麵通過案例來講述一下具體情況:
我們先來搭建測試環境,具體測試環境信息如下所示:
Server A:
Server IP : 10.20.57.24
DB Version: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Server A是開啟了資料庫共用模式的。如下所示,shared_servers參數值為10
Server B:
Server IP : 192.168.27.132
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
我們在Server B上面創建三個db link鏈接到Server A(註意三個db link的連接方式有所區別,區別:SERVER = SHARED、SERVER = DEDICATED、以及沒有指定SERVER的方式),如下所示:
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;