lsnrctl status看不到实例或远程报ora-12514,说明静态注册缺失或配置错误;rac中必须由grid用户在$oracle_home/network/admin/listener.ora中为listener及listener_scan1等监听器精确配置sid_list_*段,确保sid_name、global_dbname(等于service_names值)、oracle_home三者与实际实例完全一致,并重启监听验证。
lsnrctl status 看不到实例注册?远程连接报 ora-12514: tns:listener does not currently know of service requested in connect descriptor?说明动态注册没生效,或监听压根没配静态注册——rac环境下远程维护(比如oem、dba从跳板机连)必须依赖静态注册,否则节点重启、crs资源漂移后服务就不可见。
静态注册必须写在 grid 用户的 listener.ora 里
Oracle 11g RAC 的监听由 grid 用户管理,所有监听配置文件都在 $ORACLE_HOME/network/admin/(注意是 grid 的 $ORACLE_HOME,通常是 Grid Infrastructure 路径,不是 oracle 用户的 DB HOME)。用 oracle 用户去改 listener.ora 是无效的。
- 确认路径:
su - grid; echo $ORACLE_HOME→ 一般是/u01/app/11.2.0/grid或类似 - 编辑文件:
vi $ORACLE_HOME/network/admin/listener.ora - 不要覆盖已有内容,只追加
SID_LIST_*段;已有的LISTENER、LISTENER_SCAN1等定义保留 - 若用
srvctl add listener创建了新监听(如LISTENER_EPM),静态注册段名必须严格匹配:即SID_LIST_LISTENER_EPM
SID_LIST 必须与实例名、全局库名、ORACLE_HOME 一一对应
静态注册的核心是 SID_DESC 三要素对齐:当前节点运行的实例名(SID_NAME)、数据库全局名(GLOBAL_DBNAME)、该实例实际使用的 ORACLE_HOME。错一个就注册失败。
-
SID_NAME= 当前节点上实际运行的实例名(查SELECT INSTANCE_NAME FROM V$INSTANCE;) -
GLOBAL_DBNAME= 数据库的服务名(SELECT VALUE FROM V$PARAMETER WHERE NAME = 'service_names';),不是 DB_NAME -
ORACLE_HOME= 该实例所属的 Oracle Home 路径(查SELECT VALUE FROM V$PARAMETER WHERE NAME = 'oracle_home';),注意 RAC 中每个实例可能指向不同 DB HOME - 示例(node1):
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = myrac) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = myrac1) ))
SCAN 监听器也要静态注册,否则 OEM 连不上
RAC 默认的 LISTENER_SCAN1 只做动态注册,OEM 访问时会尝试连 SCAN 地址,但若 SCAN 监听器没静态注册服务,就会返回 ORA-12514 ——这不是网络问题,是注册缺失。
- 在同一个
listener.ora文件中追加:SID_LIST_LISTENER_SCAN1 = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = myrac) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = myrac1) ) (SID_DESC = (GLOBAL_DBNAME = myrac) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = myrac2) ))
- 必须为每个节点的实例都写一条
SID_DESC,且SID_NAME对应各自节点实例名 - 改完后执行:
srvctl stop listener -n rac1; srvctl stop listener -n rac2; srvctl start listener -n rac1; srvctl start listener -n rac2(不能只 reload,要重启) - 验证:
lsnrctl status LISTENER_SCAN1输出里必须看到Service "myrac" has 2 instance(s)
防火墙和 hosts 解析是远程连不通的常见盲区
静态注册成功 ≠ 远程能连。很多 DBA 卡在最后一步:本地 tnsping 通,但跳板机死活连不上。
- 检查 VIP 和 SCAN IP 是否开放端口(不只是 1521,SCAN 监听默认也走 1521):
iptables -L -n | grep 1521或firewall-cmd --list-ports -
/etc/hosts必须包含所有 VIP、SCAN、节点私网地址,且不能有 DNS 冲突(尤其禁用search域导致解析成内网地址) - 远程客户端的
tnsnames.ora必须用 SCAN 名或 VIP,不能用 localhost 或 127.0.0.1 - 测试命令别用
sqlplus user/pwd@myrac,先用tnsping myrac看是否解析到 SCAN VIP,再用sqlplus /@myrac避免密码干扰
真正容易被忽略的是:静态注册段名必须和监听名完全一致(大小写敏感),且 GLOBAL_DBNAME 必须等于 service_names 参数值——不是 db_name,也不是 db_unique_name。哪怕多一个空格、少一个下划线,lsnrctl status 里都看不到服务。











