oracle監聽服務的使用有兩種模式:動態注冊和靜態注冊
動態注冊
8i以后版本的數據庫實例在mount時,會根據參數文件中的service_names以及instance_name參數動態地將實例和服務動態注冊到listerer中
(實際操作中發現,12c版本即使不在參數文件中指定兩個參數,動態注冊功能依然生效)
執行過程
- 在參數文件中指定service_names、instance_name參數
- 啟動監聽服務
- 啟動oracle實例
說明
- 動態注冊只會在PMON進程啟動時才會自動將服務注冊到監聽器(一般在啟動一分鍾內完成注冊),因此,需要先啟動監聽服務,再啟動oracle實例;如果沒有啟動監聽服務而是直接啟動實例,因為監聽服務並未處於運行中,所以則PMON的動態注冊會失敗,此時再啟動監聽后,PMON並不會再次執行自動注冊,而是需要人工執行手動注冊
alter system register;
- 數據庫正常使用過程中,重啟監聽服務后,動態注冊結果會失效,需要再次人工執行手動注冊
alter system register;
(實際操作中發現,12c版本中直接啟動實例、重啟監聽后PMON會在大約20秒后自動動態注冊,不需要手動注冊) - 動態注冊默認只注冊到默認的監聽器(名稱LISTENER,端口1521,協議TCP)
- 動態注冊由數據庫發起,這時候監聽肯定對應數據庫,所以監聽狀態為READY
靜態注冊
oracle實例在啟動時會讀取文件$ORACLE_HOME/network/admin/listener.ora的配置,將實例和服務注冊到監聽程序
參考代碼
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME=orcl01)
(ORACLE_HOME=/oracle/app/oracle/product/12.1.0.2/db_1)
(SID_NAME=orcl01)
)
)
LISTENER=
(description_list=
(description=
(address=(protocol=tcp)(host=192.168.1.120)(port=1521))
)
)
其中,GLOBAL_DBNAME、ORACLE_HOME、SID_NAME、host四個參數的值需要根據實際情況設定
說明
- 靜態注冊與實例是否啟動無關,啟動監聽服務時會讀取listener.ora文件進行靜態注冊,此時即便數據庫未啟動,監聽狀態中依然能看到靜態注冊的信息
- 重啟監聽服務后,靜態注冊依然生效
- 靜態注冊可以更改一些自定義配置信息,例如自定義端口號
- 靜態注冊由監聽程序發起,監聽器並不知道關於該實例的任何信息,只有當客戶發出連接請求時,它才檢查該實例是否存在,所以監聽狀態為UNKNOWN
參考資料:
https://developer.aliyun.com/article/415296
https://www.cnblogs.com/guilingyang/p/6074867.html