網路配置相關內容總結

warehouse發表於2009-05-31
網路問題是困擾初學者的大問題,簡單的總結了一下,希望對一些人有所幫助。[@more@]

1、listener
首先對初學者要明確一下listener是在db server上配置,凡是在client端要
連線db都需要透過listener,就像非本單位員工要想進入該單位所在的辦公大樓
必須去保安那裡登記一下自己的資訊(亮名自己的身份同時說出來要找誰、辦什麼事兒),
之後保安打電話和你要找的人進行確認和求證。
這裡不打算介紹lsnrctl中的內容,這個doc上有,而且也比較簡單,重點
介紹一下pub上經常人們問到的一些和net相關的或者說可能是困擾初學者
的一些不太容易掌握的問題,當然這裡介紹的內容也不復雜。
a)靜態註冊的監聽配置時到底在"全域性資料庫"一項中輸入什麼?
這裡再次明確一下輸入什麼都可以,舉例:
listener檔案配置如下:
LISTENER1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)

SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test)
(ORACLE_HOME = E:oracleproduct10.2.0db_1)
(SID_NAME = test)
)
(SID_DESC =
(GLOBAL_DBNAME = a) --a是一個和我操作的db無關的資訊
(ORACLE_HOME = E:oracleproduct10.2.0db_1)
(SID_NAME = test)
)
)
--==========================
status資訊如下:
LSNRCTL> status listener1
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1521)))
LISTENER 的 STATUS
------------------------
別名 listener1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 31-5月 -2009 20:35:44
正常執行時間 0 天 0 小時 1 分 29 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程式引數檔案 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
監聽程式日誌檔案 e:oracleproduct10.2.0db_1networkloglistener1.lo
g
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1521)))
服務摘要..
服務 "a" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "test" 包含 2 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
例程 "test", 狀態 READY, 包含此服務的 1 個處理程式...
命令執行成功
LSNRCTL>
--========================================
從listener的status我們發現存在[服務 "a"]和[服務 "test"]兩項資訊,
其中[例程 "test", 狀態 UNKNOWN],[例程 "test", 狀態 UNKNOWN]就是透過讀取
listener.ora檔案中我們靜態登記的資訊來註冊listener的:
這裡[服務 "a"]和[服務 "test"]中的a和test就是listener.ora中的GLOBAL_DBNAME(再次宣告
寫什麼都可以),
[例程 "test"]中的test是指listener.ora中的sid,這裡一定不能寫錯,寫錯了,配置listener肯定沒有
問題不會出錯,但是肯定不能透過其配置的net service連上db,因為其對應的instance根本就不存在。
b)從上面listener的status資訊中我們還發現了[服務 "test"]下面還包括了
[例程 "test", 狀態 READY]資訊,這裡的ready表示的是後臺程式pmon透過讀取引數
service_names在listener上進行了動態註冊:
SQL> show parameter service_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string TEST
SQL> alter system set service_names=b,c;

系統已更改。

SQL> alter system set instance_name=instance_test;
alter system set instance_name=instance_test
*
第 1 行出現錯誤:
ORA-02095: 無法修改指定的初始化引數


SQL> alter system set instance_name=instance_test scope=spfile;

系統已更改。

SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 67110244 bytes
Database Buffers 96468992 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> show parameter service_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string B, C
SQL>
--==================================
修改了service_names和instance_name之後再來看listener的status資訊:
LSNRCTL> status
正在連線到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
別名 listener1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 31-5月 -2009 20:35:44
正常執行時間 0 天 0 小時 15 分 25 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程式引數檔案 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
監聽程式日誌檔案 e:oracleproduct10.2.0db_1networkloglistener1.lo
g
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1521)))
服務摘要..
服務 "B" 包含 1 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "C" 包含 1 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "a" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "test" 包含 2 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 1 個處理程式...
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功
LSNRCTL>
--=====================================
我們發現pmon自動提取service_names的值進行了動態註冊,同時注意到
動態註冊資訊中顯示的[例程 "INSTANCE_TEST"],這裡的INSTANCE_TEST是instance_name,
另外要注意的是不管引數service_names是否有值,pmon始終會把db_name動態註冊到listener
上(服務 "test" 包含 2 個例程。
例程 "INSTANCE_TEST", 狀態 READY)
說到這裡listener這部分應該差不多了,接下來看看在client端配置的tns
3、tns
tns是一定要在本地client端配置的:
下面是配好的一個tns,其網路服務名是ABC
ABC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
這裡的ABC就是網路服務名,隨便寫什麼都可以,重要的是=後面的每一項資訊
都不能寫錯,host和port很好理解,不多贅述,重要的是這個SERVICE_NAME到底是
指什麼?這裡明確說明一下,它就是我們在listener status資訊中顯示的那些
服務 "X",這裡的X=B,C,a,TEST(看上面的listener status資訊),這裡如果
SERVICE_NAME=B|C,那麼透過這個tns連線所對應的session它使用的就是動態註冊
的listener連線db的;如果SERVICE_NAME=a,那麼透過這個tns連線所對應的session
它使用的就是靜態註冊的listener連線db的;如果SERVICE_NAME=test的話,
那麼透過這個tns連線所對應的
session它使用的到底是透過動態還是靜態listener連線db的呢?
接下來我們看一下:
首先使用B,C,a,TEST建立4個tns:
tnsB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = B)
)
)
tnsC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = C)
)
)
tnsa =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = a)
)
)
tns_test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
測試一下這4個tns是否能通:
C:>tnsping tnsb

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -
2009 21:11:52

Copyright (c) 1997, 2005, Oracle. All rights reserved.

已使用的引數檔案:
e:oracleproduct10.2.0db_1networkadminsqlnet.ora


已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = B)))
OK (30 毫秒)
--=========================================
C:>tnsping tnsc

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -
2009 21:11:54

Copyright (c) 1997, 2005, Oracle. All rights reserved.

已使用的引數檔案:
e:oracleproduct10.2.0db_1networkadminsqlnet.ora


已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = C)))
OK (10 毫秒)
--=========================================
C:>tnsping tnsa

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -
2009 21:11:56

Copyright (c) 1997, 2005, Oracle. All rights reserved.

已使用的引數檔案:
e:oracleproduct10.2.0db_1networkadminsqlnet.ora


已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = a)))
OK (10 毫秒)
--=========================================
C:>tnsping tns_test

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -
2009 21:12:00

Copyright (c) 1997, 2005, Oracle. All rights reserved.

已使用的引數檔案:
e:oracleproduct10.2.0db_1networkadminsqlnet.ora


已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test)))
OK (30 毫秒)

C:>
--=========================================
很顯然都是通的
4、連線db時使用在client端配置的網路服務名
接下來看看透過上面4個tns分別連線db,看看其對應的
session到底是使用靜態還是動態註冊的listener資訊來連線db的:
SQL> connect
已連線。
SQL> select sid,service_name from v$session where sid=(select sid from v$mystat
where rownum=1);

SID SERVICE_NAME
---------- ----------------------------------------------------------------
153 B
--========================================
SQL> connect
已連線。
SQL> select sid,service_name from v$session where sid=(select sid from v$mystat
where rownum=1);

SID SERVICE_NAME
---------- ----------------------------------------------------------------
153 C
--========================================
SQL> connect
已連線。
SQL> select sid,service_name from v$session where sid=(select sid from v$mystat
where rownum=1);

SID SERVICE_NAME
---------- ----------------------------------------------------------------
153 SYS$USERS
--========================================
SQL> connect
已連線。
SQL> select sid,service_name from v$session where sid=(select sid from v$mystat
where rownum=1);

SID SERVICE_NAME
---------- ----------------------------------------------------------------
153 TEST
--========================================
SQL>
透過上面查詢中的SERVICE_NAME我們就能清楚的知道這個session連線db使用的
是靜態還是動態註冊的listener資訊,很顯然SERVICE_NAME=SYS$USERS其對應的tnsa使用的
service_name=a是靜態註冊的資訊
可以透過如下檢視檢視db活動的service_name:
SQL> select name from v$active_services;

NAME
----------------------------------------------------------------
C
B
TEST
SYS$BACKGROUND --後臺程式對應的session的service_name都看作SYS$BACKGROUND
SYS$USERS --oracle統一把靜態註冊到listener的globaldb_name資訊對應的service_name都看作SYS$USERS
--=====================================
以上db是執行在專用模式下,當然我們配置的tns使用的都是專用模式,下面看看
db執行在共享模式時的情況:
5、首先要保證db執行在mts模式下:
SQL> alter system set dispatchers='(PROTOCOL=TCP)';

系統已更改。

SQL> select count(*) from v$shared_server;

COUNT(*)
----------
0

SQL> select count(*) from v$dispatcher;

COUNT(*)
----------
1
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 67110244 bytes
Database Buffers 96468992 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select count(*) from v$shared_server;

COUNT(*)
----------
1

SQL> select count(*) from v$dispatcher;

COUNT(*)
----------
1
下面是listener的status資訊:
LSNRCTL> services
正在連線到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
服務摘要..
服務 "B" 包含 1 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 2 個處理程式...
處理程式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1002 狀態: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
LOCAL SERVER
服務 "C" 包含 1 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 2 個處理程式...
處理程式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1002 狀態: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
LOCAL SERVER
服務 "a" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
服務 "test" 包含 2 個例程。
例程 "INSTANCE_TEST", 狀態 READY, 包含此服務的 2 個處理程式...
處理程式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1002 狀態: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
LOCAL SERVER
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
命令執行成功
LSNRCTL>
透過上面的service顯示出來的資訊發現了什麼?
如果想在client端配置tns透過shared mode連線db,那麼
在配置tns時service_name必須是透過動態註冊到listener中的service
_names資訊,透過靜態註冊的listener資訊是不能透過共享模式連線db的,
如果透過靜態註冊的資訊連線db:
先配置一個tns:
TNS_MTS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = a)
)
)
驗證一下是否能通:
C:>tnsping tns_mts

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -
2009 21:59:34

Copyright (c) 1997, 2005, Oracle. All rights reserved.

已使用的引數檔案:
e:oracleproduct10.2.0db_1networkadminsqlnet.ora


已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = a)
))
OK (30 毫秒)
--===================================
其實這裡的通只是一個假相
看看具體的連線情況:
C:>sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 5月 31 21:59:55 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:
ORA-12523: TNS: 監聽程式無法找到適用於客戶機連線的例程


請輸入使用者名稱:
--=====================================
就這個問題,pub上n多人在不停的問,根本就連線不上,什麼原因我想不用解釋了吧
6、下面在配置網路相關內容時可能有些人會關注的一些引數:
SQL> show parameter db_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string TEST
SQL> show parameter instance_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string INSTANCE_TEST
SQL> show parameter service_names

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string B, C
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
test

SQL> select instance_name sid from v$instance;

SID
----------------
test

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

TEST

SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1022650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章