天天看點

再說Oracle Listener動靜态注冊

instance。

在oracle體系中,listener是一個獨立的程序。listener的運作是獨立于oracle執行個體的。在windows或者unix/linux架構中,監聽器都是被實作為一個獨立的系統程序process。監聽器在工作中,是侍候在特定的端口port上,接受client

1、listener預設動态監聽配置

sql> select * from v$version;

banner

------------------------------------------------------

pl/sql release 11.2.0.1.0 - production

core       11.2.0.1.0        production

[oracle@bsplinux ~]$ lsnrctl status

copyright (c) 1991, 2009, oracle. all rights reserved.

connecting to (description=(address=(protocol=tcp)(host=bsplinux)(port=1521)))

status of the listener

------------------------

alias                    listener

version                  tnslsnr for linux: version 11.2.0.1.0 - production

start date               17-jul-2012 19:52:13

uptime                   65 days 19 hr. 56 min. 47 sec

trace level              off

security                 on: local os authentication

snmp                     off

listener parameter file  /u01/app/oracle/network/admin/listener.ora

listener log file        /u01/app/diag/tnslsnr/bsplinux/listener/alert/log.xml

listening endpoints summary...

 (description=(address=(protocol=tcp)(host=bsplinux)(port=1521)))

services summary...

service "ora11g" has 1 instance(s).

 instance "ora11g", status ready, has 1 handler(s) for this service...

service "ora11gxdb" has 1 instance(s).

the command completed successfully

我們在作業系統層面檢視listener.ora檔案。

[oracle@bsplinux admin]$ pwd

/u01/app/oracle/network/admin

[oracle@bsplinux admin]$ ls -l

total 40

-rw-r--r-- 1 oracle oinstall 288 may 22 21:21 listener1205229pm2122.bak

-rw-r--r-- 1 oracle oinstall 288 may 22 19:57 listener.ora

drwxr-xr-x 2 oracle oinstall 4096 may 22 15:54 samples

-rw-r--r-- 1 oracle oinstall 187 may 9 2007 shrept.lst

-rw-r--r-- 1 oracle oinstall 310 may 22 21:22 tnsnames.ora

[oracle@bsplinux admin]$ cat listener.ora

# listener.ora network configuration file: /u01/app/oracle/network/admin/listener.ora

# generated by oracle configuration tools.

listener =

 (description_list =

   (description =

     (address = (protocol = tcp)(host = bsplinux)(port =1521))

   )

 )

adr_base_listener = /u01/app

oracle net service三大配置檔案為:listener.ora、sqlnet.ora和tnsnames.ora。其中listener.ora定義了監聽器資訊。在上面的監聽器配置資訊中,定義了監聽器監聽端口1521(預設端口)。注意,檔案中沒有定義與ora11g執行個體有關的内容。這個就是使用了動态注冊機制。

2、動态監聽

所謂動态監聽,就是在listener.ora檔案中,不需要定義執行個體instance具體名稱和位置。oracle執行個體會在運作之後,由背景程序pmon會周期性的(1-3分鐘)到指定端口1521進行狀态資訊通知。listener就會自動的進行更新service情況。

在上一個部分,我們已經看到了存在listener.ora檔案情況下的動态注冊情況。事實上,如果沒有listener.ora檔案,我們也是可以實作預設的動态注冊監聽器的功能。

首先,我們删除listener.ora檔案。

[oracle@bsplinux admin]$ mv listener.ora listener_bak.ora

[oracle@bsplinux admin]$ ls -l | grep listener.ora

[oracle@bsplinux admin]$

啟動監聽器。

[oracle@bsplinux admin]$ lsnrctl start

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 15:51:50

starting /u01/app/oracle/bin/tnslsnr: please wait...

tnslsnr for linux: version 11.2.0.1.0 - production

log messages written to /u01/app/diag/tnslsnr/bsplinux/listener/alert/log.xml

listening on: (description=(address=(protocol=tcp)(host=bsplinux)(port=1521)))

connecting to (address=(protocol=tcp)(host=)(port=1521))

start date               21-sep-2012 15:51:51

uptime                   0 days 0 hr. 0 min. 0 sec

the listener supports no services

注意,上面的内容中沒有listener parameter的内容。監聽器在1521端口等待。過一分鐘左右,注冊内容顯示。

--pmon存在

[oracle@bsplinux admin]$ ps -ef | grep pmon

oracle  10442 10359 0 15:52 pts/0   00:00:00 grep pmon

oracle  24187    1 0 sep11 ?       00:02:33 ora_pmon_ora11g

[oracle@bsplinux admin]$ lsnrctl status

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 15:52:58

uptime                   0 days 0 hr.1 min. 7 sec

動态注冊在實際中是非常有用的。pmon背景程序是oracle執行個體生死的重要名額,周期性的pmon注冊到listener中,實際上也是實作了一個功能:執行個體生存狀态彙集。

當我們的執行個體崩潰,但是監聽器存活的時候,監聽器不能受到pmon的周期性注冊資訊。監聽器也就可以實作某種類型的failover。

但是,動态注冊也不是萬能的。其中一個問題就是,動态注冊隻能進行1521的端口注冊。如果我們變化端口,就不能實作動态注冊方式了。

我們修改listener.ora檔案中的端口資訊,如果使用非1521端口,就必須使用listener.ora配置。

total 44

-rw-r--r-- 1 oracle oinstall 288 may 22 19:57 listener_bak.ora

-rw-r--r-- 1 oracle oinstall 288 sep 21 15:56 listener.ora

--修改參數端口為1522

     (address = (protocol = tcp)(host = bsplinux)(port = 1522))

啟動監聽器,使用1522端口。

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 15:58:05

system parameter file is /u01/app/oracle/network/admin/listener.ora

listening on:(description=(address=(protocol=tcp)(host=bsplinux)(port=1522)))

connecting to (description=(address=(protocol=tcp)(host=bsplinux)(port=1522)))

start date               21-sep-2012 15:58:05

 (description=(address=(protocol=tcp)(host=bsplinux)(port=1522)))

等待三分鐘或者手工進行注冊,都不能讓1522端口的監聽器注冊内容。

--三分鐘和手工注冊嘗試

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 16:01:12

uptime                   0 days 0 hr. 3 min. 6 sec

--手工注冊監聽器

sql> conn / as sysdba

connected.

sql> alter system register;

system altered.

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 16:02:42

uptime                   0 days 0 hr. 4 min. 37 sec

上面告訴我們,雖然動态注冊有很多優勢,但是隻能使用1521端口。這就會産生很大的限制。從安全角度看,我們通常要避免使用預設端口,防止惡意的端口掃描。

那麼,我們很多時候,就要選擇靜态注冊方法。

3、靜态注冊

靜态注冊是一種古老的注冊手段。簡單的說,就是監聽器的執行個體注冊資訊是直接寫在listener.ora檔案裡的。當監聽器啟動之後,oracle會根據配置的listener.ora定義的服務去進行連接配接比對。

這個過程中,一個重點在于:oracle的注冊資訊是寫死在檔案裡面的。監聽器并不能像動态注冊那樣切實知道oracle執行個體的情況,是以靜态注冊的狀态取值通常是unknow。

配置監聽器靜态注冊:

sid_list_listener =

 (sid_list =

  (sid_desc =

    (global_dbname = ora11g)

    (oracle_home = /u01/app/oracle)

    (sid_name = ora11g)

  )

     (address = (protocol = tcp)(host = bsplinux)(port =1522))

啟動監聽器:

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 16:38:59

(篇幅原因,省略……)

 instance "ora11g", status unknown, has 1 handler(s) for this service...

--連接配接

sql> conn scott/tiger@ora11g;

靜态注冊的一個問題,在于監聽程式是不知道oracle執行個體的真實生存情況。即使執行個體已經崩潰、關閉,監聽器也不能知道這個資訊。

--關閉oracle伺服器

[oracle@bsplinux admin]$ sqlplus /nolog

sql*plus: release 11.2.0.1.0 production on fri sep 21 16:48:40 2012

copyright (c) 1982, 2009, oracle. all rights reserved.

sql> shutdown immediate;

database closed.

database dismounted.

oracle instance shut down.

sql>

--監聽器依然提供執行個體資訊;

lsnrctl for linux: version 11.2.0.1.0 - production on 21-sep-2012 16:50:19

start date               21-sep-2012 16:38:59

uptime                   0 days 0 hr. 11 min. 20 sec

4、靜态注冊與遠端伺服器啟動

靜态注冊幫助我們解決了一個問題,就是我們如何在oracle伺服器停機的時候,還能夠遠端通過oracle net連接配接到oracle,并啟動伺服器。

在動态注冊時,我們遠端連接配接到監聽器時,監聽器是不能識别請求連接配接的名稱的。這就造成我們不能遠端登入。使用靜态注冊,恰恰可能幫助我們實作這個需求。

c:\users\tomas>tnsping ora11gp

tns ping utility for 32-bit windows: version 11.2.0.1.0 - production on 21-9月-

2012 09:38:25

copyright (c) 1997, 2010, oracle. all rights reserved.

已使用的參數檔案:

d:\oracle\product\11.2.0\client_1\network\admin\sqlnet.ora

已使用tnsnames擴充卡來解析别名

嘗試連接配接(description = (address_list = (address = (protocol = tcp)(host = 10.1.39.69)(port = 1522))) (connect_data = (service_name = ora11g)))

ok (0毫秒)

使用sqlplus進行連接配接。

c:\users\tomas>sqlplus /nolog

sql*plus: release 11.2.0.1.0 production on星期五9月21 09:38:39 2012

copyright (c) 1982, 2010, oracle. all rights reserved.

sql> conn sys/oracle@ora11gp as sysdba

已連接配接到空閑例程。

sql> startup

oracle例程已經啟動。

total system global area 422670336 bytes

fixed size                 1336960 bytes

variable size            318769536 bytes

database buffers          96468992 bytes

redo buffers               6094848 bytes

資料庫已經打開。

确定伺服器啟動。

[oracle@bsplinux ~]$ ps -ef | grep pmon

oracle  11002    1 0 16:55 ?       00:00:00 ora_pmon_ora11g

oracle  11147 10784 0 17:02 pts/1   00:00:00 grep pmon

繼續閱讀