oracle 監聽器配置

winston_DBA發表於2015-03-22
一、監聽器配置概念
監聽器是執行在ORACLE資料庫伺服器端的一個重要程式,主要用於監聽來自遠端的客戶端請求。為什麼說是監聽來自遠端的請求呢?因為登入數據庫有一下三種常見方式:
(1)sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程式,只要引數檔案pfile和spfile設定正確即可。
(2)sqlplus username/password 在資料庫所在作業系統上登入本機資料庫,不需要listener程式,資料庫例項啟動即可。
(3)sqlplus username/password@tnsname需要listener程式,最常見的遠端登入模式,需要啟動資料庫例項和listener程式。
由上可知,監聽器的主要工作就是時刻監聽著來自遠端的請求,充當著客戶端請求和資料庫伺服器程式的中間人。當經過監聽器的中轉,客戶端成功與資料庫伺服器程式連線上後,監聽器的工作就結束了,即使監聽器被停止,也不會影響到已經建立的連線。

二、監聽器配置相關重要檔案
監聽器的配置過程中,主要用到伺服器端的listener.ora檔案。當然客戶端想要成功發起請求,在客戶端需要配置好tnsnames.ora檔案和sqlnet.ora檔案。下面分別介紹這三個檔案:
1.  sqlnet.ora-----透過這個檔案來決定怎麼樣找一個連線中出現的連線字串。 
例如我們客戶端輸入 
sqlplus sys/oracle@ora 
假如我的sqlnet.ora是下面這個樣子 
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME) 
那麼,客戶端就會首先在tnsnames.ora檔案中找ora的記錄.如果沒有相應的記錄則嘗試把ora當作一個主機名,透過網路的途徑去解析它的 ip地址然後去連線這個ip上GLOBAL_DBNAME=ora這個例項。注意,如果在客戶端中該檔案沒有設定該值,則預設為根據TNSNAME和HOSTNAME來進行解析。
如果設定為:
NAMES.DIRECTORY_PATH= (TNSNAMES) 
那麼客戶端就只會從tnsnames.ora查詢ora的記錄,括號中還有其他選項,如LDAP等並不常用。

2.  tnsnames.ora------這個檔案類似於unix 的hosts檔案,提供的tnsname到主機名或者ip的對應。 
只有當sqlnet.ora中類似NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析連線字串的順序中有TNSNAMES是,才會嘗試使用這個檔案。 
例子: 
ORA_TEST = 
    (DESCRIPTION = 
       (ADDRESS_LIST = 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 
       ) 
      (CONNECT_DATA = 
         (SERVER = DEDICATED) 
         (SERVICE_NAME = ora) 
      ) 
    ) 
ORA_TEST:客戶端連線伺服器端使用的服務別名。注意一定要頂行書寫,否則會無法識別服務別名。 
PROTOCOL:客戶端與伺服器端通訊的協議,一般為TCP,該內容一般不用改。 
HOST:ORACLE伺服器端IP地址或者hostname。確保伺服器端的監聽啟動正常且本機/etc/hosts能夠正常解析hostname主機名。 
PORT:資料庫偵聽正在偵聽的埠,可以察看伺服器端的listener.ora檔案或在資料庫偵聽所在的機器的命令提示符下透過lnsrctl status [listener name]命令察看。此處Port的值一定要與資料庫偵聽正在偵聽的埠一樣。 
SERVICE_NAME:在伺服器端,用system使用者登陸後,sqlplus> show parameter service_name命令檢視。

3.  listener.ora------listener監聽器程式的配置檔案 
關於listener程式就不多說了,接受遠端對資料庫的接入申請並轉交給oracle的伺服器程式。所以如果不是使用的遠端的連線,listener程式就不是必需的,同樣的如果關閉listener程式並不會影響已經存在的資料庫連線。 
例子: 
SID_LIST_LISTENER = 
    (SID_LIST = 
         (SID_DESC = 
             (GLOBAL_DBNAME = ora) 
             (ORACLE_HOME = E:/oracle/product/10.1.0/Db_2) 
             (SID_NAME = ora) 
         ) 
    )
LISTENER = 
    (DESCRIPTION = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)) 
    )
LISTENER :監聽名稱,可以配置多個監聽,多個監聽的埠號要區分開來。 
GLOBAL_DBNAME :全域性資料庫名。透過select * from global_name; 查詢得出 
ORACLE_HOME :oracle軟體的跟目錄 
SID_NAME :伺服器端(本機)的SID 
PROTOCOL:監聽協議,一般都使用TCP 
HOST:本機IP地址,雙機時候使用浮動IP 
PORT:監聽的埠號,使用netstat –an 檢查該埠不被佔用。

三、SQL*PLUS遠端連線資料庫過程
當你輸入sqlplus sys/oracle@orcl的時候 
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME 
2. 查詢tnsnames.ora檔案,從裡邊找orcl的記錄,並且找到主機名,埠和service_name 
3. 如果listener程式沒有問題且能正常解析主機名的話,建立與listener程式的連線。 
4. 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener採取接下去的動作。預設是專用伺服器模式,沒有問題的話客戶端就連線上了資料庫的server process。 
5. 這時候網路連線已經建立,listener程式的工作也就完成了。
四、配置監聽器常見錯誤一例
在使用者輸入sqlplus system/manager@test後,sqlplus程式會自動到sqlnet.ora檔案中找NAMES.DEFAULT_DOMAIN引數,假如該引數存在,則將該引數中的值取出,加到網路服務名的後面,即此例中你的輸入由sqlplus system/manager@test自動變為sqlplus 
system/manager@test.server.com ,然後再到tnsnames.ora檔案中找test.server.com網路服務名,這當然找不到了,因為該檔案中只有test網絡服務名,所以報錯。解決的辦法就是將sqlnet.ora檔案中的NAMES.DEFAULT_DOMAIN引數註釋掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN引數不存在,則sqlplus程式會直接到tnsnames.ora檔案中找 test網路服務名,然後取出其中的host ,port,tcp,service_name,利用這些資訊將連線請求傳送到正確的資料庫伺服器上。



資料整理參考:
http://blog.csdn.net/aten_xie/article/details/6174069
http://blog.csdn.net/chunhua_love/article/details/13505239

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

相關文章