2020年11月20日 星期五

6.2 Oracle Listener

Oracle Listener 只會存在 Oracle Server 上,主要的功能是用來建立起Oracle Client 與 Server 之間的連線,一台 Oracle Server 可以建立一個或多個 Listener,每個 Listener 分別設定不同的 Port Number,預設 Listener 使用的是 1521 Port。


建立 Listener 的方式可以透過 netca 或是自行編輯 listener.ora 進行設定,如果是 RAC 系統的話,則是透過 srvctl add listener 命令來建立。listener.ora 存放在 $ORACLE_HOME/network/admin 目錄底下,如果是 Oracle 11g 之後的 RAC 系統,則是存放在 $GRID_HOME/network/admin 底下,listener.ora 裡面定義了 Listener 名稱、ip 位址以及 Port Number:

上述範例中設定了兩個 Listener,一個是預設的名稱 “LISTENER” ,使用的是預設 1521 Port,而另一個是自行設定的名稱 “LISTENER_ORCL” ,使用的是 1522 Port。


Listener 在管理上使用的是 lsnrctl 命令,lsnrctl 後面不指定 Listener 名稱的話則表示是預設的 Listener:

$ lsnrctl start

(開啟預設的 Listener)

$ lsnrctl stop 

(關閉預設的 Listener)

$ lsnrctl status 

(查看預設的 Listener 狀態)

$ lsnrctl start LISTENER_ORCL

(開啟 LISENER_ORCL 這個 Listener)

$ lsnrctl stop LISTENER_ORCL

(關閉 LISENER_ORCL 這個 Listener)

$ lsnrctl status LISTENER_ORCL

(查看LISENER_ORCL 這個 Listener 的狀態)

如果是 RAC 系統的話則是使用 srvctl 命令來管理。


既然一台 Oracle Server 可以建立多個 Listener,那麼我們就可以選擇在這台 Oracle Server 上的資料庫要註冊到哪一個 Listener 上面。資料庫必須進行註冊的動作,Listener 才會有相對應的 Service Name 、 SID 等資訊,在 Client 進行連線時,Listener 便會檢查 Client 所請求的 Service Name 是否有在它的清單上,檢查通過後便會把連線接通到資料庫,如果資料庫沒有註冊的話,那麼 Listener 也不會有它的 Service Name,也就無法連線了。


例如現在有兩個 Listener 分別是 Listener_1 與 Listner_2,而同時也有兩個資料庫 DB1 與 DB2,DB1 只有註冊到 Listener_2 而 DB2 同時註冊在 Listener_1 與 Listener_2:

在這樣的設定下,Client 可以透過 1521 Port 以及 1522 Port 來連線到 DB2,而 DB1 就只能透過 1522 Port 來連線了。


資料庫註冊到 Listener 的方式分為靜態註冊與動態註冊兩種。


靜態註冊是把資料庫的資訊直接定義在 Listener 的設定當中,也就是在 listener.ora 裡面進行設定,只要 Listener 一啟動之後馬上就有此資料庫的資訊,靜態註冊可以註冊多個資料庫,只需要把資料庫的資訊放入 SID_LIST_<Listener_Name> 這個格式底下就完成靜態註冊,例如將 orcl 這個資料庫靜態註冊到名為 “LISTENER” 這個 Listener 底下:

如果要靜態註冊多個資料庫,只需複製 “SID_DESC” 底下這個段落接續在 “SID_LIST” 這個段落底下就可以了。由於是在 listener.ora 進行設定,因此要讓設定生效的話必須 restart 或是 reload Listener ,讓 Listener 重新讀取 listener.ora 後生效。


資料庫動態註冊表示資料庫在啟動之後,會自動的註冊到 Listener 上面,這個動作是藉由 PMON 這個 Background Process 來達成 (Oracle 12c 以後改由 LREG 負責)。既然是自動註冊,那麼資料庫怎麼知道要註冊到哪一個 Listener 上面 ? 這個就要透過 local_listener 這個參數來達成,假如 local_listener 這個參數沒有進行任何設定,那麼資料庫就會自動註冊到預設 1521 Port 的這個 Listener,如果要註冊到其它 Listener,那麼就要設定 local_listener 來提示資料庫要註冊到哪一個 Port 上面,例如註冊到 1522 Port 的 Listener 就需設定如下:

由於動態註冊是透過 Background Process 來進行,運作上需要一些時間,有時在資料庫剛啟動後還沒辦法立即的從 Listener 上面看到 Service Name,這個時候可以透過命令 alter system register 來立即執行註冊。


靜態註冊與動態註冊最大的差別在於顯示的狀態:


由於靜態註冊是直接在 listener.ora 裡面設定,我們只是把這筆紀錄直接寫入到 Listener 當中,因此對於 Listener 來說並不會知道這個資料庫是否存在、開啟或關閉,它只知道有這筆紀錄而已,所以靜態註冊顯示的 Instance 狀態為 “UNKNOWN”;而動態註冊則是資料庫開啟後自動註冊的,這個行為必須是在資料庫開啟的狀態才會發生,因此動態註冊所看到的 Instance 狀態為 “READY”,經由這個邏輯可以簡單觀察 lsnrctl status 裡面 “READY” 的狀態來判斷哪些資料庫有開啟。


Listener 在整個 Oracle Network 環境當中扮演非常重要的腳色,所有 Client 的連線都必須透過 Listener 來完成,對於 Client 使用者來說,可以使用 tnsping 這個命令來檢測 tnsnames.ora 裡面所設定的 ip 與 Port 是否有 Listener 存在:

如果 Listener 不存在或是設定有誤的話則會出現 TNS-12541: TNS:no listener 錯誤,在此值得注意的是,tnsping 只能檢測是否有 Listener ,如果 tnsnames.ora 裡面的 Service Name 設定有誤的話,tnsping 是檢查不出來的,此時必須實際的進行連線來檢測,假如 Service Name 的設定有問題的話,會出現 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 錯誤,這時就必須檢查 tnsnames.ora 裡面的設定,或者經由 lsnrctl status 來檢查資料庫是否有註冊到相對應的 Listener。





沒有留言:

張貼留言