閱讀300 返回首頁    go 阿裏雲 go 技術社區[雲棲]


再說Oracle Listener動靜態注冊

監聽器ListenerOracle Client Process和實例遠程建立連接關係的必經之路。借助ListenerClient Process可以實現和一個特定的Server Process建立連接關係,開啟Session會話,操作Oracle Instance

 

Oracle體係中,Listener是一個獨立的進程。Listener的運行是獨立於Oracle實例的。在Windows或者Unix/Linux架構中,監聽器都是被實現為一個獨立的係統進程Process。監聽器在工作中,是侍候在特定的端口Port上,接受Client Process通過Oracle Net協議訪問。同時,監聽器需要知道所在服務器上的Oracle實例提供的Service Name和對應目錄,這個過程,我們稱之為“Register”(注冊)。

 

對於注冊過程,Oracle監聽器提供動靜態兩種注冊方法。不同的注冊方法有不同的配置方式和特點,也有各自獨特的使用場景。本篇就著重介紹一些動靜態注冊問題。

 

1Listener默認動態監聽配置

 

我們的實驗從筆者虛擬機的實際配置開始,選擇Oracle版本為11gR2

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE       11.2.0.1.0        Production

 

 

使用lsnrctl命令查看監聽器狀態。

 

 

[oracle@bsplinux ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 15:49:00

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).

 Instance "ora11g", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

status命令參數結果輸出中,我們可以看到監聽器的工作狀態。此時,Listener使用Oracle NET參數文件listener.ora,同時監聽器注冊兩個服務項目,名稱為ora11gora11gXDB。從兩個服務的READY狀態,可以知道使用動態注冊方法。

 

我們在操作係統層麵查看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.orasqlnet.oratnsnames.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

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:51:51

Uptime                   0 days 0 hr. 0 min. 0 sec

Trace Level              off

Security                 ON: Local OS Authentication

SNMP                     OFF

Listener Log File        /u01/app/diag/tnslsnr/bsplinux/listener/alert/log.xml

Listening Endpoints Summary...

 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=bsplinux)(PORT=1521)))

The listener supports no services

The command completed successfully

 

注意,上麵的內容中沒有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

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:51:51

Uptime                   0 days 0 hr.1 min. 7 sec

Trace Level              off

Security                 ON: Local OS Authentication

SNMP                     OFF

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).

 Instance "ora11g", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

動態注冊在實際中是非常有用的。pmon後台進程是Oracle實例生死的重要指標,周期性的pmon注冊到Listener中,實際上也是實現了一個功能:實例生存狀態匯集。

 

當我們的實例崩潰,但是監聽器存活的時候,監聽器不能受到pmon的周期性注冊信息。監聽器也就可以實現某種類型的failover

 

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

 

我們修改listener.ora文件中的端口信息,如果使用非1521端口,就必須使用listener.ora配置。

 

 

 

[oracle@bsplinux admin]$ ls -l

total 44

-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_bak.ora

-rw-r--r-- 1 oracle oinstall 288 Sep 21 15:56 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

 

 

--修改參數端口為1522

[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 = 1522))

   )

 )

 

ADR_BASE_LISTENER = /u01/app

 

 

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

 

 

[oracle@bsplinux admin]$ lsnrctl start

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 15:58:05

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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

 

TNSLSNR for Linux: Version 11.2.0.1.0 - Production

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

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

Listening on:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=bsplinux)(PORT=1522)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 0 min. 0 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=1522)))

The listener supports no services

The command completed successfully

 

 

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

 

 

--三分鍾和手工注冊嚐試

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:01:12

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 3 min. 6 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=1522)))

The listener supports no services

The command completed successfully

 

--手工注冊監聽器

SQL> conn / as sysdba

Connected.

SQL> alter system register;

System altered.

 

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:02:42

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 4 min. 37 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=1522)))

The listener supports no services

The command completed successfully

 

 

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

 

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

 

3、靜態注冊

 

靜態注冊是一種古老的注冊手段。簡單的說,就是監聽器的實例注冊信息是直接寫在listener.ora文件裏的。當監聽器啟動之後,Oracle會根據配置的listener.ora定義的服務去進行連接匹配。

 

這個過程中,一個重點在於:Oracle的注冊信息是寫死在文件裏麵的。監聽器並不能像動態注冊那樣切實知道Oracle實例的情況,所以靜態注冊的狀態取值通常是UNKNOW

 

配置監聽器靜態注冊:

 

 

[oracle@bsplinux admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

 (SID_LIST =

  (SID_DESC =

    (GLOBAL_DBNAME = ora11g)

    (ORACLE_HOME = /u01/app/oracle)

    (SID_NAME = ora11g)

  )

 )

 

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = bsplinux)(PORT =1522))

   )

 )

 

 

啟動監聽器:

 

 

[oracle@bsplinux admin]$ lsnrctl start

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:38:59

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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

(篇幅原因,省略……)

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=1522)))

Services Summary...

Service "ora11g" has 1 instance(s).

 Instance "ora11g", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

--連接

SQL> conn scott/tiger@ora11g;

Connected.

 

 

靜態注冊的一個問題,在於監聽程序是不知道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> conn / as sysdba

Connected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL>

 

--監聽器依然提供實例信息;

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:50:19

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 16:38:59

Uptime                   0 days 0 hr. 11 min. 20 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=1522)))

Services Summary...

Service "ora11g" has 1 instance(s).

 Instance "ora11g", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

 

 

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星期五921 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

數據庫裝載完畢。

數據庫已經打開。

SQL>

 

 

確定服務器啟動。

 

 

[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

監聽器ListenerOracle Client Process和實例遠程建立連接關係的必經之路。借助ListenerClient Process可以實現和一個特定的Server Process建立連接關係,開啟Session會話,操作Oracle Instance

 

Oracle體係中,Listener是一個獨立的進程。Listener的運行是獨立於Oracle實例的。在Windows或者Unix/Linux架構中,監聽器都是被實現為一個獨立的係統進程Process。監聽器在工作中,是侍候在特定的端口Port上,接受Client Process通過Oracle Net協議訪問。同時,監聽器需要知道所在服務器上的Oracle實例提供的Service Name和對應目錄,這個過程,我們稱之為“Register”(注冊)。

 

對於注冊過程,Oracle監聽器提供動靜態兩種注冊方法。不同的注冊方法有不同的配置方式和特點,也有各自獨特的使用場景。本篇就著重介紹一些動靜態注冊問題。

 

1Listener默認動態監聽配置

 

我們的實驗從筆者虛擬機的實際配置開始,選擇Oracle版本為11gR2

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE       11.2.0.1.0        Production

 

 

使用lsnrctl命令查看監聽器狀態。

 

 

[oracle@bsplinux ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 15:49:00

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).

 Instance "ora11g", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

status命令參數結果輸出中,我們可以看到監聽器的工作狀態。此時,Listener使用Oracle NET參數文件listener.ora,同時監聽器注冊兩個服務項目,名稱為ora11gora11gXDB。從兩個服務的READY狀態,可以知道使用動態注冊方法。

 

我們在操作係統層麵查看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.orasqlnet.oratnsnames.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

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:51:51

Uptime                   0 days 0 hr. 0 min. 0 sec

Trace Level              off

Security                 ON: Local OS Authentication

SNMP                     OFF

Listener Log File        /u01/app/diag/tnslsnr/bsplinux/listener/alert/log.xml

Listening Endpoints Summary...

 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=bsplinux)(PORT=1521)))

The listener supports no services

The command completed successfully

 

注意,上麵的內容中沒有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

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:51:51

Uptime                   0 days 0 hr.1 min. 7 sec

Trace Level              off

Security                 ON: Local OS Authentication

SNMP                     OFF

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).

 Instance "ora11g", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

動態注冊在實際中是非常有用的。pmon後台進程是Oracle實例生死的重要指標,周期性的pmon注冊到Listener中,實際上也是實現了一個功能:實例生存狀態匯集。

 

當我們的實例崩潰,但是監聽器存活的時候,監聽器不能受到pmon的周期性注冊信息。監聽器也就可以實現某種類型的failover

 

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

 

我們修改listener.ora文件中的端口信息,如果使用非1521端口,就必須使用listener.ora配置。

 

 

 

[oracle@bsplinux admin]$ ls -l

total 44

-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_bak.ora

-rw-r--r-- 1 oracle oinstall 288 Sep 21 15:56 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

 

 

--修改參數端口為1522

[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 = 1522))

   )

 )

 

ADR_BASE_LISTENER = /u01/app

 

 

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

 

 

[oracle@bsplinux admin]$ lsnrctl start

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 15:58:05

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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

 

TNSLSNR for Linux: Version 11.2.0.1.0 - Production

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

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

Listening on:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=bsplinux)(PORT=1522)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 0 min. 0 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=1522)))

The listener supports no services

The command completed successfully

 

 

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

 

 

--三分鍾和手工注冊嚐試

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:01:12

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 3 min. 6 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=1522)))

The listener supports no services

The command completed successfully

 

--手工注冊監聽器

SQL> conn / as sysdba

Connected.

SQL> alter system register;

System altered.

 

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:02:42

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 15:58:05

Uptime                   0 days 0 hr. 4 min. 37 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=1522)))

The listener supports no services

The command completed successfully

 

 

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

 

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

 

3、靜態注冊

 

靜態注冊是一種古老的注冊手段。簡單的說,就是監聽器的實例注冊信息是直接寫在listener.ora文件裏的。當監聽器啟動之後,Oracle會根據配置的listener.ora定義的服務去進行連接匹配。

 

這個過程中,一個重點在於:Oracle的注冊信息是寫死在文件裏麵的。監聽器並不能像動態注冊那樣切實知道Oracle實例的情況,所以靜態注冊的狀態取值通常是UNKNOW

 

配置監聽器靜態注冊:

 

 

[oracle@bsplinux admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

 (SID_LIST =

  (SID_DESC =

    (GLOBAL_DBNAME = ora11g)

    (ORACLE_HOME = /u01/app/oracle)

    (SID_NAME = ora11g)

  )

 )

 

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = bsplinux)(PORT =1522))

   )

 )

 

 

啟動監聽器:

 

 

[oracle@bsplinux admin]$ lsnrctl start

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:38:59

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

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

(篇幅原因,省略……)

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=1522)))

Services Summary...

Service "ora11g" has 1 instance(s).

 Instance "ora11g", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

--連接

SQL> conn scott/tiger@ora11g;

Connected.

 

 

靜態注冊的一個問題,在於監聽程序是不知道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> conn / as sysdba

Connected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL>

 

--監聽器依然提供實例信息;

[oracle@bsplinux admin]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 21-SEP-2012 16:50:19

 

Copyright (c) 1991, 2009, Oracle. All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=bsplinux)(PORT=1522)))

STATUS of the LISTENER

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

Alias                    LISTENER

Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date               21-SEP-2012 16:38:59

Uptime                   0 days 0 hr. 11 min. 20 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=1522)))

Services Summary...

Service "ora11g" has 1 instance(s).

 Instance "ora11g", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

 

 

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星期五921 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

數據庫裝載完畢。

數據庫已經打開。

SQL>

 

 

確定服務器啟動。

 

 

[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

最後更新:2017-04-02 15:14:53

  上一篇:go 編譯原理學習.
  下一篇:go 猴子吃桃問題