天天看點

oracle監聽 動态注冊與靜态注冊

看了這篇文章對 動态注冊和靜态注冊又有了進一步的了解,轉發過來學習;來自:http://blog.163.com/[email protected]/blog/static/1646245052010524101149835/

首先說說最近自己遇到的一個問題,應該說以前也遇到過,隻不過在網上查找了一下解決方法,能夠解決,但是不知道原理是什麼;

"正在連接配接...ORA-12514: TNS: 監聽程式目前無法識别連接配接描述符中請求的服務"  這個錯誤,其實作在一般用的都是動态監聽,不管監聽和oracle服務哪一個先啟動,有時候需要等一分鐘,由pmon檢查到之後動态注冊,但是能夠注冊是沒問題的;今天我遇到的就是一直出現這個錯誤;到後來知道其實監聽和tns配置都沒有問題,問題出在了spfile中service_names 和 instance_name 上,因為下面這篇文章會講到,動态注冊的話會讀取init.ora裡的這兩個變量,如果用spfile啟動,那麼需要先建立一個pfile,然後看看*.DB_UNIQUE_NAME 和db_name ,這裡的db_unique_name 就是用網絡配置助手配置tns時的“服務名”; 其實這裡也不用這麼麻煩,直接用呢lsnrctl  status  能夠看到:

LSNRCTL> status

正在連接配接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.217.130)(PORT=1521)))

LISTENER 的 STATUS

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

别名                      LISTENER

版本                      TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production

啟動日期                  03-9月 -2013 14:50:27

正常運作時間              0 天 0 小時 2 分 7 秒

跟蹤級别                  off

安全性                    ON: Local OS Authentication

SNMP                      OFF

監聽程式參數檔案          E:\app\xuniji\product\11.2.0\dbhome_1\network\admin\listener.ora

監聽程式日志檔案          e:\app\xuniji\diag\tnslsnr\xunijida-59c75f\listener\alert\log.xml

監聽端點概要...

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

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))

服務摘要..

服務 "CLRExtProc" 包含 1 個執行個體。

  執行個體 "CLRExtProc", 狀态 UNKNOWN, 包含此服務的 2 個處理程式...

服務 "orclXDB" 包含 1 個執行個體。

  執行個體 "orcl", 狀态 READY, 包含此服務的 1 個處理程式...

服務 "standby" 包含 1 個執行個體。

  執行個體 "orcl", 狀态 READY, 包含此服務的 1 個處理程式...

指令執行成功

藍色部分,很多時候服務和執行個體都是一樣的名稱,隻不過這裡不一樣,是以再建立tns時的服務名應該是standby;

一、什麼是注冊:

注冊就是将資料庫作為一個服務注冊到監聽程式中。用戶端不需要知道資料庫名和執行個體名,隻需要知道該資料庫對外提供的服務名就可以申請連結到資料庫。這個服務名可以與資料庫名一樣,也有可能不一樣。

在資料庫服務啟動的過程中,資料庫伺服器會像監聽程式注冊相應的服務,無論何時啟動資料庫,預設的都有兩條資訊注冊到監聽器中,資料庫伺服器對應的執行個體和服務,用戶端和伺服器之間的連結,隻需要提供一個服務名就可以了。

二、區分動态注冊和靜态注冊

(1)使用listener.ora檔案判斷

動态注冊

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (PROGRAM = extproc)

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oradata\orcl)

    )

  )

靜态注冊

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (PROGRAM = extproc)

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oradata\orcl)

    )

    (SID_DESC =

      (GLOBAL_DBNAME = orcl)

      (ORACLE_HOME = D:\oradata\orcl)

      (SID_NAME = ORCL)

    )

    (SID_DESC =

      (GLOBAL_DBNAME = orcl1)

      (ORACLE_HOME = D:\oradata\orcl)

      (SID_NAME = ORCL)

    )

  )

通過檢視雖然可以大緻看出,但是這種方法并不能和明确的現實資料庫在運作時的實際情況

(2)使用lsnrctl status指令

三、動态注冊

動态注冊是在instance啟動的時候PMON(Process Monitor程序螢幕)程序根據INIT.ORA中的instance_name,service_name兩個參數将執行個體和服務注冊到監聽器中.

動态注冊時的listener.ora的檔案内容如下

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (PROGRAM = extproc)

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oradata\orcl)

    )

  )

由于動态注冊需要pmon程序,是以監聽必須在資料庫啟動之前啟動,否則動态注冊将失敗;在資料庫運作的過程中,如果重新開機監聽也會造成動态注冊失敗

動态注冊隻是注冊預設的監聽器上(名稱是listener、端口是1521、協定時TCP),如果需要向非預設的監聽注冊,則需要改變local_listener參數

将監聽的資訊添加到tnsnames.ora  檔案中。 注意,是tnsnames.ora 檔案, 因為pmon在動态注冊監聽時要從tnsnames.ora中讀取相關資訊。

LISTENER =

(DESCRIPTION =

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

)

 然後以sys用戶運作:

SQL> alter system set local_listener=listener;

SQL> alter system register;

或者:

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))';

SQL> alter system register;

動态注冊的好處是簡單友善,但是容易發生注冊失敗

四、靜态注冊

靜态注冊就是執行個體啟動時讀取listener.ora檔案的配置,将執行個體和服務注冊到監聽程式中

靜态注冊時的listener.ora中的内容如下

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (PROGRAM = extproc)

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oradata\orcl)

    )

    (SID_DESC =

      (GLOBAL_DBNAME = orcl)

      (ORACLE_HOME = D:\oradata\orcl)

      (SID_NAME = ORCL)

    )

    (SID_DESC =

      (GLOBAL_DBNAME = orcl1)

      (ORACLE_HOME = D:\oradata\orcl)

      (SID_NAME = ORCL)

    )

  )

golbal_dbname是資料庫對外提供的服務名,sid_name是執行個體名,該檔案說明資料庫是單執行個體資料庫,執行個體名為orcl,向外提供了兩個服務orcl和orcl1.

靜态注冊的好處可以總結為

1、監聽不是最早啟動

2、資料庫運作期間,監聽發成重新開機

3、oracle執行個體還沒有open

當發生上述三種情況時,不會發生監聽注冊失敗。

繼續閱讀