srvctl modify scan_listener -p 是修改SCAN端口的唯一有效方式,必须带完整协议前缀如"TCP:11521",引号不可省略,且需配合stop/start操作才生效;修改后须手动同步remote_listener和local_listener参数。

srvctl modify scan_listener 是改 SCAN 端口的唯一有效入口,直接改 listener.ora 或重启 CRS 没用。
srvctl modify scan_listener -p 必须带完整协议前缀
SCAN 监听器端口不是裸数字,必须显式声明协议和格式。比如想改成 11521:
srvctl modify scan_listener -p "TCP:11521"
写成 srvctl modify scan_listener -p 11521 会静默失败,srvctl config scan_listener 仍显示旧端口,且 lsnrctl status LISTENER_SCAN1 的输出里 Listening Endpoints 不更新。
- 协议必须大写:
TCP,不能是tcp或省略 - 多端口用斜杠分隔:
"TCP:1521/TCP:1525/TCP:1526" - 引号不能漏,Shell 会把冒号或斜杠当分词符处理
改完不重启监听器,配置不会生效 —— 这点和本地监听不同,SCAN 监听器必须显式 stop/start。
SCAN 端口修改后,local_listener 和 remote_listener 不自动同步
Grid Infrastructure 层面改了 SCAN 端口,数据库实例里的两个关键参数不会自动刷新:
-
local_listener:指向本节点 VIP + 端口,用于实例向本地监听注册服务 -
remote_listener:指向 SCAN 名称 + 端口,用于跨节点负载均衡和服务发现
即使你只改 SCAN 端口(没动本地监听),也建议检查并手动对齐:
-- 查看当前值 SHOW PARAMETER local_listener; SHOW PARAMETER remote_listener; -- 如果 remote_listener 还是 'rac-scan:1521',需更新 ALTER SYSTEM SET remote_listener='rac-scan:11521' SCOPE=BOTH; -- local_listener 一般由 CRS 自动维护,但若之前手工设过,也要核对端口是否一致 -- 例如:'(ADDRESS=(PROTOCOL=TCP)(HOST=rac01-vip)(PORT=11521))'
否则会出现 lsnrctl status LISTENER_SCAN1 显示监听已启、端口正确,但 Services Summary 下没有数据库服务注册进来 —— 典型症状就是“监听起来了,但连不上”。
多端口场景下,srvctl add listener 创建专用监听器更可控
当一套 RAC 要跑多个数据库、每个库用不同端口时,别只依赖 SCAN 监听器“多端口监听”能力。
- SCAN 监听器本身支持多端口(
srvctl modify scan_listener -p "TCP:1521/TCP:1525"),但它只负责初始连接分发 - 实际服务注册和连接维持,仍靠各节点上的本地监听器(
LISTENER或自定义名) - 所以更稳妥的做法是:为每个数据库配一个独立本地监听器
# 创建 DB2 专用监听器(端口 1525) srvctl add listener -l LISTENER_DB2 -p "TCP:1525" srvctl start listener -l LISTENER_DB2 # 然后在 DB2 实例中设置 ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=rac01-vip)(PORT=1525))' SCOPE=BOTH SID='db21'; ALTER SYSTEM SET remote_listener='rac-scan:1525' SCOPE=BOTH; ALTER SYSTEM REGISTER;
这样能避免端口混用、服务注册冲突,也方便防火墙策略细化控制。
防火墙开通不能只开 SCAN IP 端口。SCAN 只管第一次握手,后续连接实际走的是各节点 VIP 的对应端口 —— 所以 VIP 端口和 SCAN 端口都得放行,缺一不可。


















