ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三张配置文件讲透Oracle连接:从ORA-12514到监听器排查全攻略

三张配置文件讲透Oracle连接:从ORA-12514到监听器排查全攻略 干Oracle的几乎没人没被PL/SQL Developer的报错弹窗折磨过。ORA-12514、No listener、ORA-28547、ORA-12154……每天在技术群里看到的连接问题少说几十条。这些问题看着五花八门绕来绕去其实都离不开三个配置文件tnsnames.ora、listener.ora、sqlnet.ora。很多人装好数据库后被网上教程指挥着改了这三个文件却始终没搞明白它们各自管什么、为什么这么改、改了为什么还连不上。这篇文章我尽量把它讲透从请求发出到建立连接把每个文件在链条里的角色说清楚再附上我自己排查连接问题时的一套操作顺序希望能帮你少走点弯路。这篇内容适合这么几类人看刚入门Oracle、被各种监听报错搞得想摔键盘的新手在Windows或Linux上部署过Oracle、但一直靠复制粘贴配置文件的半熟手以及需要频繁在多个环境之间切换、想把连接配置管理得更清爽的运维和开发。我会尽量用大白话讲原理但涉及关键参数的代码块和表格也会给足方便你直接拿来对照。1. 三个配置文件的分工一次连接请求的前半生1.1 一个典型的连接失败现场先还原一个我见过无数次的场景。新同事在测试库上装好Oracle 11gPL/SQL Developer登录框里填了用户名、密码数据库一栏输入orcl点登录结果弹出来ORA-12514: TNS:listener does not currently know of service requested in connect descriptor他第一反应是问这个orcl是不是不对但实际上orcl只是客户端这边的一个别名真正决定能不能连上的是一整套链路的协同。如果没人告诉他链路是怎么回事他大概率会去改tnsnames.ora把orcl改成库的全局数据库名再登一次。要么还是报12514要么变成ORA-12154——连别名都解析不出来了。这类问题的根源就是我们把连接数据库想得太简单了。一条连接要建立客户端至少得知道三件事数据库在哪台机器上、哪个端口有监听在门口候着、你要连的具体是哪个服务。这三个信息分别由tnsnames.ora、listener.ora和Oracle实例本身的注册信息共同回答。而sqlnet.ora又像是个项目经理负责规定我用什么方式找人、找不到人时记不记日志、要不要设时限。1.2 连接请求发出的路线我习惯把一次Oracle连接比作到一个小区找人。你在客户端填好用户名密码和数据库别名后sqlnet.ora会先决定我通过什么目录来查这个人比如先查tnsnames.ora还是直接按IP:端口/服务名这种方式找人。查tnsnames.ora这一步就是拿着你填的别名去文件里找对应的那一段地址簿记录。找到以后它里面写着你要去的小区地址——HOST、PORT、SERVICE_NAME。客户端拿着地址跑到小区门口发现门口有个门卫就是listener监听进程。门卫手头有一份楼栋服务清单记录着小区里现在哪些楼栋数据库服务是开放的、对应哪把钥匙。如果你要连的SERVICE_NAME在这份清单里门卫就放行引导你找到目标数据库连接建立。如果不在就给你一句这个服务我不认识也就是ORA-12514。后面的listener.ora管的是门卫自己门卫在哪个门口站岗、监控哪几个门、手头预置了哪些楼栋的服务信息。而sqlnet.ora更像是小区物业的管理规定什么时间段允许找人、找回时要不要留来访记录、优先看哪本地址簿。理解了这条路线再看配置文件的每一行就都不算死记硬背了。2. tnsnames.ora客户端口中的数据库地址簿2.1 tnsnames.ora 的完整语法逐项拆解tnsnames.ora默认位于$ORACLE_HOME/network/admin下Windows上则是%ORACLE_HOME%\network\admin。它存在的原因很简单Oracle服务名是一长串字符比如orcl.example.com没人愿意每次连接都敲这么长一串于是给它起了个短别名orcl这个别名和实际地址的对应关系就写在tnsnames里。一个最常见的条目是ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )逐行说ORCL这是连接别名你在PL/SQL Developer里看到的数据库那一栏填的就是它。注意这个别名是给客户端认的跟数据库内部的实例名、服务名没有天然绑定关系你完全可以给服务名起个别名叫TEST_DB。(ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521))这部分告诉客户端去哪个地址敲门。HOST填IP还是主机名都可以但如果填了主机名客户端就需要能解析这个名字。这里我强烈建议能填IP就填IP省去DNS和hosts解析出问题的一大堆麻烦。PORT默认1521如果监听改了端口这里必须跟着改。(SERVER DEDICATED)可选表示每次连接都起一个专用服务进程。还有一种SHARED走共享服务器模式绝大多数场景用不上。不写这个参数默认走专用模式所以很多配置里干脆不写。(SERVICE_NAME orcl)这是最重要的字段它决定你到了监听门口报出的我要找谁。这个值必须和数据库实际注册到监听的服务名一致而不是随便写的。查看数据库当前服务名可以用show parameter service_names;SERVICE_NAME和SID是新手最容易混淆的地方。SID是一个实例的唯一标识比如orcl而SERVICE_NAME是服务名默认会取db_unique_name或者全局数据库名比如orcl.example.com。监听动态注册后如果你用SID去连接老的配置里常见(SID orcl)而现代Oracle更推荐(SERVICE_NAME orcl)。这里不需要死磕但你要知道tnsnames里写了什么监听里就得注册了什么两边对不上就是12514。2.2 多环境、多协议实际项目怎么写很多生产环境的tnsnames.ora都不止一个条目而是集成了开发库、测试库、生产库。我见过有人为了切换环境每天手动注释和取消注释既累又容易出事。实际上你完全可以用多个条目并存再用别名区分DEV_ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.11)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME dev_orcl)) ) UAT_ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.22)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME uat_orcl)) ) PROD_ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.33)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME prod_orcl)) )连接时直接在PL/SQL Developer的数据库栏填UAT_ORCL点登录就行不用来回改文件。有些环境还会要求走SSL或其他协议那ADDRESS部分会有更多参数比如(PROTOCOL TCPS)。日常场景TCP最常见这里不展开。还有一种情况需要特别提醒Windows平台上PL/SQL Developer是32位还是64位可能导致它读的tnsnames.ora不是你改的那个。很多机器上装了多个Oracle客户端或者有独立的instant clientPL/SQL Developer到底读哪个目录下的tnsnames可以通过它帮助-关于里的TNS File路径看到。要是你改了文件但连不上、报12154先看一眼有没有找对文件这个坑我见得太多了。3. listener.ora数据库这扇门的门卫系统3.1 一个最小可用的 listener.ora 长什么样listener.ora在数据库服务器上同样在$ORACLE_HOME/network/admin下。它管理的是监听进程本身的配置。下面是一个最简可用的例子LISTENER (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) )这一段的意思是监听进程叫LISTENER监听在192.168.1.100:1521。注意HOST这里如果你填的是服务器主机名那这个主机名必须在服务器的hosts文件里能解析到本机IP。Windows上常见的问题是安装时系统自动填了主机名后来主机名改了监听就起不来了报TNS-01150或者TNS-12545。我处理过好几台机器都是把这里的HOST改成IP地址问题立刻解决。光有上面这段监听可以启动但能不能正确找到数据库服务还要看数据库那边是否把服务注册过来。这里就引出了SID_LIST_LISTENER这个静态配置段SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DBNAME orcl) (ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME orcl) ) )SID_LIST_LISTENER的作用是强制告诉监听我这里有一个叫orcl的服务如果有人来找你就放行。它跟后面的动态注册是两条路线很多时候你不用配这一段也能连上因为数据库PMON进程会自动把服务名注册到监听。但如果你想严格控制服务列表、或者需要支持远程启动数据库、或者动态注册因为某种原因失败了那静态配置就很有用。3.2 动态注册 vs 静态注册为什么监听不认识服务这是区分新手和老手的一个关键概念。动态注册是Oracle比较智能的地方实例启动后PMON后台进程每隔60秒左右会尝试把实例的SERVICE_NAME、SID等信息自动注册到本机1521端口的监听上。你不需要手动改listener.ora。如果数据库实例已经启动监听也正常但服务没注册上去通常就是动态注册还没触发。怎么手动触发动态注册可以在SQL*Plus里以sysdba身份执行alter system register;执行后一般几秒钟内监听就能看到服务了。用lsnrctl services命令可以查看当前监听认识的数据库服务lsnrctl services如果看到类似这样的输出说明服务已经注册Service orcl has 2 instance(s). Instance orcl, status READY, has 2 handler(s) for this service...静态注册则是你在listener.ora里写死服务信息监听一启动就知道有哪些服务。它的好处是不依赖动态注册机制即使实例还没起来监听也知道有orcl这个服务但实例没起连接依然会失败。很多教程为了让连接更稳直接贴一段静态注册配置导致很多人误以为必须配SID_LIST才能连接其实不一定。那什么时候必须用静态注册老式Oracle版本上没有动态注册、需要通过远程startup启动数据库、或者服务名比较特殊注册不上来时静态注册是兜底方案。对大多数场景我建议动态注册为主静态注册作为排查和兜底不要两个都配得乱七八糟。3.3 改完 listener.ora 起不来的三个高频原因改了listener.ora之后通常需要重启监听才生效lsnrctl stop lsnrctl start但这个过程中有不少坑我遇到过的典型原因有三个。第一个语法多了一个括号。listener.ora是括号套括号的文件一旦括号不匹配监听完全起不来看日志只能看到一堆TNS-01189之类的错。我的建议是改完文件之后用lsnrctl start先试一下不要直接重启数据库一旦报错立刻看$ORACLE_HOME/network/log/listener.log最下面的几行。第二个主机名解析失败。前面提到如果HOST填的是主机名而服务器的hosts文件里没有对应条目监听会起不来。在Linux上可以用hostname命令看当前主机名确认hosts文件里有没有把主机名映射到本机IP。我习惯直接改成IP一了百了。第三个端口被占用。LISTENER默认端口1521如果服务器上已经跑了一个监听或者另一个进程把1521占了启动时会报地址冲突。可以用netstat -ano | findstr 1521Windows或者netstat -anp | grep 1521Linux查一下。若是多实例环境多个库共用同一个监听没问题但别在同一个主机上启动两个抢同一端口的LISTENER配置。还有一个特殊情况修改listener.ora之后动态注册的服务名可能不会立刻出现在新监听里。因为你停掉的瞬间旧监听上注册的信息也没了新的监听要等PMON下一轮注册周期。你可以用alter system register;手动踢一脚别干等着。4. sqlnet.ora不显眼但有话语权的规则文件4.1 sqlnet.ora 里最常见的几个参数相比前两个文件sqlnet.ora经常被忽略但很多连接毛病的根子其实在它身上。它的位置同样在network/admin下客户端、服务端各有一个。最常见的参数有这么几个SQLNET.AUTHENTICATION_SERVICESWindows上经常设成(NONE)或(NTS)这个参数控制操作系统身份认证方式。生产环境Linux上很多人设(NONE)防止操作系统用户直接以sysdba身份登录数据库。如果你在Windows上用sys账号登录一直失败很可能就是这个参数的问题。NAMES.DIRECTORY_PATH控制客户端解析连接标识符时按什么顺序去查找。比如NAMES.DIRECTORY_PATH (TNSNAMES, EZCONNECT)意思是先在tnsnames.ora里找别名找不到再用host:port/service_name这种简易写法。有人图省事只写了(EZCONNECT)结果填别名时报12154。这个参数很值得检查。SQLNET.INBOUND_CONNECT_TIMEOUT服务端允许客户端完成认证的最大等待时间。默认可能是60秒如果设得太短客户端一慢就被掐断报错ORA-12547之类的网络超时。调试时可以适当调大。SQLNET.RECV_TIMEOUT和SQLNET.SEND_TIMEOUT客户端和服务端收发数据的超时时间长连接容易遇到的断连问题有时候和它有关。4.2 客户端和服务端 sqlnet.ora 的区别一个常见的误区是以为sqlnet.ora只在客户端生效。其实sqlnet.ora对客户端和服务端都有效但作用面不同。客户端的sqlnet.ora决定了解析顺序、一些客户端超时参数。比如你填了一个不分段的连接串客户端会先看NAMES.DIRECTORY_PATH决定是去tnsnames里找还是当作host:port直接解析。如果这里配了(LDAP)而LDAP又不可用解析速度会被拖慢甚至超时。服务端的sqlnet.ora则更多影响网络层审核、访问控制、审计和日志目录。例如你可以在服务端sqlnet.ora里配TCP.VALIDNODE_CHECKING YES TCP.INVITED_NODES (127.0.0.1, 192.168.1.0) TCP.EXCLUDED_NODES (192.168.2.100)这段配置是数据库服务器层面的一个简单IP黑名单/白名单。它不替代防火墙但多一层防护总没坏处。我之前在测试环境靠它临时拦住了一个出问题的客户端IP比等防火墙工单快多了。另外服务端的sqlnet.ora里还有一个SQLNET.ORA目录相关参数——ADR_BASE、DIAG_ADR_ENABLED等控制诊断日志目录。新版本Oracle默认把日志写进ADRAutomatic Diagnostic Repository目录如果指定了旧的BACKGROUND_DUMP_DEST方式可能和新机制冲突。这部分如果没事别随便改。4.3 用 sqlnet.ora 开诊断排错不再盲人摸象连接出问题的时候最难受的是不知道客户端和服务端之间到底发生了什么。sqlnet.ora正好提供了一套诊断开关。在客户端sqlnet.ora里加上TRACE_LEVEL_CLIENT SUPPORT TRACE_FILE_CLIENT sqlnet_client TRACE_DIRECTORY_CLIENT D:\oracle\network\trace然后重新执行一次连接客户端就会把每次网络交互的细节写进跟踪文件。打开文件你能看到客户端试图用哪个地址、发什么包、收到了什么错误。对于为什么连不上为什么超时这类问题这份日志的信息量远超报错弹窗。服务端也有对应的TRACE_LEVEL_SERVER SUPPORT TRACE_FILE_SERVER sqlnet_server TRACE_DIRECTORY_SERVER /u01/app/oracle/network/trace但要注意TRACE_LEVEL设成SUPPORT会产生非常大的文件生产环境别长期开着排查完记得调回OFF或删掉文件否则磁盘被日志塞满反而引发新故障。我印象很深的一次排查某现场客户端连测试库时快时慢慢的时候要等两分钟才报ORA-12170。用客户端trace一看发现客户端解析别名时先尝试LDAP等超时之后才回落到TNSNAMES。查sqlnet.ora里的NAMES.DIRECTORY_PATH果然是(LDAP, TNSNAMES)。改成(TNSNAMES, EZCONNECT)之后连接立刻秒开。这类问题完全靠经验猜猜一天未必有结果但开着trace看日志一分钟就定位了。5. 典型连接报错的完整排查链路5.1 ORA-12514服务不在监听名单里这是Oracle连接报错的榜一选手报错全文一般是ORA-12514: TNS:listener does not currently know of service requested in connect descriptor这句翻译成大白话就是监听是活的你也找对门了但门卫说没有你要找的那个服务。完整排查链路我从底层往上走每一步都能排除一类原因。第一步先确认你要连的服务名是什么。到数据库服务器上执行lsnrctl services看输出里有没有你tnsnames.ora里写的那一串SERVICE_NAME。如果里面有orcl那就是客户端和服务端两头没对齐去检查tnsnames.ora里的SERVICE_NAME和HOST、PORT有没有写错。如果里面压根没有orcl说明服务没有注册到监听进入第二步。第二步如果是Linux/Unix环境确认实例是不是真的起来了。有时候数据库服务器重启了实例没跟着起来监听还在但你连接时依然会报12514。用ps -ef | grep smon看一眼进程是否存在或者SQL*Plus本地登录执行select instance_name, status from v$instance;。第三步实例是活的但服务没注册。在SQL*Plus里执行alter system register;再执行lsnrctl services看看有没有。如果还是没有检查数据库service_names参数和监听日志看注册过程中有没有报错。还有一种情况实例用的是非默认监听端口动态注册默认只找1521所以你启动的监听如果落在非1521端口实例默认不会自己找上门。此时需要在数据库端设置local_listener参数指向你的监听地址比如alter system set local_listener(ADDRESS(PROTOCOLTCP)(HOST192.168.1.100)(PORT1522)) sidorcl;这个坑很多做多端口监听的人踩过我在这里摔过一次之后现在每次配非标准端口都会先查local_listener。最后一步如果一切正常但还报12514考虑加静态注册兜底在listener.ora里配置SID_LIST_LISTENER重启监听再用lsnrctl services验证。5.2 ORA-12541 / No listener门卫根本不在岗报错ORA-12541: TNS:no listener或No listener说明客户端能解析地址也发出了请求但对应IP和端口上没有任何监听进程。排查顺序如下第一确认监听进程是否在运行。在数据库服务器上执行lsnrctl status如果返回TNS-12541说明监听没起来。先看一下listener.log找原因再启动lsnrctl start第二如果lsnrctl status正常但客户端还是报no listener那就是客户端连的地址不对。检查tnsnames.ora里的HOST是不是填错了IPPORT是不是写成了别的端口。最常见的场景是数据库服务器装了多个实例或者有人把监听端口改成了1522但客户端还守着1521。也可以直接在客户端用tnsping命令tnsping ORCLtnsping返回的内容会明确告诉你客户端解析出的IP和端口是什么。比如返回Attempting to contact (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.33)(PORT 1521)))你就能一眼看出哪一段不对。第三如果地址没错、端口也通但客户端在另一台机器上检查服务器防火墙。Windows防火墙、Linux iptables/firewalld都可能挡掉1521端口。我最长一次排查就是各种配置对了一遍最后发现新机器firewalld没有放行1521/tcp。5.3 ORA-12154客户端找不到 tnsnames 文件报错ORA-12154: TNS:could not resolve the connect identifier specified意思是客户端在tnsnames.ora里找不到ORCL这个别名或者干脆连tnsnames文件都没找到。排查顺序第一步确认PL/SQL Developer到底读的是哪个tnsnames.ora。打开PL/SQL Developer菜单栏帮助 - 关于看TNS File那一项显示的文件路径。它不一定是$ORACLE_HOME\network\admin里的那份。很多电脑上装了多个Oracle客户端环境变量TNS_ADMIN指向哪它就找哪。第二步用你确认的那个路径打开tnsnames文件看里面有没有你要填的别名。注意别拿错了有人改了D:\oracle\product\11.2.0\dbhome_1\network\admin\tnsnames.ora但PL/SQL Developer读的是D:\instantclient_12_2\network\admin\tnsnames.ora白改。第三步检查sqlnet.ora的NAMES.DIRECTORY_PATH。如果配置里没有TNSNAMES这一项客户端就不会去tnsnames文件里找别名自然报12154。第四步如果文件路径都对、别名也在可能是文件编码或括号格式问题。Windows上我用记事本改过tnsnames之后偶发乱码尽量用带UTF-8或ANSI识别能力的编辑器比如Notepad或VS Code保存时注意编码别改成UTF-8 BOM某些老版本Oracle客户端对BOM兼容不好。5.4 ORA-28547Net 管理文件路径对不上报错ORA-28547: connection to server failed, probable Oracle Net admin error这个是连接外部过程或异构服务时常见的问题通常在配置了Oracle异种服务、透明网关时碰到。它的关键字是Oracle Net admin error说明客户端或服务端的sqlnet.ora、tnsnames.ora、listener.ora组合出了问题典型的是遇到了不兼容的Oracle Net版本。遇到28547我会先做两件事。第一检查客户端和服务器端Oracle Net版本是否一致特别是用instant client连接老版本数据库时版本差太大会导致协议协商失败。第二检查监听日志看它实际收到的连接请求是什么样子有没有报协议适配器的错误。还有一个常被忽略的地方Oracle Net的sqlnet.ora里如果配置了非默认的TRACE_DIRECTORY_CLIENT或TRACE_FILE_CLIENT并且目录不存在也可能导致连接异常。但这类问题比较小众如果以上查完没结果建议先去MOS搜一下28547的已知问题大概率是版本bug。5.5 PL/SQL Developer 自身的连接习惯坑PL/SQL Developer作为客户端工具也有一些坑值得单独说。第一数据库栏填写方式。PL/SQL Developer登录框的数据库一栏可以填tnsnames别名也可以直接填host:port/service_name这种Easy Connect格式。很多人不知道这一点以为只能填别名导致tnsnames.ora出问题时无从下手。实际上如果临时要连某个库直接填192.168.1.100:1521/orcl就能跳过tnsnames解析。这个技巧可以用来区分问题出在配置还是网络链路。第二32位 vs 64位。老版本PL/SQL Developer是32位的如果机器上装的是64位Oracle客户端两者不兼容会出现PL/SQL Developer闪电消失这种诡异问题。这种情况下要么换64位版本要么给PL/SQL Developer配一个32位的instant client。别管网上怎么传本质就是位数不匹配。第三连接模式选择。PL/SQL Developer的登录界面可以选择Normal、Sysdba、Sysoper。如果连接普通用户失败但用sysdba能成通常是账号权限问题不是网络配置问题别在三个配置文件上浪费时间。6. 一份可以直接抄的配置实践和检查清单6.1 三件套的标准配置模板我把一套我自己常用的最小干净配置写在这里按照实际环境替换主机名、IP、端口、服务名即可。客户端tnsnames.oraORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )服务器端listener.ora最小配置动态注册为主LISTENER (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) ) ADR_BASE_LISTENER /u01/app/oracle客户端和服务端sqlnet.ora# 客户端解析顺序按需调整 NAMES.DIRECTORY_PATH (TNSNAMES, EZCONNECT) # 服务端如果开了操作系统认证可按平台设置 SQLNET.AUTHENTICATION_SERVICES (NONE) # 连接超时防止客户端一条SQL卡死 SQLNET.INBOUND_CONNECT_TIMEOUT 60 SQLNET.RECV_TIMEOUT 60 SQLNET.SEND_TIMEOUT 60注意sqlnet.ora在不同版本的默认参数差异很大不要硬抄。加参数前先确认你的版本支持比如某些老版本根本不认识SQLNET.RECV_TIMEOUT。6.2 我踩过几次之后养成的检查顺序连接报错时我现在的第一反应不是改文件而是按顺序做以下几件事基本能覆盖九成问题步骤操作作用1tnsping 别名确认客户端解析出的地址和服务名2lsnrctl status确认监听进程是否存活、端口是否正常3lsnrctl services确认目标服务是否已注册到监听4telnet IP 1521确认服务器端口是否可达、防火墙有没有拦5查看PL/SQL Developer的TNS File路径确认客户端到底读的哪份tnsnames6查看listener.log最后几十行看监听实际收到了什么请求、报了哪个错这个顺序可以避免很多重复劳动。比如一上来就去改listener.ora重启监听结果真正的坑是防火墙没放行那纯属浪费时间。有一点要提醒tnsping通了只代表网络和监听是通的不代表SERVICE_NAME一定正确。tnsping只验证地址可达性不会去核对服务是否存在。所以lsnrctl services那一步不能省。6.3 几个没必要踩的坑最后分享几个局部经验。第一尽量不要在生产环境反复重启监听。很多人改一个参数就lsnrctl stop/start连接瞬间全断。大部分配置尤其是listener.ora的很多改动用lsnrctl reload也能生效不会中断现有连接。区别在于reload不能处理所有的字段变更有些必须重启但至少先试试reload不行再停。第二tnsnames文件每行缩进不重要但括号匹配很重要。我遇到过一次文件看起来完全正常就是报12154最后发现是结尾多了一个右括号。这种错误光用眼睛看很难发现可以用一个小技巧把文件内容复制到支持括号匹配的编辑器里光标到末尾看括号是否闭合。第三不要随意拷贝别人机器上的listener.ora。很多配置里写死了别人的机器名、路径、SID_LIST直接拷过来会引起一连串问题。正确做法是按模板重写一份只保留当前环境需要的项。第四改了配置文件一定要分清楚是客户端还是服务端。tnsnames.ora主要是客户端用listener.ora是服务端用sqlnet.ora两边都有。有人在服务器上改了tnsnames然后发现没用正常因为服务端做监听和动态注册根本不查这个文件。回到开头那些报错——ORA-12514也好、No listener也好、ORA-28547也好它们虽然长得很吓人但背后逻辑始终是地址、端口、服务名、权限、协议这几件事。把三个配置文件的分工搞清楚把lsnrctl services、tnsping、listener.log这几个工具用熟连接问题就再也不是玄学。我个人的建议是不要等到报错才去翻配置装好环境后主动把三个文件打开看一眼对照本文的模板确认每一项的含义再模拟一次客户端连接。花十分钟做这件事省下来的是以后无数个焦头烂额的下午。
返回列表