【listener】oracle靜態監聽和動態監聽 【轉載】

ballontt發表於2012-12-02
oracle靜態監聽和動態監聽
 一、什麼是註冊?
  註冊就是將資料庫作為一個服務註冊到監聽程式。客戶端不需要知道資料庫名和例項名,只需要知道該資料庫對外提供的服務名
就可以申請連線到資料庫。這個服務名可能與例項名一樣,也有可能不一樣。
  在資料庫伺服器啟動過程中,資料庫伺服器會向監聽程式註冊相應的服務(無論何時啟動一個資料庫,預設地都有兩條資訊註冊
到監聽器中:資料庫伺服器對應的例項和服務。)
  相當於是這樣:在資料庫伺服器和客戶端之間有一監聽程式(Listener),在監聽程式中,會記錄相應資料庫對應的服務名(一
個資料庫可能對應有多個服務名),當客戶端需要連線資料庫時,只需要提供服務名,就可以建立客戶端和伺服器之間的連線。
 二、靜態註冊
  靜態註冊就是例項啟動時讀取listener.ora檔案的配置,將例項和服務註冊到監聽程式。無論何時啟動一個資料庫,預設地都有
兩條資訊註冊到監聽器中:資料庫伺服器對應的例項和服務。
  靜態註冊時,listener.ora中的GLOBAL_DBNAME向外提供服務名,listener.ora中的SID_NAME提供註冊的例項名。
  採取靜態註冊方法時,listener.ora中的內容如下:
  SID_LIST_LISTENER =
  (SID_LIST =
  (SID_DESC =
  (SID_NAME = PLSExtProc)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (PROGRAM = extproc)
  )
  (SID_DESC =
  (GLOBAL_DBNAME =orcl)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (SID_NAME =orcl)
  )
  (SID_DESC =
  (GLOBAL_DBNAME =orcl1)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (SID_NAME =orcl)
  )
  )
  該檔案表明資料庫是單例項的,例項名為orcl,向外提供了兩個服務:orcl和orcl1
 三、動態註冊
  動態註冊是在instance啟動的時候PMON程式根據init.ora中的instance_name,service_names兩個引數將例項和服務動態註冊到
listener中。
  首先要在init.ora中指定instance_name,service_names兩個引數的值。在sqlplus下通過show parameter service_names 和show
parameter instance_name可以檢視這兩個引數的值。
  註冊到監聽器中的例項值從init.ora檔案中的instance_name引數取得。如果該引數沒有設定值,那麼它將取init.ora檔案中的
db_name的值。
  註冊到監聽器中的服務值從init.ora檔案中的引數service_names取得。如果該引數沒有設定值,資料庫將拼接init.ora檔案中的
db_name和db_domain的值來註冊自己。如果選擇提供service_names值,您可以使用完全限定的名稱(比如 orcl.oracle.com)或縮寫
的名稱(比如orcl)。如果選擇縮寫的名稱並設定了db_domain引數,註冊到監聽器中的服務將是 service_name值和db_domain值的拼
接。例如下面的設定將導致服務orcl.oracle.com被註冊到監聽器中:
  db_domain=oracle.com
  service_names=orcl ;
  採取動態註冊方法時,listener.ora中的內容如下:
  SID_LIST_LISTENER =
  (SID_LIST =
  (SID_DESC =
  (SID_NAME = PLSExtProc)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (PROGRAM = extproc)
  )
  )
  可選擇的是,您可以在service_names引數中指定多個服務值,值之間用逗號格開,這對於共享伺服器配置是很有用的。
  動態註冊預設只註冊到預設的監聽器上(名稱是LISTENER、埠是1521、協議是TCP),如果需要向非預設監聽註冊,則需要配置
local_listener引數!
  如果沒有顯式設定service_names和instance_name的值,那麼僅當資料庫在監聽器執行之後啟動時,動態註冊才會發生;在這種
情況 下,如果監聽器後來發生了重啟,動態註冊資訊將會丟失。顯然,最好在所有的資料庫啟動之前先啟動監聽器,這樣就會避免沒
有顯式設定 service_names和instance_name的值時,若重啟監聽器帶來的動態註冊資訊丟失的情況。
  為初始化引數service_names和instance_name設定顯式的值是個值得可取的方法和建議。因為如果監聽器在資料庫執行過程中要
重新啟 動,僅當你在init.ora檔案中顯式地設定了service_names和instance_name的值時,每個資料庫的PMON程式才會在很短的 時
間之內完成動態註冊。
 四、查詢某服務是靜態註冊還是動態註冊
  可以使用命令lsnrctl status來檢視某服務是靜態註冊還是動態註冊。
  例項狀態為UNKNOWN值時表明此服務是靜態註冊的設定。這時監聽器用來表明它不知道關於該例項的任何資訊,只有當客戶發出連
接請求時,它才檢查該例項是否存在。
  動態註冊的資料庫通過狀態資訊中的狀態READY或狀態BLOCKED(對於一個備用資料庫)來指明。不管關閉何時資料庫,動態註冊
的資料庫都會動態地從 監聽器登出,而與之相關的資訊將從狀態列表中消失。這樣,不管資料庫是在執行還是已經關閉,監聽器總是
知道它的狀態。該資訊將被用於連線請求的回退 (fallback)和負載平衡。
  
 五、local_listener作用

pmon只會動態註冊port等於1521的監聽,否則pmon不能動態註冊listener,要想讓pmon動態註冊listener,需要設定local_listener引數。

LSNRCTL> start
啟動tnslsnr: 請稍候...

TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系統引數檔案為e:oracleproduct10.2.0db_1networkadminlistener.ora
寫入e:oracleproduct10.2.0db_1networkloglistener.log的日誌資訊
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))

正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 25-10月-2008 20:39:07
正常執行時間 0 天 0 小時 0 分 3 秒
跟蹤級別 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
監聽程式引數檔案 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
監聽程式日誌檔案 e:oracleproduct10.2.0db_1networkloglistener.log

監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服務摘要..
服務 "orcl" 包含 1 個例程。
例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "test" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功
LSNRCTL> status
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 25-10月-2008 20:39:07
正常執行時間 0 天 0 小時 0 分 6 秒
跟蹤級別 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
監聽程式引數檔案 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
監聽程式日誌檔案 e:oracleproduct10.2.0db_1networkloglistener.log

監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服務摘要..
服務 "orcl" 包含 1 個例程。
例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "test" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功

SQL> alter system register;    //手動註冊

系統已更改。

SQL>
LSNRCTL> status
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 25-10月-2008 20:39:07
正常執行時間 0 天 0 小時 0 分 21 秒
跟蹤級別 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
監聽程式引數檔案 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
監聽程式日誌檔案 e:oracleproduct10.2.0db_1networkloglistener.log

監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服務摘要..
服務 "orcl" 包含 2 個例程。
例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "orcl_XPT" 包含 1 個例程。
例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "test" 包含 1 個例程。
例程 "test", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功

local_listener是用在當使用非預設的埠時,PMON程式能夠進行動態註冊。

我們可以這麼設定該值形如,local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = hostname or ip)(PORT = 1521))'

這裡說下該值的一個注意點:

先看下listener.ora的配置吧

SID_LIST_LISTENER =

(SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl1)

     (SID_NAME = orcl1)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = orcl1)

   )

)

LISTENER =

(DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

     (ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1521))

   )

)

TXT_LIS=

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))

)

SID_LIST_TXT_LIS =

(SID_LIST =

   (SID_DESC =

     (SID_NAME = orcl1)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = orcl1)

   )

)

我們這麼設定listener.ora,這樣,就有了靜態的監聽了,包括listener和txt_lis,我們可以通過lsnrctl start txt_lis來啟動這個監聽,也可以通過lsnrctl status txt_lis來觀察這個監聽的狀態。

當我們設定了listener.ora後,txt_lis還不能被客戶端訪問,那怎麼使這個生效呢,這時我們就要PMON來進行動態註冊,這就需要local_listener了。

Local_listener有兩種設定:

1、如果我們設定

Alter system set local_listener=’(ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))’。那麼,我們只要alter system register;強制PMON註冊,就可以實現動態註冊了。

2、接下來,來討論另外一個local_listener的設定:

Alter system set local_listener=txt_lis;

那麼,PMON能識別出來嗎?

答案是不能的,因為PMON不知道去哪裡解析這個txt_lis。

那有一種情況:如果我們是在資料當機的時候修改的local_listener=txt_lis;那這時啟動,則會出現:

SQL> startup

ORA-00119: invalid specification for system parameter LOCAL_LISTENER

ORA-00132: syntax error or unresolved network name 'TXT_LIS'

這是因為:

要在伺服器上的tnsnames.ora裡做設定,來對映listener1

啟動時它會去服務端的tnsnames.ora裡txt_lis的含義,找不到,解析不了,則會報ora-00132的錯誤。

那服務端的tnsnames.ora要怎麼設定呢?

Txt_lis=(ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))

加上這個就OK了。

接下來我們再做另外的:

SQL> alter system set local_listener='asdf';

alter system set local_listener='asdf'

*

第1行出現錯誤:

ORA-02097:無法修改引數,因為指定的值無效

ORA-00119:系統引數LOCAL_LISTENER的說明無效

ORA-00132:語法錯誤或無法解析的網路名稱'asdf'

說明:local_listener的值不能隨便設定,要在listener.ora上有相應的標識

以上是local_listener的設定問題。

另外,就像上面批註裡面說的,txt_lis註冊的例項和服務跟預設的監聽一樣,那隻要我們設定了alter system set local_listener=……

這時,我們listener status ,也就是預設的監聽的狀態,我們發現,動態監聽沒有了,剩下的靜態監聽

可以知道,預設的監聽就只有靜態監聽了,動態監聽都在等待local_listener所對應的監聽了。PMON真是見風使舵啊。

更進一步,我們發現,只要我們成功設定了local_listener的值,包括例項和服務名不和預設監聽一樣,PMON都會在等待local_listener對應的監聽

  
  六、相關的TNS解析
  • 什麼是TNS?

TNS是Oracle Net的一部分,專門用來管理和配置Oracle資料庫和客戶端連線的一個工具,在大多數情況下客戶端和資料庫要通訊,必須配置TNS,當然在少數情況下,不用配置TNS也可以連線Oracle資料庫,比如通過JDBC.如果通過TNS連線Oracle,那麼客戶端必須安裝Oracle client程式.

  • TNS有那些配置檔案?

TNS的配置檔案包括伺服器(安裝Oracle資料庫的機器)端和客戶端兩部分.伺服器有listener.ora,sqlnet.ora,tnsnames.ora,如果通過OCM(Oracle Connection Manage)和域名服務管理客戶端連線,伺服器端可能還包括cman.ora等檔案;客戶端有tnsnames.ora,sqlnet.ora. 
listener.ora:監聽器配置檔案,成功啟動後是駐留在伺服器端的一個服務.什麼是監聽器?監聽器是用來偵聽客戶端的連線請求以及建立客戶端和伺服器端連線通道的一個服務程式.預設情況下Oracle在1521埠上偵聽資料庫連線請求. 
sqlnet.ora:用來管理和約束或限制tns連線的配置,通過在該檔案中設定一些引數,可以管理TNS連線.根據引數作用的不同,需要分別在伺服器和客戶端配置. 
tnsnames.ora:配置客戶端到伺服器端的連線服務,包括客戶端要連線到的伺服器和資料庫的配置資訊.

Oracle所有的TNS配置檔案都存放在

unix/linux: $ORACLE_HOME/network/admin 
windows: %ORACLE_HOME%/network/admin

  • TNS有那些配置工具?

我們可以手動配置,也可以通過Oracle Net Configuretion Assitant配置.

  • OracleTNS配置流程

首先在Oracle server端安裝完成之後,因該先著手配置LISTENER,listenerr是進行Oracle通訊的首要元件,緊接著在客戶端安裝Oracle client,同時配置tnsnames.ora檔案.

  • LISTENER(監聽器)配置

首先監聽器包括兩個部分:Oracle要監聽的地址、埠、通訊協議;Oracle要監聽的資料庫例項.非RAC環境下,LISTENER只能監聽本伺服器的地址和例項,RAC環境下,LISTENER還可以監聽遠端伺服器.每個資料庫最少要配置一個監聽器

LISTENER=
 (DESCRIPTION=
  (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
    (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
  )
 )
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (SID_NAME=plsextproc)
      (ORACLE_HOME=/oracle10g)
      (PROGRAM=extproc)
     )
    (SID_DESC=
     (SID_NAME=mayp)
     (ORACLE_HOME=/oracle10g)
    )
   )

listener部分配置了Oracle要監聽的地址資訊;SID_LIST_LISTENER部分配置了Oracle需要監聽的例項.

HOST引數即可以是hostname,也可以是ip地址.在一個多IP的伺服器上可以配置listener同時監聽多個地址.比如下面的配置:

LISTENER=
 (DESCRIPTION=
   (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.10)(PORT=1521))
      (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.1) (PORT=1521))
   )
  )

或者可以配置多個監聽器,分別監聽不同的IP地址.

Oracle Net支援的通訊協議有:

 1) TCP/IP
 2) TCP/IP with SSL
 3) Named Pipes
 4) SDP

Oracle 9i引入了動態監聽服務註冊,指的是我們不需要在listener.ora中配置oracle要監聽的資料庫例項資訊,資料庫啟動的時候, PMON程式可以自動註冊當前資料庫例項到listener的監聽列表.也就是說上面的SID_LIST_LISTENER部分就不用配置了。使用動態監聽伺服器端必須滿足以下條件:

    1) 資料庫必須設定INSTANCE_NAMESERVICE_NAME引數;

    2) 監聽器採用預設的TCP協議並使用1521埠進行監聽;

    3)如果在配置監聽器時採用了其他通訊協議或者偵聽埠,進行以下設定告訴Oracle採用自定義監聽器:

   1)通過LOCAL_LISTENER引數明確設定當前使用的監聽器,

   2)在伺服器端都tnsnames.ora檔案中加入自定義監聽器的配置資訊.如果採用了OCM,那麼還可以在cman.ora中加入監聽器的配置資訊.

.LOCAL_LISTENER 可以通過ALTER SYSTEM動態設定.

ALTER SYSTEM SET LOCAL_LISTENER=’listener_alias’;

一個動態監聽配置的示例:

listener.ora檔案的配置:

LISTENER1 =
  (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
   )

LOCAL_LISTENER引數的配置(因為這裡採用非1521的埠):

SQL> show parameter local_listener

NAME                                 TYPE         VALUE
------------------------------------ ------------ -----------
local_listener                       string       listener1

tnsnames.ora的配置:

LISTENER1=
 (ADDRESS_LIST=
  (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421)(IP = FIRST))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
 )
mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )
  • TNS配置

我們說的TNS配置其實就是對tnsnames.ora檔案的配置,tnsnames.ora 有客戶端的配置,也有伺服器端的配置.客戶端和伺服器端配置的區別是因為伺服器端的配置跟LISTENER的配置相關.下面是一個簡單的配置示例:

mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )

同樣tnsnames.ora也包括兩部分,ADDRESS_LIST 部分包含了遠端資料庫伺服器的監聽地址資訊,也就是要告訴TNS遠端資料庫可通過乃些地址和CLIENT通訊;CONNECT_DATA 定義了CLIENT要連線的資料庫,還有資料庫的連線方式,(專用或共享)。在一個多ip環境中,TNS也可以配置多個遠端IP地址:

mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )

一般在多IP環境中,還可以在TNS端配置load_balance和failover特性.這些特性在RAC環境下比較流行,load_balance特性可以讓client在連線資料庫是選擇任意地址進行連線,是各地址的連線均衡.failover開啟Oracle特有的 TAF特性,TAF為Transparent Application Failover的縮寫.load_balance可以在客戶端配置,也可以在伺服器端配置.下面是一個客戶端的配置示例:

mayp =
(DESCRIPTION =
   (ADDRESS_LIST =
     (LOAD_BALANCE=ON)
     (FAILOVER=ON)
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
   )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MAYP)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
      )
   )
)
  • sqlnet.ora的配置

sqlnet.ora是個很重要的配置,他可以控制和管理Oracle連線的屬性,根據引數作用的不同決定在客戶端配置還是在server端配置.sqlnet.ora的配置是全域性性的,也就說sqlnet.ora的配置是對所有的連線起作用,如果想對某個特殊的連線或服務進行約束或限制,可以在TNS配置相應引數.詳細引數可以參考:


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

相關文章