LOCAL_LISTENER 配置多个监听
通常能够情况下,您不必在数据库中配置与监听器相关的参数,无论是LOCAL_LISTENER还是REMOTE_LISTENER。每个实例的后台进程监听器注册(LREG)将自动向默认的本地和远程监听器注册服务。
对于使用非本地 IP 地址或非默认端口号的监听,您需要明确告诉 LREG 向多个监听器注册数据库服务。这就需要在LOCAL_LISTENER中设置更多的监听器地址。
在这种情况下,我们创建一个备份监听非默认端口 1522 以实现冗余。
1.创建新的监听器
编辑listener.ora
要添加一个监听不同端口的新监听器,我们需要修改listener.ora。
[oracle@test ~]$ vi $ORACLE_HOME/network/admin/listener.ora ... LISTENER2 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1522)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522)) ) )
在RAC数据库中添加监听器可以参考:Srvctl如何给Grid的默认网络添加监听器。
lsnrctl start
我们通过lsnrctl start命令启动它。
[oracle@test ~]$ lsnrctl start listener2 LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 13-OCT-2022 04:36:46 Copyright (c) 1991, 2019, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.3.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/test/listener2/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.111)(PORT=1522))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1522))) STATUS of the LISTENER ------------------------ Alias listener2 Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 13-OCT-2022 04:36:46 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/test/listener2/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.111)(PORT=1522))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522))) The listener supports no services The command completed successfully
在RAC数据库中启动监听器可以参考:Srvctl如何给Grid的默认网络添加监听器。
我们准备好了。
2.修改配置LOCAL_LISTENER
假设您已经创建了一个监听端口 1522 的新备份监听器。让我们看看如何在LOCAL_LISTENER中配置多个条目。
SQL> alter system set local_listener='(ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1522)))' scope=both;
System altered.
ADDRESS_LIST 与 ADDRESS
关键是使用一个ADDRESS_LIST来接受参数中的多个ADDRESS。所以ADDRESS_LIST和每个ADDRESS之间的关系可以被认为是父子关系。
由于参数可以动态更改,我们不必重新启动实例。所以现在,我们可以确保参数配置正确。
SQL> show parameter local_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string (ADDRESS_LIST=(ADDRESS = (PROT
OCOL = TCP)(HOST = 192.168.0.1
11)(PORT = 1521))(ADDRESS = (P
ROTOCOL = TCP)(HOST = 192.168.
0.111)(PORT = 1522)))
alter system register
数据库服务将在 60 秒内注册到两个侦听器,或者您可以使其更快。
SQL> alter system register;
System altered.
SQL 命令应该在每个实例中完成。
除了备份监听器,还有更多的场景可能会使用LOCAL_LISTENER中的多个条目。
Oracle RAC VIP 如何故障转移到另一个节点
如何解决 listener supports no services
具有相同端口的多个侦听器?
不可以,不能创建具有相同端口的相同 IP的监听,而其他 IP 已被占用。你甚至无法启动它。让我们看看错误。
[oracle@test ~]$ lsnrctl start listener2 ... TNS-01106: Listener using listener name LISTENER has already been started
只是不要为您的备份监听器监听相同的端口,选择另一个端口。按照惯例,端口 1522 是可以接受的。




