大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路 。
Oracle 监听网络管理配置
前言简述
Oracle 监听器是客户端连接数据库服务的桥梁,默认使用 1521/TCP 端口,服务端需要配置监听文件才能接受客户端连接。通常客户端需要通过缺省端口连接 Oracle 服务端,但此监听端口我们可在服务端进行自定义的配置,下面就以 Windows 环境下安装 Oracle 12c 为例,介绍如何配置监听网络管理。
配置文件
在实践前先简单了解一下服务端、客户端相关核心配置文件,如下所示:
1.服务端配置文件
- listener.ora - 监听程序配置文件tnsnames.ora - TNS名称解析文件sqlnet.ora - 网络参数配置文件
# 服务端,监听文件
# 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))
)
)
# 服务端,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))
# 服务端,监听管理参数文件
# C:apporacleproduct12.2.0dbhome_1networkadminsqlnet.ora
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
# 解决 ORA-28040 错误,解决客户端与服务端版本不兼容导致无法连接问题。
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)
)
)
管理命令
此小节简单介绍相关界面配置命令,及监听器管理、测试命令,帮助大家快速上手。
1.使用 Net Configuration Assistant 工具创建。
# Linux
$ netca
# Windows
$ C:apporacleproduct12.2.0dbhome_1binnetca
2.使用 lsnrctl 命令管理查看监听状态,可以看到默认监听了全部数据库实例。
$ lsnrctl start
$ lsnrctl stop
$ lsnrctl status
服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "histdb" 包含 1 个实例。
实例 "histdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "histdbXDB" 包含 1 个实例。
实例 "histdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "itgeekdb" 包含 1 个实例。
实例 "itgeekdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "itgeekdbXDB" 包含 1 个实例。
实例 "itgeekdb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
3.使用 tnsping 命令查看配置的TNS名称对象是否正常连接,例如,缺省以 orcl 数据库为例。
$ tnsping histdb
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = histdb)))
OK (10 毫秒)
实践案例
案例1.增加一个1522端口的监听
用于上面新创建的数据库(itgeekdb)使用,或容灾使用(通常),以 Windows 环境为例,大致流程如下:
1.使用netca工具创建新监听LISTENER1522
2.配置TCP协议和1522端口
3.修改listener.ora添加静态注册信息
4.重启监听程序
步骤 01.使用命令行执行 netca ,打开 Oracle Net Configuration Assistant 助手界面,选择监听程序配置。
weiyigeek.top-netca网络配置助手
步骤 02.选择添加Oracle Net监听程,然后设置监听程序名称为LISTENER1522.
weiyigeek.top-设置监听程序
步骤 03.根据实际情况选择协议,通常选择TCP与IPC协议即可,设置监听端口号为1522,IPC键值为 EXTPROC1522
weiyigeek.top-选择协议
步骤 04.继续点击下一步(N),显示如下界面则表示监听程序添加成功。
weiyigeek.top-查看监听配置
步骤 05.验证监听是否正常,可通过如下两个命令判断:
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
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-histdb)(PORT=1522)))
监听程序不支持服务 # 可以看到监听已经起来了,但是没有配置服务名称。
命令执行成功
可查看 register 与 local_listener 参数,前置是查询是否为自动配置监听,后者是当前监听器。默认情况下,数据库会将服务动态注册到名为LISTENER,监听端口为1521的监听器中。
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 端口访问,上文创建的 ITGEEKDB 数据库,修改示例如下。
# 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.修改完毕后,便可以重启监听器,查看服务状态。
$ lsnrctl stop LISTENER1522
$ lsnrctl start LISTENER1522
$ lsnrctl status LISTENER1522
服务摘要..
服务 "ITGEEKDB" 包含 1 个实例。
实例 "ITGEEKDB", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
weiyigeek.top-使用navicat验证监听配置
至此,我们可通过1521、1522端口分别访问 itgeekdb 数据库。
案例2.新增一个itgeekdb_test的TNS网络服务别名
客户端,使用 netca 命令配置 TNSNAME.ora (当然也可手动配置),并测试连接到数据库。
步骤 01.同样,命令行执行 netca ,打开如下界面,选择本地Net服务名配置
weiyigeek.top-打开netca
步骤 02.选择添加服务名称,设置 Oracle 数据库服务名称,例如上文新建的itgeekdb数据库。
weiyigeek.top-选择itgeekdb数据库
步骤 03.配置要连接的 Oracle 数据库服务端 IP地址与监听端口,然后此处可选择是否进行登录测试。
weiyigeek.top-配置实例连接
步骤 04.若选择不则跳过此步骤,若为是则显示如下界面,请使用system 用户或者你创建的数据库用户进行测试,显示测试成功字样,则表示 OK。
weiyigeek.top-验证实例连接
步骤 05.最后,配置TNS网络服务别名即可。
weiyigeek.top-创建一个网络服务别名
实际上,你也可以通过直接修改C:apporacleproduct12.2.0dbhome_1networkadmintnsnames.ora 配置来替代上述操作,更方便简洁,但需特别注意文件权限。
ITGEEKDB_TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.228.132)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = itgeekdb)
)
)
步骤 06.然后,使用 tnsping 验证 TNS 连接别名。
$ tnsping itgeekdb_test
已使用的参数文件:
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 工具连接到数据库中。
知识扩展
静态注册 & 动态注册
不知道眼尖的看友是否注意到,LISTENER1522 监听器服务 itgeekdb 实例状态显示为UNKNOWN值,表明此服务是静态注册的设置,监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在;当然我们也可也通过命令方式来设置动态注册,从而这样不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。
动态注册
- :数据库实例启动时,会自动向监听器注册服务信息。
# 首先,修改 tnsnames.ora 文件,手动新添加下ITGEEKDB数据库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 数据库 sys 用户中,指定监听参数(方式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; -- 强制动态注册立即执行,而不必等待 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))';
# 最后,重启监听 LISTENER1522 监听,便可查询到我们 服务 "ITGEEKDB",实例 "itgeekdb"为状态 READY
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522
静态注册
- :需要在 listener.ora 文件中手动配置服务信息,主要用于特殊情况(如数据库未启动时仍需连接监听器)。
# 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 监听,便可查询到我们 实例 "ITGEEKDB", 状态 UNKNOWN, 包含此服务的 1 个处理程序
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522
weiyigeek.top-动态注册和静态注册在实例状态区别
以下是 Oracle 监听器动态注册和静态注册的区别对比表:
| 对比项 | 动态注册 | 静态注册 |
|---|---|---|
| 基本概念 | 由数据库实例自动向监听器注册服务信息,是 Oracle 推荐的方式(特别是 10g 之后版本),由数据库自动管理 | 需要在 listener.ora 中手动配置服务信息,主要用于特殊情况(如数据库未启动时仍需连接监听器) |
| 依赖文件 | 即使没有 listener.ora 文件也能工作(默认监听 1521 端口) | 必须配置 listener.ora 文件 |
| 服务状态 | 显示为 READY 状态 | 显示为 UNKNOWN 状态 |
| 注册时机 | 由 PMON 进程每分钟自动注册一次 | 监听器启动时立即注册(无需数据库实例运行) |
| 远程启动数据库 | 不支持远程启动数据库(必须至少 MOUNT 状态才能注册) | 支持远程登录并启动数据库(STARTUP 命令) |
| 数据库状态要求 | 数据库必须至少启动到 MOUNT 状态才能注册 | 无需数据库实例运行即可注册 |
| 配置内容 | 无需 SID_LIST 配置(自动注册实例和服务名) | 必须手动配置 SID_LIST(包括协议、主机、端口、实例名等) |
| 适用场景 | 推荐用于生产环境(自动维护服务状态) | 常用于特殊需求(如远程启动、ASM 实例、RAC 环境等) |
| 灵活性 | 更灵活(自动适应服务变化) | 较不灵活(需手动维护配置) |
| 典型配置示例 | 无需特殊配置(默认动态注册) | SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (SID_NAME = ORCL) ) ) |
| 查看命令 | lsnrctl status 显示服务状态为 "READY" |
lsnrctl status 显示服务状态为 "UNKNOWN" |
加入:作者【全栈工程师修炼指南】星球
『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。
Q: 加入作者【全栈工程师修炼指南】星球后有啥好处?
✅ 将获得作者最新工作学习实践文章以及网盘资源。 ✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友,也可单次购买)。 ✅ 将获得作者专门答疑学习交流群,解决在工作学习中的问题。 ✅ 将获得作者远程支持(在作者能力范围内且合规)。
目前新人仅需 69 元即可加入作者星球,数量有限,期待你的加入!
2060