• 正文
    • 前言簡述
    • 配置文件
    • 管理命令
    • 實(shí)踐案例
    • 知識擴(kuò)展
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

DBA | Oracle 數(shù)據(jù)庫監(jiān)聽網(wǎng)絡(luò)配置管理實(shí)踐指南

7小時(shí)前
133
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是?WeiyiGeek,一名深耕安全運(yùn)維開發(fā)(SecOpsDev)領(lǐng)域的技術(shù)從業(yè)者,致力于探索DevOps與安全的融合(DevSecOps),自動化運(yùn)維工具開發(fā)與實(shí)踐,企業(yè)網(wǎng)絡(luò)安全防護(hù),歡迎各位道友一起學(xué)習(xí)交流、一起進(jìn)步 ,若此文對你有幫助,一定記得倒點(diǎn)個(gè)關(guān)注?與小紅星??,收藏學(xué)習(xí)不迷路??。

Oracle 監(jiān)聽網(wǎng)絡(luò)管理配置

前言簡述

Oracle 監(jiān)聽器是客戶端連接數(shù)據(jù)庫服務(wù)的橋梁,默認(rèn)使用?1521/TCP?端口,服務(wù)端需要配置監(jiān)聽文件才能接受客戶端連接。通??蛻舳诵枰ㄟ^缺省端口連接 Oracle 服務(wù)端,但此監(jiān)聽端口我們可在服務(wù)端進(jìn)行自定義的配置,下面就以 Windows 環(huán)境下安裝 Oracle 12c 為例,介紹如何配置監(jiān)聽網(wǎng)絡(luò)管理。

配置文件

在實(shí)踐前先簡單了解一下服務(wù)端、客戶端相關(guān)核心配置文件,如下所示:

1.服務(wù)端配置文件

    listener.ora - 監(jiān)聽程序配置文件tnsnames.ora - TNS名稱解析文件sqlnet.ora - 網(wǎng)絡(luò)參數(shù)配置文件
# 服務(wù)端,監(jiān)聽文件
# C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
SID_LIST_LISTENER =
? (SID_LIST =
? ? (SID_DESC =
? ? ? (SID_NAME = CLRExtProc)
? ? ? (ORACLE_HOME = C:apporacleproduct12.2.0dbhome_1)
? ? ? (PROGRAM = extproc)
? ? ? (ENVS =?"EXTPROC_DLLS=ONLY:C:apporacleproduct12.2.0dbhome_1binoraclr12.dll")
? ? )
? )

LISTENER =
? (DESCRIPTION_LIST =
? ? (DESCRIPTION =
? ? ? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))
? ? ? (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
? ? )
? )

# 服務(wù)端,TNS名稱文件
# C:apporacleproduct12.2.0dbhome_1networkadmintnsnames.ora
ORACLR_CONNECTION_DATA =
? (DESCRIPTION =
? ? (ADDRESS_LIST =
? ? ? (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
? ? )
? ? (CONNECT_DATA =
? ? ? (SID = CLRExtProc)
? ? ? (PRESENTATION = RO)
? ? )
? )

HISTDB =
? (DESCRIPTION =
? ? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))
? ? (CONNECT_DATA =
? ? ? (SERVER = DEDICATED)
? ? ? (SERVICE_NAME = histdb)
? ? )
? )

LISTENER_HISTDB =
? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))


# 服務(wù)端,監(jiān)聽管理參數(shù)文件
# C:apporacleproduct12.2.0dbhome_1networkadminsqlnet.ora
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
# 解決 ORA-28040 錯(cuò)誤,解決客戶端與服務(wù)端版本不兼容導(dǎo)致無法連接問題。
SQLNET.ALLOWED_LOGON_VERSION=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVE=10

2.客戶端配置文件

    tnsnames.ora - 客戶端TNS名稱解析文件
# 客戶端,TNS名稱文件
HISTDB=
? (DESCRIPTION =
? ? (ADDRESS_LIST =
? ? ? (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.172.106)(PORT = 1521))
? ? )
? ? (CONNECT_DATA =
? ? ? (SERVICE_NAME = HISTDB)
? ? )
? )

管理命令

此小節(jié)簡單介紹相關(guān)界面配置命令,及監(jiān)聽器管理、測試命令,幫助大家快速上手。

1.使用 Net Configuration Assistant 工具創(chuàng)建。

# Linux
$ netca
# Windows
$ C:apporacleproduct12.2.0dbhome_1binnetca

 

2.使用 lsnrctl 命令管理查看監(jiān)聽狀態(tài),可以看到默認(rèn)監(jiān)聽了全部數(shù)據(jù)庫實(shí)例。

$ lsnrctl start
$ lsnrctl stop
$ lsnrctl status

服務(wù)摘要..
服務(wù)?"CLRExtProc"?包含 1 個(gè)實(shí)例。
? 實(shí)例?"CLRExtProc", 狀態(tài) UNKNOWN, 包含此服務(wù)的 1 個(gè)處理程序...
服務(wù)?"histdb"?包含 1 個(gè)實(shí)例。
? 實(shí)例?"histdb", 狀態(tài) READY, 包含此服務(wù)的 1 個(gè)處理程序...
服務(wù)?"histdbXDB"?包含 1 個(gè)實(shí)例。
? 實(shí)例?"histdb", 狀態(tài) READY, 包含此服務(wù)的 1 個(gè)處理程序...
服務(wù)?"itgeekdb"?包含 1 個(gè)實(shí)例。
? 實(shí)例?"itgeekdb", 狀態(tài) READY, 包含此服務(wù)的 1 個(gè)處理程序...
服務(wù)?"itgeekdbXDB"?包含 1 個(gè)實(shí)例。
? 實(shí)例?"itgeekdb", 狀態(tài) READY, 包含此服務(wù)的 1 個(gè)處理程序...
命令執(zhí)行成功

 

3.使用 tnsping 命令查看配置的TNS名稱對象是否正常連接,例如,缺省以 orcl 數(shù)據(jù)庫為例。

$ tnsping histdb
已使用 TNSNAMES 適配器來解析別名
嘗試連接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = histdb)))
OK (10 毫秒)

實(shí)踐案例

案例1.增加一個(gè)1522端口的監(jiān)聽

用于上面新創(chuàng)建的數(shù)據(jù)庫(itgeekdb)使用,或容災(zāi)使用(通常),以 Windows 環(huán)境為例,大致流程如下:

1.使用netca工具創(chuàng)建新監(jiān)聽LISTENER1522

2.配置TCP協(xié)議1522端口

3.修改listener.ora添加靜態(tài)注冊信息

4.重啟監(jiān)聽程序

步驟 01.使用命令行執(zhí)行 netca ,打開 Oracle Net Configuration Assistant 助手界面,選擇監(jiān)聽程序配置。

weiyigeek.top-netca網(wǎng)絡(luò)配置助手

步驟 02.選擇添加Oracle Net監(jiān)聽程,然后設(shè)置監(jiān)聽程序名稱為LISTENER1522.

weiyigeek.top-設(shè)置監(jiān)聽程序

步驟 03.根據(jù)實(shí)際情況選擇協(xié)議,通常選擇TCPIPC協(xié)議即可,設(shè)置監(jiān)聽端口號為1522,IPC鍵值為?EXTPROC1522

weiyigeek.top-選擇協(xié)議

步驟 04.繼續(xù)點(diǎn)擊下一步(N),顯示如下界面則表示監(jiān)聽程序添加成功。

weiyigeek.top-查看監(jiān)聽配置

步驟 05.驗(yàn)證監(jiān)聽是否正常,可通過如下兩個(gè)命令判斷:

PS C:UsersAdministratorDesktop> NETSTAT.EXE -ano | findstr?"1522"
? TCP ? ?0.0.0.0:1522 ? ? ? ? ? 0.0.0.0:0 ? ? ? ? ? ? ?LISTENING ? ? ? 8808
? TCP ? ?[::]:1522 ? ? ? ? ? ? ?[::]:0 ? ? ? ? ? ? ? ? LISTENING ? ? ? 8808
?
PS C:UsersAdministratorDesktop> lsnrctl status LISTENER1522
監(jiān)聽端點(diǎn)概要...
? (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-histdb)(PORT=1522)))
監(jiān)聽程序不支持服務(wù) ?# 可以看到監(jiān)聽已經(jīng)起來了,但是沒有配置服務(wù)名稱。
命令執(zhí)行成功

可查看 register 與 local_listener 參數(shù),前置是查詢是否為自動配置監(jiān)聽,后者是當(dāng)前監(jiān)聽器。默認(rèn)情況下,數(shù)據(jù)庫會將服務(wù)動態(tài)注冊到名為LISTENER,監(jiān)聽端口為1521的監(jiān)聽器中。

SQL> show parameter register
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ? ? ? ? ? ? VALUE
------------------------------------ ---------------------- ------------------------------
hs_autoregister ? ? ? ? ? ? ? ? ? ? ?boolean ? ? ? ? ? ? ? ?TRUE

SQL> show parameter local_listener
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ? ? ? ? ? ? VALUE
------------------------------------ ---------------------- ------------------------------
local_listener ? ? ? ? ? ? ? ? ? ? ? string ? ? ? ? ? ? ? ? LISTENER_ITGEEKDB

步驟 06.此外除了使用 netca 界面化配置外,為了便利還可直接修改 listener.ora 文件,使得我們可以通過 1522 端口訪問,上文創(chuàng)建的 ITGEEKDB 數(shù)據(jù)庫,修改示例如下。

# File: C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
SID_LIST_LISTENER1522 =
? (SID_LIST =
? ? (SID_DESC =
? ? ? (GLOBAL_DBNAME = ITGEEKDB)
? ? ? (ORACLE_HOME =C:apporacleproduct12.2.0dbhome_1)
? ? ? (SID_NAME = ITGEEKDB)
? ? )
? )

LISTENER1522 =
? (DESCRIPTION_LIST =
? ? (DESCRIPTION =
? ? ? (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
? ? ? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))
? ? )
? )

步驟 07.修改完畢后,便可以重啟監(jiān)聽器,查看服務(wù)狀態(tài)。

$ lsnrctl stop LISTENER1522
$ lsnrctl start LISTENER1522
$ lsnrctl status LISTENER1522

? 服務(wù)摘要..
? 服務(wù)?"ITGEEKDB"?包含 1 個(gè)實(shí)例。
? ? 實(shí)例?"ITGEEKDB", 狀態(tài) UNKNOWN, 包含此服務(wù)的 1 個(gè)處理程序...
? 命令執(zhí)行成功

weiyigeek.top-使用navicat驗(yàn)證監(jiān)聽配置

至此,我們可通過1521、1522端口分別訪問 itgeekdb 數(shù)據(jù)庫。

案例2.新增一個(gè)itgeekdb_test的TNS網(wǎng)絡(luò)服務(wù)別名

客戶端,使用 netca 命令配置 TNSNAME.ora (當(dāng)然也可手動配置),并測試連接到數(shù)據(jù)庫。

步驟 01.同樣,命令行執(zhí)行 netca ,打開如下界面,選擇本地Net服務(wù)名配置

weiyigeek.top-打開netca

步驟 02.選擇添加服務(wù)名稱,設(shè)置 Oracle 數(shù)據(jù)庫服務(wù)名稱,例如上文新建的itgeekdb數(shù)據(jù)庫。

weiyigeek.top-選擇itgeekdb數(shù)據(jù)庫

步驟 03.配置要連接的 Oracle 數(shù)據(jù)庫服務(wù)端 IP地址與監(jiān)聽端口,然后此處可選擇是否進(jìn)行登錄測試。

weiyigeek.top-配置實(shí)例連接

步驟 04.若選擇則跳過此步驟,若為是則顯示如下界面,請使用system 用戶或者你創(chuàng)建的數(shù)據(jù)庫用戶進(jìn)行測試,顯示測試成功字樣,則表示 OK。

weiyigeek.top-驗(yàn)證實(shí)例連接

步驟 05.最后,配置TNS網(wǎng)絡(luò)服務(wù)別名即可。

weiyigeek.top-創(chuàng)建一個(gè)網(wǎng)絡(luò)服務(wù)別名

實(shí)際上,你也可以通過直接修改C:apporacleproduct12.2.0dbhome_1networkadmintnsnames.ora?配置來替代上述操作,更方便簡潔,但需特別注意文件權(quán)限。

ITGEEKDB_TEST =
? (DESCRIPTION =
? ? (ADDRESS_LIST =
? ? ? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.228.132)(PORT = 1521))
? ? )
? ? (CONNECT_DATA =
? ? ? (SERVICE_NAME = itgeekdb)
? ? )
? )

步驟 06.然后,使用 tnsping 驗(yàn)證 TNS 連接別名。

$ tnsping itgeekdb_test
已使用的參數(shù)文件:
C:apporacleproduct12.2.0dbhome_1networkadminsqlnet.ora
已使用 TNSNAMES 適配器來解析別名
嘗試連接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.228.132)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = itgeekdb)))
OK (0 毫秒)

步驟 07.最后,使用 sqlplus 或者 navicat 工具連接到數(shù)據(jù)庫中。

知識擴(kuò)展

靜態(tài)注冊 & 動態(tài)注冊

不知道眼尖的看友是否注意到,LISTENER1522?監(jiān)聽器服務(wù) itgeekdb 實(shí)例狀態(tài)顯示為UNKNOWN值,表明此服務(wù)是靜態(tài)注冊的設(shè)置,監(jiān)聽器用來表明它不知道關(guān)于該實(shí)例的任何信息,只有當(dāng)客戶發(fā)出連接請求時(shí),它才檢查該實(shí)例是否存在;當(dāng)然我們也可也通過命令方式來設(shè)置動態(tài)注冊,從而這樣不管何時(shí)關(guān)閉數(shù)據(jù)庫,動態(tài)注冊的數(shù)據(jù)庫都會動態(tài)地從監(jiān)聽器注銷,而與之相關(guān)的信息將從狀態(tài)列表中消失。

動態(tài)注冊

    :數(shù)據(jù)庫實(shí)例啟動時(shí),會自動向監(jiān)聽器注冊服務(wù)信息。
# 首先,修改 tnsnames.ora 文件,手動新添加下ITGEEKDB數(shù)據(jù)庫TNS名稱信息
ITGEEKDB1522 =
? (DESCRIPTION =
? ? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))
? ? (CONNECT_DATA =
? ? ? (SERVER = DEDICATED)
? ? ? (SERVICE_NAME = itgeekdb)
? ? )
? )

LISTENER_ITGEEKDB1522 =
? (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))

# 其次,使用 sqlplus 命令登錄到 itgeekdb 數(shù)據(jù)庫 sys 用戶中,指定監(jiān)聽參數(shù)(方式1)
SYS@itgeekdb 2025-04-21 14:38:58> alter system?set?local_listener=LISTENER_ITGEEKDB1522;
SYS@itgeekdb 2025-04-21 14:40:42> alter system register; ?-- 強(qiáng)制動態(tài)注冊立即執(zhí)行,而不必等待 PMON 的下次自動注冊
SYS@itgeekdb 2025-04-21 14:40:57> show parameter register;
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ? ? ? ? ? ? VALUE
------------------------------------ ---------------------- ------------------------------
hs_autoregister ? ? ? ? ? ? ? ? ? ? ?boolean ? ? ? ? ? ? ? ?TRUE
# 或者
# 使用方式2,從而不用配置 tnsnames.ora 文件
# alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-histdb)(PORT=1522))';

# 最后,重啟監(jiān)聽 LISTENER1522 監(jiān)聽,便可查詢到我們 服務(wù) "ITGEEKDB",實(shí)例 "itgeekdb"為狀態(tài) READY
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522

靜態(tài)注冊

    :需要在 listener.ora 文件中手動配置服務(wù)信息,主要用于特殊情況(如數(shù)據(jù)庫未啟動時(shí)仍需連接監(jiān)聽器)。
# C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
# 添加靜態(tài)注冊
SID_LIST_LISTENER1522 =
? (SID_LIST =
? ? (SID_DESC =
? ? ? (GLOBAL_DBNAME = ITGEEKDB)
? ? ? (ORACLE_HOME =C:apporacleproduct12.2.0dbhome_1)
? ? ? (SID_NAME = ITGEEKDB)
? ? )
? )

# 最后,重啟監(jiān)聽 LISTENER1522 監(jiān)聽,便可查詢到我們 實(shí)例 "ITGEEKDB", 狀態(tài) UNKNOWN, 包含此服務(wù)的 1 個(gè)處理程序
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522

weiyigeek.top-動態(tài)注冊和靜態(tài)注冊在實(shí)例狀態(tài)區(qū)別

以下是 Oracle 監(jiān)聽器動態(tài)注冊和靜態(tài)注冊的區(qū)別對比表:

對比項(xiàng) 動態(tài)注冊 靜態(tài)注冊
基本概念 由數(shù)據(jù)庫實(shí)例自動向監(jiān)聽器注冊服務(wù)信息,是 Oracle 推薦的方式(特別是 10g 之后版本),由數(shù)據(jù)庫自動管理 需要在 listener.ora 中手動配置服務(wù)信息,主要用于特殊情況(如數(shù)據(jù)庫未啟動時(shí)仍需連接監(jiān)聽器)
依賴文件 即使沒有 listener.ora 文件也能工作(默認(rèn)監(jiān)聽 1521 端口) 必須配置 listener.ora 文件
服務(wù)狀態(tài) 顯示為 READY 狀態(tài) 顯示為 UNKNOWN 狀態(tài)
注冊時(shí)機(jī) 由 PMON 進(jìn)程每分鐘自動注冊一次 監(jiān)聽器啟動時(shí)立即注冊(無需數(shù)據(jù)庫實(shí)例運(yùn)行)
遠(yuǎn)程啟動數(shù)據(jù)庫 不支持遠(yuǎn)程啟動數(shù)據(jù)庫(必須至少 MOUNT 狀態(tài)才能注冊) 支持遠(yuǎn)程登錄并啟動數(shù)據(jù)庫(STARTUP?命令)
數(shù)據(jù)庫狀態(tài)要求 數(shù)據(jù)庫必須至少啟動到 MOUNT 狀態(tài)才能注冊 無需數(shù)據(jù)庫實(shí)例運(yùn)行即可注冊
配置內(nèi)容 無需 SID_LIST 配置(自動注冊實(shí)例和服務(wù)名) 必須手動配置 SID_LIST(包括協(xié)議、主機(jī)、端口、實(shí)例名等)
適用場景 推薦用于生產(chǎn)環(huán)境(自動維護(hù)服務(wù)狀態(tài)) 常用于特殊需求(如遠(yuǎn)程啟動、ASM 實(shí)例、RAC 環(huán)境等)
靈活性 更靈活(自動適應(yīng)服務(wù)變化) 較不靈活(需手動維護(hù)配置)
典型配置示例 無需特殊配置(默認(rèn)動態(tài)注冊) SID_LIST_LISTENER = ? (SID_LIST = ? ? (SID_DESC = (GLOBAL_DBNAME = ORCL) ? ? ? (SID_NAME = ORCL) ? ? ) ? )
查看命令 lsnrctl status?顯示服務(wù)狀態(tài)為 "READY" lsnrctl status?顯示服務(wù)狀態(tài)為 "UNKNOWN"

加入:作者【全棧工程師修煉指南】星球

『?全棧工程師修煉指南』星球,主要涉及全棧工程師(Full Stack Development)實(shí)踐文章,包括但不限于企業(yè)SecDevOps和網(wǎng)絡(luò)安全等保合規(guī)、安全滲透測試、編程開發(fā)、云原生(Cloud Native)、物聯(lián)網(wǎng)工業(yè)控制(IOT)、人工智能Ai,從業(yè)書籍筆記,人生職場認(rèn)識等方面資料或文章。

Q: 加入作者【全棧工程師修煉指南】星球后有啥好處?

? 將獲得作者最新工作學(xué)習(xí)實(shí)踐文章以及網(wǎng)盤資源。 ? 將獲得作者珍藏多年的全棧學(xué)習(xí)筆記(需連續(xù)兩年及以上老星球友,也可單次購買)。 ? 將獲得作者專門答疑學(xué)習(xí)交流群,解決在工作學(xué)習(xí)中的問題。 ? 將獲得作者遠(yuǎn)程支持(在作者能力范圍內(nèi)且合規(guī))。

目前新人僅需?69?元即可加入作者星球,數(shù)量有限,期待你的加入!

相關(guān)推薦