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