ORA-12514源于.NET连接字符串中SERVICE_NAME与监听器实际注册的服务名不匹配,必须通过lsnrctl status或v$parameter/v$services查实注册名并严格一致(含大小写、域名),禁用SID写法,必要时执行ALTER SYSTEM REGISTER或配置静态注册。

ORA-12514不是网络不通,也不是密码错,而是.NET发过去的服务名(SERVICE_NAME)监听器压根没在注册名单里——它“听到了”,但“不认识”。必须从服务端真实注册状态反推客户端该填什么,不能靠tnsnames.ora或印象去猜。
查数据库实际注册的SERVICE_NAME值
连接字符串里的SERVICE_NAME必须和数据库向监听器“自报家门”的名字完全一致(大小写、域名、下划线全算)。最可靠方式是直连数据库查:
- 用
sqlplus / as sysdba登录数据库服务器(或能直连的环境) - 执行:
SELECT value FROM v$parameter WHERE name = 'service_names';—— 若返回orcl.example.com,orcl,你就只能从中选一个完整填写,不能只写orcl - 如果是12c+多租户且连的是PDB,改用:
SELECT name FROM v$services WHERE network_name IS NOT NULL;,优先取network_name列值 - 若
service_names为空或NULL,说明数据库fallback到db_name + db_domain,需查v$database确认两者拼接结果
核对lsnrctl status输出的服务名列表
lsnrctl status的Services Summary区块才是监听器“当前认识谁”的唯一真相。你在.NET连接字符串里写的SERVICE_NAME必须和这里双引号内的字符串逐字符匹配:
- 在数据库服务器上运行
lsnrctl status,找类似Service "orcl.example.com"这样的条目 - 如果输出里是
"ORCL.EXAMPLE.COM",而你.NET里写orcl.example.com(小写),照样报ORA-12514 - 如果根本没列出你的服务名,说明注册失败,跳到下一节处理
- Windows环境下注意:若
Listening Endpoints Summary中HOST显示localhost,远程.NET应用请求会被静默拒绝,哪怕服务名对
检查.NET连接字符串是否混用SID与SERVICE_NAME
Oracle.ManagedDataAccess等.NET驱动对格式极其敏感,尤其在12c+环境,把旧版SID写法硬套上去必然失败:
- 错误写法(SID风格,已淘汰):
Data Source=(DESCRIPTION=(ADDRESS=...)(CONNECT_DATA=(SID=orcl))) - 正确写法(SERVICE_NAME风格):
Data Source=(DESCRIPTION=(ADDRESS=...)(CONNECT_DATA=(SERVICE_NAME=orcl.example.com))) - Easy Connect语法也必须用SERVICE_NAME:
myserver:1521/orcl.example.com,不能写myserver:1521/orcl - 若用tnsnames.ora别名,确保该别名下
SERVICE_NAME字段值和lsnrctl status输出完全一致
强制重注册或补静态注册
动态注册可能因PMON异常、启动延迟或防火墙拦截而失效。临时救急或长期兜底都得动手干预:
- 登录数据库执行:
ALTER SYSTEM REGISTER;,强制触发一次注册,然后立刻跑lsnrctl services验证是否出现 - 若仍不出现,检查
local_listener参数是否指向正确的监听地址:SHOW PARAMETER local_listener - 编辑
$ORACLE_HOME/network/admin/listener.ora,添加静态注册块(注意不要删掉PLSExtProc):SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl.example.com) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = orcl) ) ) - 改完必须执行
lsnrctl reload或lsnrctl stop && lsnrctl start,否则配置不生效
最容易被忽略的是大小写和域名——orcl和ORCL在Linux监听器眼里是两个服务;orcl和orcl.localdomain即使在同一台机器上也不互通。别信客户端配置,一切以lsnrctl services输出为准。


















