淺談oracle的監聽服務-靜態注冊

概述

動態服務是實例在服務器上啓動並運行時向偵聽器注冊的代表,而靜態服務(SID_LIST_LISTENER)可用于服務外部連接,無論是否在服務器上運行實例,連接非常有用到空閑或 NOMOUNT 數據庫。

根據Oracle 19c Advanced Features of Oracle Net Services,靜態服務的用例可以是以下任何一種:

  • 外部過程調用
  • Oracle 異構服務
  • Oracle Data Guard
  • 從 Oracle Enterprise Manager Cloud Control 以外的工具遠程啓動數據庫
  • 與早于 Oracle8i 版本 2 (8.1) 的 Oracle 數據庫的連接
淺談oracle的監聽服務-靜態注冊

1.添加單個靜態服務

啓用靜態服務注冊功能的配置非常簡單,只需在監聽器配置文件中添加一個名爲SID_LIST_LISTENER的條目,該文件通常位于$ORACLE_HOME/network/admin/listener.ora,然後重新啓動監聽器。

[[email protected] ~]$ vi $ORACLE_HOME/network/admin/listener.ora
...
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=ORCL))
)

基本上,靜態服務注冊至少需要知道兩項,ORACLE_HOMEORACLE_SID。如您所見,我們在條目中提供了它們。

2.添加多個靜態服務

對于更多ORACLE_SID,您可以像這樣將SID_LIST附加到條目中。

[[email protected] ~]$ vi $ORACLE_HOME/network/admin/listener.ora
...
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=ORCL))
(SID_DESC=
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=SMALLDB))

)

3. 使用 GLOBAL_DBNAME

對于那些DB_DOMAIN不爲空的數據庫,您應該在SID_LIST中添加更多信息GLOBAL_DBNAME

[[email protected] ~]$ vi $ORACLE_HOME/network/admin/listener.ora
...
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=ORCL))
(GLOBAL_DBNAME=orcl.example.com)
)

GLOBAL_DBNAME的格式如下:

<DB_UNIQUE_NAME>.<DB_DOMAIN>

在上述情況下,數據庫的DB_DOMAINexample.com。請注意,如果您的DB_DOMAIN爲空,則不必添加它。不要忘記重新啓動監聽器以立即生效。

4. Data Guard Broker 的靜態服務

您必須爲數據保護代理添加一個特殊的靜態服務<DB_UNIQUE_NAME>_DGMGRL.<DB_DOMAIN>以啓用需要重新啓動實例而無需手動幹預的代理操作,例如通過switchover在主數據庫和備用數據庫之間進行角色轉換。

[[email protected] ~]$ vi $ORACLE_HOME/network/admin/listener.ora
...
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=ORCL))
(GLOBAL_DBNAME=ORCL_DGMGRL)
)

請注意,如果您的DB_DOMAIN爲空,則不必添加它。所有服務名稱最好大寫。

服務名稱的狀態

讓我們看看他們在監聽器中的狀態。

[[email protected] ~]$ lsnrctl status
...
Services Summary...
Service "ORCL" has 2 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "ORCLXDB" has 1 instance(s).
Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully

靜態服務ORCL的狀態被標記爲UNKNOWN,而動態服務是READY,這意味著實例確實存在並准備好服務。