Oracle 11gR2 RAC 清理多余的 SCAN Listener 资源
适用范围
Oracle Database 11gR2
问题概述
Oracle 11gR2 RAC 集群中存在两个 SCAN VIP 和两个 SCAN Listener,其中一个 SCAN Listener 长期处于 OFFLINE 状态,应用连接数据库和使用均正常。
问题原因
该集群原先配置了两个 SCAN IP,后续网络调整时将 SCAN IP 减少为一个,但 Oracle Clusterware 中原有的 SCAN VIP 和 SCAN Listener 资源未同步更新。
因此,集群中仍保留两个 SCAN VIP 及对应的两个 SCAN Listener。多余的 SCAN VIP 无法正常启动,导致其依赖的 SCAN Listener 长期处于 OFFLINE 状态。
解决方案
1、对scan_listener资源删除后重新添加。
处理思路:
SCAN Listener 与 SCAN VIP 是一一对应的:
一个 SCAN VIP 对应一个 SCAN Listener;
SCAN 名称解析出几个 IP,集群中通常就应配置几个 SCAN VIP;
srvctl remove scan_listener 会删除全部 SCAN Listener 资源,不能用它直接删除某一个指定编号的 SCAN Listener;
仅仅因为某个 SCAN Listener 处于 OFFLINE,不能直接判断它是多余资源。
操作前必须确认 SCAN 名称现在确实只解析到一个 IP。如果仍然能够解析到两个 IP,应先排查 SCAN VIP、网卡、地址冲突或 Listener 启动失败等问题,而不是删除资源。
Oracle 建议使用 DNS 将一个 SCAN 名称解析到三个 IP,以获得更好的连接高可用和负载均衡能力。使用 /etc/hosts 时,SCAN 通常只能解析到一个 IP,虽然可以运行,但会降低 SCAN 层面的高可用能力。
注意事项:
- 所有 RAC 节点解析必须一致
确保所有 RAC 节点的 /etc/hosts 已同步修改,并且 SCAN 名称只对应需要保留的一个 IP,例如:
192.168.10.100 rac-scan.example.com rac-scan
不要在同一节点上保留多条指向不同 IP 的 SCAN 记录。
在每个节点执行:
getent ahostsv4 rac-scan.example.com
输出中应只出现一个唯一 IP。
使用 /etc/hosts 解析时,应以 getent 的结果为准。nslookup 通常只查询 DNS,不一定反映 /etc/hosts 的实际解析结果。
- 客户端解析必须同步
所有使用 SCAN 名称连接数据库的应用服务器、运维服务器及其他客户端,其本地 hosts 文件或名称解析机制也必须同步修改。
如果客户端仍将 SCAN 名称解析到已经删除的 IP,新建数据库连接可能出现超时或失败。
- 安排维护窗口
停止或重建 SCAN Listener 期间,使用 SCAN 建立的新连接可能失败。建议在维护窗口执行,并提前确认应用侧具备重试机制。
已经建立的数据库会话通常不会因为停止 SCAN Listener 而立即断开,但仍应以实际业务测试结果为准。
操作前检查与备份
- 检查集群资源
以 Grid Infrastructure 软件所有者(通常为 grid)执行:
$GRID_HOME/bin/crsctl stat res -t
GRIDHOME/bin/srvctlconfigscanGRID_HOME/bin/srvctl status scan -v
GRIDHOME/bin/srvctlconfigscanlistenerGRID_HOME/bin/srvctl status scan_listener -v
$GRID_HOME/bin/srvctl config network
记录以下信息:
当前 SCAN 名称;
SCAN VIP 数量及地址;
SCAN Listener 数量和端口;
SCAN 所在的 Clusterware 网络编号;
哪一个资源处于 OFFLINE;
当前 数据库参数REMOTE_LISTENER 参数值。
$crsctl stat res -t
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATADG.dg
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.LISTENER.lsnr
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.SYSTEMDG.dg
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.asm
ONLINE ONLINE host01 Started
ONLINE ONLINE host02 Started
ora.eons
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.gsd
OFFLINE OFFLINE host01
OFFLINE OFFLINE host02
ora.net1.network
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.ons
ONLINE ONLINE host01
ONLINE ONLINE host02
ora.registry.acfs
ONLINE ONLINE host01
ONLINE ONLINE host02
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE host01
ora.LISTENER_SCAN2.lsnr
1 OFFLINE OFFLINE host02
ora.oc4j
1 OFFLINE OFFLINE
ora.xfdb.db
1 ONLINE ONLINE host01 Open
2 ONLINE ONLINE host02 Open
ora.host01.vip
1 ONLINE ONLINE host01
ora.host02.vip
1 ONLINE ONLINE host02
ora.scan1.vip
1 ONLINE ONLINE host01
ora.scan2.vip
1 ONLINE ONLINE host02
ora.scan3.vip
1 ONLINE ONLINE host02
- 检查数据库参数
以数据库oracle用户执行:
su - oracle
sqlplus / as sysdba
SQL>show parameter remote_listener;
如果只是减少 SCAN IP 数量,而 SCAN 名称和端口都不变,一般不需要修改 REMOTE_LISTENER。
- 备份 OCR
建议以 root 用户执行一次 OCR 手工备份:
$GRID_HOME/bin/ocrconfig -manualbackup
$GRID_HOME/bin/ocrconfig -showbackup
同时保存前面执行的 srvctl config 和 crsctl stat res -t 输出,便于出现异常时恢复原配置。
**推荐方案:**使用 modify 同步资源数量
Oracle 11gR2 已提供命令,可以根据当前 SCAN 名称解析出的 IP 数量调整 SCAN VIP,并同步增减 SCAN Listener 资源。
与全部删除重建相比,这种方式操作范围更小,建议优先采用。
- 确认解析结果
在所有 RAC 节点确认 SCAN 只解析到一个 IP:
getent ahostsv4 "$SCAN_NAME"
如果不同节点结果不一致,不要继续操作。
- 停止 SCAN Listener 和 SCAN VIP
以 grid 用户执行:
$GRID_HOME/bin/srvctl stop scan_listener
$GRID_HOME/bin/srvctl stop scan
确认均已停止:
$GRID_HOME/bin/srvctl status scan_listener
$GRID_HOME/bin/srvctl status scan
- 同步 SCAN VIP 数量
以具备集群管理权限的用户执行;Linux/UNIX 环境建议使用 root 并显式调用 Grid Home 下的 srvctl:
$GRID_HOME/bin/srvctl modify scan -n "$SCAN_NAME"
该命令会根据 SCAN 名称当前解析出的 IP 数量调整 SCAN VIP 资源。
- 同步 SCAN Listener 数量
$GRID_HOME/bin/srvctl modify scan_listener -u
-u 的作用是使 SCAN Listener 资源数量与当前 SCAN VIP 数量保持一致。它可以自动增加或删除相应的 SCAN Listener 资源。Oracle 11.2 modify scan_listener 说明
- 按依赖顺序启动资源
先启动 SCAN VIP,再启动 SCAN Listener:
$GRID_HOME/bin/srvctl start scan
$GRID_HOME/bin/srvctl start scan_listener
备用方案:删除并重新创建资源
如果 modify 命令执行失败、资源配置明显异常,或者 OCR 中存在无法通过 modify 清理的残留资源,可以删除全部 SCAN Listener 和 SCAN VIP,然后重新创建。
下面的删除命令操作的是全部 SCAN Listener 或全部 SCAN VIP,并不是只删除某一个 LISTENER_SCANn。
- 停止现有资源
以 grid 用户执行:
$GRID_HOME/bin/srvctl stop scan_listener
$GRID_HOME/bin/srvctl stop scan
检查状态:
$GRID_HOME/bin/srvctl status scan_listener
$GRID_HOME/bin/srvctl status scan
- 删除全部 SCAN Listener 资源
以 root 用户执行:
$GRID_HOME/bin/srvctl remove scan_listener
资源已经正常停止时,优先不使用 -f。
只有确认资源状态、OCR 备份和删除范围均无误,且普通删除失败时,才考虑强制删除:
$GRID_HOME/bin/srvctl remove scan_listener -f
- 删除全部 SCAN VIP 资源
$GRID_HOME/bin/srvctl remove scan
如确有必要,再使用:
$GRID_HOME/bin/srvctl remove scan -f
-f 会绕过部分依赖或运行状态检查,使用不当可能产生需要手工清理的残留资源,因此不建议把它作为默认参数。
- 重新添加 SCAN VIP
默认公网网络:
$GRID_HOME/bin/srvctl add scan -n "$SCAN_NAME"
只有确认 SCAN 位于编号为 2 的非默认网络时,才使用:
$GRID_HOME/bin/srvctl add scan -n "$SCAN_NAME" -k 2
如果 /etc/hosts 中该 SCAN 名称只解析到一个 IP,此时应只创建一个 SCAN VIP 资源。
- 重新添加 SCAN Listener
$GRID_HOME/bin/srvctl add scan_listener -p "$SCAN_PORT"
Oracle 11gR2 默认监听端口为 1521。如果使用默认端口,也可以不指定 -p:
$GRID_HOME/bin/srvctl add scan_listener
注意参数前必须有空格,正确写法是:
srvctl add scan_listener -p 1521
而不是:
srvctl add scan_listener-p 1521
新增的 SCAN Listener 数量会与当前 SCAN VIP 数量一致。Oracle 11.2 add scan_listener 说明
- 启动资源
切换至 grid 用户,按照依赖顺序启动:
$GRID_HOME/bin/srvctl start scan
$GRID_HOME/bin/srvctl start scan_listener
七、修改 REMOTE_LISTENER
只有以下情况需要修改数据库的 REMOTE_LISTENER:
SCAN 名称发生变化;
SCAN Listener 端口发生变化;
原来的参数配置错误。
如果只是将两个 SCAN IP 减少为一个,但 SCAN 名称和端口没有变化,则不需要修改。
查看当前配置:
SQL>show parameter remote_listener;
需要修改时,可在任意 RAC 实例以具有相应权限的用户执行:
ALTER SYSTEM SET remote_listener=
'rac-scan.example.com:1521'
SCOPE=BOTH SID='*';
不要把 REMOTE_LISTENER 设置成某一个固定的 SCAN IP。建议使用 SCAN名称:端口。
修改后可以等待实例自动注册,也可以分别在各实例执行:
ALTER SYSTEM REGISTER;
八、结果验证
- 检查 SCAN 配置
$GRID_HOME/bin/srvctl config scan
$GRID_HOME/bin/srvctl status scan -v
确认只存在一个 SCAN VIP,并且状态为 ONLINE。
- 检查 SCAN Listener
$GRID_HOME/bin/srvctl config scan_listener
$GRID_HOME/bin/srvctl status scan_listener -v
确认只存在一个 SCAN Listener,并且状态为 ONLINE。
- 检查集群资源
$GRID_HOME/bin/crsctl stat res -t
正常情况下,应看到类似资源:
ora.scan1.vip
ora.LISTENER_SCAN1.lsnr
不应再看到多余的:
ora.scan2.vip
ora.LISTENER_SCAN2.lsnr
- 检查 Listener 服务注册
先通过下面的命令确认实际 Listener 名称:
$GRID_HOME/bin/srvctl config scan_listener
然后检查服务注册:
$GRID_HOME/bin/lsnrctl status LISTENER_SCAN1
$GRID_HOME/bin/lsnrctl services LISTENER_SCAN1
确认数据库服务已经注册到新的 SCAN Listener。
- 客户端连接验证
从至少一台应用服务器测试:
getent ahostsv4 rac-scan.example.com
tnsping <服务名>
随后进行一次真实的数据库登录测试,确认:
SCAN 名称解析到正确 IP;
Listener 端口可访问;
数据库服务名注册正常;
应用能够正常新建连接。
九、常见问题
- 为什么不能只执行 srvctl remove scan_listener -f?
因为 Oracle 11gR2 的该命令会删除所有 SCAN Listener 资源,而不是只删除处于 OFFLINE 状态的那一个。
如果目标是让 Listener 数量与 SCAN VIP 数量一致,优先使用:
srvctl modify scan_listener -u
- 为什么删除 Listener 后仍然存在多余的 SCAN VIP?
SCAN Listener 与 SCAN VIP 是两类不同资源。只删除 Listener 不会自动删除对应的 SCAN VIP。
需要先调整 SCAN VIP 数量,再同步 Listener:
srvctl modify scan -n "$SCAN_NAME"
srvctl modify scan_listener -u
- 一个 SCAN IP 是否可以使用?
可以,但会失去多 SCAN VIP 带来的部分高可用和负载均衡能力。
Oracle 推荐通过 DNS 为一个 SCAN 名称配置三个 IP。如果受环境限制只能使用 /etc/hosts,则应确保所有集群节点和客户端都只解析到同一个有效 SCAN IP。
【总结】
本场景的推荐处理命令为:
确认所有节点只解析出一个 SCAN IP
getent ahostsv4 "$SCAN_NAME"
# grid 用户停止资源
$GRID_HOME/bin/srvctl stop scan_listener
$GRID_HOME/bin/srvctl stop scan
# 调整资源数量
$GRID_HOME/bin/srvctl modify scan -n "$SCAN_NAME"
$GRID_HOME/bin/srvctl modify scan_listener -u
# grid 用户按顺序启动
$GRID_HOME/bin/srvctl start scan
$GRID_HOME/bin/srvctl start scan_listener
# 验证
$GRID_HOME/bin/srvctl config scan
$GRID_HOME/bin/srvctl status scan
$GRID_HOME/bin/srvctl config scan_listener
$GRID_HOME/bin/srvctl status scan_listener
$GRID_HOME/bin/crsctl stat res -t
-the end-