拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Oracle连接配置三剑客:tnsnames.ora、listener.ora与sqlnet.ora深度解析

先说个大多数人肯定经历过的场景接手一台新电脑或者公司数据库迁移了IP你打开PL/SQL Developer输入用户名密码回车结果弹出ORA-12514或者监听器拒绝连接。这个时候群里问了一圈有人让你改tnsnames.ora有人让你看监听还有人告诉你装一个Oracle Client再说。其实问题通常就出在三份配置文件上tnsnames.ora、listener.ora、sqlnet.ora。这篇内容就是专门把这三份文件讲透的适合刚接触Oracle的开发人员、初级DBA也适合那些被配置折磨过但一直没时间系统梳理的老同学。看完你至少能自己搞定90%以上的连接问题知道每份文件是干嘛的、怎么改、改完怎么验证而不是靠瞎试。1. 先把三份文件的职责分清楚tnsnames、listener、sqlnet各管哪一段很多教程上来就让你改这改那但从来不解释“为什么”。结果就是这次照着配好了下次换个环境还是抓瞎。所以我建议先别急着改文件花几分钟把Oracle的连接模型搞清楚后面所有操作都是顺理成章的事。1.1 用生活化类比理解三份配置我经常给新人打一个比方把Oracle数据库比作一栋写字楼。listener.ora就是写字楼一楼的接待前台。别人要进楼办事首先得找得到这个前台知道它在哪一栋、几号门、几点上班。tnsnames.ora是访客手机里的通讯录。它记录着“你要去的公司叫什么名字、地址是什么、走哪个门进”。你只需要跟司机说去“某某公司”通讯录自动翻译成具体地址。sqlnet.ora则是访客那边的总规则手册。它决定你了你查通讯录的顺序、要不要验证身份、连接空闲多久会被请出去这些底层规则。对应到技术层面listener.ora是服务端数据库所在机器的配置负责真正接收网络连接请求。tnsnames.ora是客户端的配置负责把“连接名”比如ORCL翻译成IP、端口、服务名。sqlnet.ora两边都可以有客户端和服务端各有一份分别控制各自进程的网络行为。搞清楚这个角色划分之后很多报错就好定位了。比如ORA-12541说“no listener”那是前台的电话打不通ORA-12514说listener does not currently know of service说明前台是有的但前台不认你报出的公司名字ORA-12154说无法解析连接标识符那是通讯录里根本没存这个名字。1.2 一次完整连接请求的旅程为了让你印象更深我把一次从PL/SQL Developer点击登录按钮到真正进入数据库的完整路径走一遍PL/SQL Developer从登录框拿到连接名比如ORCL去tnsnames.ora里找有没有ORCL这个别名。找到了读取里面的HOSTIP地址、PORT端口号、SERVICE_NAME服务名。客户端通过网络向目标IP:port发起TCP连接请求。服务端的listener.ora决定了监听进程是否在这个端口上等待请求。如果监听没启动或者端口不对直接连接失败。请求到达监听后监听根据连接串里的SERVICE_NAME或SID去查自己有没有这个服务的注册信息。查不到就报ORA-12514。查到之后监听把连接转交给数据库实例后续的认证、SQL执行就都由数据库自己处理了。整个过程还受到sqlnet.ora的影响比如名字解析方式、认证方式、超时时间等。1.3 配置文件到底放在哪里这一点看着简单但实际开发中太多人栽跟头。最经典的是改了tnsnames.ora但没生效结果发现改的是另一份。Windows下如果安装了完整Oracle客户端比如Oracle 11g Client路径一般是%ORACLE_HOME%\network\admin\tnsnames.oraLinux/Unix下路径是$ORACLE_HOME/network/admin/tnsnames.ora但如果设置了TNS_ADMIN环境变量那么三份文件都会优先从$TNS_ADMIN目录下读取。这个变量在排查时一定要先查。PL/SQL Developer比较特殊它本身不是一个Oracle客户端它只是外挂了一个Oracle客户端库OCI来连接数据库。所以它能不能连上实际上取决于它在首选项里指定的OCI库是哪一份客户端。很多“PL/SQL Developer闪电消失”的问题根源就是OCI库路径不对或位数不匹配后面我会专门说。2. tnsnames.ora逐个字段拆解别再照抄网上的模板tnsnames.ora是开发人员最常接触的文件。里面一般是一段一段的“连接别名”每个别名对应一个数据库目标。网上的模板五花八门但如果不懂字段含义出了问题根本不知道从哪看起。2.1 一个标准配置的逐行解读贴一个最典型的配置我逐行拆开讲ORCL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.15)(PORT 1521)) ) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )第一行的ORCL是连接别名也就是你在PL/SQL Developer登录界面的Database下拉框里看到的名字。这个名字完全自定义可以叫PROD_DB、DEV_112、RAC_NODE随便起只要和tnsnames.ora里保持一致即可。PROTOCOL TCP表示走TCP/IP协议绝大多数场景都不用动。HOST就是数据库服务器的IP地址或主机名。PORT是监听端口Oracle默认1521但很多公司为了安全会改掉比如1522、1526都有。这个端口必须和listener.ora里实际监听的端口一致。CONNECT_DATA这一段才是决定“连到哪个库”的关键SERVER DEDICATED表示专用服务器模式即每次连接分配独立进程。一般开发环境都这么写。SERVICE_NAME orcl是服务名。注意这里既可以写SERVICE_NAME也可以写SID。后者是老的写法12c以后更推荐使用服务名。服务名和SID的关系我下面单独讲。2.2 一个配置里可以写多个地址如果数据库做了双机热备或者RACtnsnames.ora里可以写多个ADDRESS。平时很多人在这个配置上栽跟头——明明数据库有两个节点却只写了一个地址结果节点切换后连不上。ORCL_RAC (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.10)(PORT 1521)) (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.11)(PORT 1521)) (LOAD_BALANCE ON) (FAILOVER ON) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )这里面LOAD_BALANCE ON表示两个地址轮流分发连接FAILOVER ON表示第一个地址连不上时自动尝试第二个。这两个参数在单机环境下没什么用但在RAC环境下是重点。2.3 SID、SERVICE_NAME、GLOBAL_DBNAME到底啥关系这是新手最容易混淆的一组概念。SIDSystem Identifier是实例的唯一标识对应一个内存和进程集合。单机环境一个数据库通常只有一个实例。SERVICE_NAME是数据库对外提供的服务名可以多个。它和SID可以同名也可以不同。GLOBAL_DBNAME通常就是service_name在静态注册时会用到。用大白话说SID是数据库进程自己的“身份证名字”SERVICE_NAME是贴在门口告诉别人“我是谁”的服务牌。连接的时候Oracle官方推荐用SERVICE_NAME它对RAC和多实例场景更友好。碰到老库可能看到有人把配置写成(SID ORCL)而不是(SERVICE_NAME orcl)。两者都能连但前提是监听里要有对应的注册信息。如果你连的是PDB12c以后的插接式数据库SID这种写法就基本行不通了必须用SERVICE_NAME。2.4 改完配置不生效的典型原因很多人改了tnsnames.ora保存关掉重开PL/SQL Developer发现还是连不上旧库甚至下拉框里根本没出现新写的名字。这时候按顺序检查三件事改的是不是PL/SQL Developer实际读取的那份文件。在登录界面点击连接名旁边的省略号或者看“工具→首选项→连接”里显示的配置目录。文件里是不是有隐藏字符或全角符号。中文输入法偶尔会把冒号、等号、括号变成全角Oracle解析直接失败。别名是否有重复。如果文件里前前后后写了两个ORCL解析时往往取第一个不是你想改的那个。我自己的习惯是每次改完tnsnames.ora先在命令行用tnsping ORCL验证一下再打开PL/SQL Developer去连。后面会有详细介绍tnsping怎么用。3. listener.ora是从服务端“往外发牌”配置要点和常见坑listener.ora位于数据库服务器上它决定监听进程监听哪个端口、哪些服务可以被静态注册。这块通常由DBA管但开发人员因为要自查问题也应该能看懂。3.1 监听配置文件长什么样标准的Windows环境下一份典型listener.ora是这样的LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.15)(PORT 1521)) (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) ) ) SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DBNAME orcl) (ORACLE_HOME D:\app\oracle\product\11.2.0\dbhome_1) (SID_NAME ORCL) ) )第一段定义了监听器名字默认LISTENER以及它监听哪些地址和端口。如果这里的HOST写成了具体IP但服务器改了IP监听就起不来写成主机名有时DNS解析出问题也起不来。最稳妥的是写0.0.0.0或者实际IP但这取决于平台兼容性改之前要确认清楚。第二段SID_LIST_LISTENER是静态注册信息。也就是说即使数据库实例还没启动监听也知道有这么个服务不会一接到连接请求就报ORA-12514。数据库启动后会通过PMON进程把更多的服务信息动态注册到监听上。3.2 动态注册和静态注册的区别在11g以后的常规环境中数据库实例启动时会自动向本机1521端口的监听注册服务名这个过程叫动态注册。前提是监听在1521端口正常运行数据库参数LOCAL_LISTENER指向了合适的监听地址默认是(ADDRESS (PROTOCOL TCP)(HOST 主机名)(PORT 1521))。动态注册的好处是不用手动改listener.ora新加一个服务名只要数据库能启动监听自然就认。但坏处是数据库没启动时监听里查不到这个服务此时用PL/SQL Developer连接就会报ORA-12514。静态注册则是把服务名、SID、ORACLE_HOME提前写在listener.ora的SID_LIST里不管数据库是否启动监听都认这个名字。好处是稳定数据库宕机时至少能定位到监听级别的问题坏处是每次新增数据库都要手动改。我在实际运维中见过不少开发环境专门用静态注册来“伪装”服务比如一个SID_LIST里写了五个库但其中两个实例根本没起来。这种做法会导致连接请求白白打到监听上然后等待超时。所以能动态注册就优先动态注册静态注册只用于特殊场景。3.3 监听起不来的几个常见原因“Oracle监听服务无法启动”在Windows上特别常见我总结出下面几个高频原因端口被占用。1521端口被其它进程占用了启动监听时会报地址被占用。排查命令是netstat -ano | findstr 1521看看PID是不是Oracle进程。被占用的场景很多比如之前装了MySQL、Tomcat或者某些中间件抢了端口。listener.ora里HOST写错。如果HOST写了一个已经不存在的IP或主机名监听绑定地址失败服务会启动后立刻停止。TNS_ADMIN环境变量指向了错误目录。Windows服务启动时用的环境变量和你在命令行看到的不一定一致这个坑很阴。确认服务的启动参数和注册表里的ORACLE_HOME。权限问题。在Linux下如果监听端口小于1024需要root权限在Windows下如果Oracle服务账号没有本地管理员权限读写network/admin目录也会失败。排查listenr问题时最常用的命令就是lsnrctl status和lsnrctl services。前者看监听状态和端口后者看监听到底认哪些服务名这是解决ORA-12514的关键一步。4. sqlnet.ora常被忽略但它决定了连接行为的基本规则sqlnet.ora的存在感最低很多人从头到尾没打开过它。但它实际上是连接行为的“总规则手册”决定了名字解析方式、认证方式、超时时间、日志输出级别等。如果它配置错了连接失败的方式会非常诡异。4.1 客户端sqlnet.ora的实用参数一份常见的客户端sqlnet.ora长这样SQLNET.AUTHENTICATION_SERVICES (NTS) NAMES.DIRECTORY_PATH (TNSNAMES, EZCONNECT) SQLNET.EXPIRE_TIME 10逐个解释SQLNET.AUTHENTICATION_SERVICES控制OS认证方式。NTS允许Windows本地操作系统认证也就是你以sysdba身份登录时可以用Windows账号直接进数据库NONE禁止OS认证必须用密码文件认证ALL表示两种都允许。如果你在PL/SQL Developer里用sys账号以普通用户方式登录报认证错误很可能这里写的是NTS。开发环境通常改成(NONE)反而省事但改之前要确认数据库的远程sysdba认证策略。NAMES.DIRECTORY_PATH决定连接名怎么解析。TNSNAMES代表查tnsnames.oraEZCONNECT代表直接使用host:port/service_name这种简化写法LDAP代表走目录服务。如果你希望“Database”下拉框里出现tnsnames里的别名必须包含TNSNAMES。SQLNET.EXPIRE_TIME设置空闲连接探测时间。单位是分钟设为10表示如果10分钟没有数据交互数据库会发送探测包检查客户端是否还活着。这对避免僵死连接很有用开发机也建议加上。4.2 服务端sqlnet.ora的常用配置服务端的sqlnet.ora有一些客户端没有或不常用的参数SQLNET.AUTHENTICATION_SERVICES (NONE) TCP.VALIDNODE_CHECKING YES TCP.INVITED_NODES (127.0.0.1, 192.168.1.0) TCP.EXCLUDED_NODES (192.168.1.100)这块就是数据库服务器的“门禁白名单/黑名单”。如果公司安全策略比较严格DBA会在这里限制只有特定IP段能连数据库。遇到“连接被拒”但监听和tnsnames都正常建议查一下服务端这个文件。还有一个值得关注的参数是SQLNET.RECV_TIMEOUT和SQLNET.SEND_TIMEOUT分别设置接收、发送数据的超时时间。在跨防火墙或者网络不稳定的环境里客户端连接可能一直卡在“正在连接”设置这两个参数能快速报错而不是干等。4.3 通过sqlnet.ora打开排错追踪这个技巧藏得比较深但排错时极其好用。Oracle Net本身支持客户端的详细日志追踪只需要在客户端的sqlnet.ora里加上TRACE_LEVEL_CLIENT SUPPORT TRACE_FILE_CLIENT client_trace TRACE_DIRECTORY_CLIENT D:\oracle_trace然后重新发起一次连接会在指定目录生成一个日志文件记录客户端和监听之间的所有交互细节。这个文件里面的内容对新手来说有点劝退但你只需要搜索ERROR、TRACE这些关键词基本能定位出是主机名解析失败、端口不通还是服务名不匹配。这种追踪日志用完建议立刻关掉因为SUPPORT级别会产生大量日志磁盘空间不够时反而会把系统搞挂。4.4 sqlnet.ora里的“互不匹配”问题有一个非常隐蔽的坑客户端和服务端的sqlnet.ora参数不一致尤其是认证方式。比如客户端写了SQLNET.AUTHENTICATION_SERVICES (NTS)服务端是(NONE)你用sysdba走OS认证登录就会失败反过来服务端允许OS认证但客户端没有配置也会出现认证方式不匹配的报错。这种问题看tnsnames和listener都查不出来最后往往靠翻客户端追踪日志才找到。5. PL/SQL Developer侧的配置与验证方法从工具界面到命令行配置文件讲完回到工具本身。PL/SQL Developer本身不包含Oracle网络组件它依赖一个Oracle客户端或Instant Client的OCI库。所以工具的配置核心就是“告诉PL/SQL Developer去哪找OCI、去哪找tnsnames.ora”。5.1 工具里的关键设置项打开PL/SQL Developer依次进入“工具→首选项→连接”Oracle Home选择你本机安装的Oracle客户端主目录。OCI Library指向oci.dll文件路径。如果机器上装了多个Oracle客户端比如32位和64位、Xe和Instant Client这里最容易选错。TNS Names File显示工具当前读取的tnsnames.ora路径。很多“PL/SQL Developer闪电消失”的案例最后都定位到OCI库路径错误。最典型的情况是你装了64位Oracle客户端但PL/SQL Developer是32位的加载64位的oci.dll直接崩溃。解决方案是改用32位客户端或者换用64位版本的PL/SQL Developer。另一个常见错误是登录界面的Database下拉框是空的。这通常说明工具根本没找到tnsnames.ora。这时可以在数据库一栏手动填入host:port/service_name的EZCONNECT格式如果这样能连接那就可以确定问题出在tnsnames的解析路径上。5.2 用命令行工具验证连接链路的每一环工具界面太“黑盒”了出了问题看不出是哪一环。我建议按下面三步从命令行排查每一步都只验证一个点第一步验证网络通不通ping 192.168.10.15这个检查基本网络。第二步验证监听通不通。在装有Oracle客户端的机器上执行tnsping ORCL如果返回OK (0 ms)说明从客户端到监听这条链路是通的tnsnames.ora解析也没问题。如果返回TNS-12535、TNS-12541等错误问题出在网络或监听这一层。注意tnsping只能验证到监听为止它不验证数据库实例是否可用。第三步用sqlplus直接连接验证服务名是否可靠sqlplus scott/tiger192.168.10.15:1521/orcl如果这条能连上但PL/SQL Developer里同样配置连不上那就是工具侧问题重点检查OCI库和tnsnames路径如果这条也报ORA-12514那就是服务名和监听注册不符。这个排查思路能帮你快速把范围从“一堆可能”缩小到具体某一行配置。5.3 常见验证命令速查下面是我在实际工作中最常用的几条命令几乎每天都用命令作用tnsping 连接名测试tnsnames解析和网络连通性lsnrctl status查看本机监听状态、端口、已注册服务lsnrctl services查看监听注册的服务名和状态lsnrctl start/stop启动/停止监听sqlplus user/pwdhost:port/service直接连接测试数据库netstat -ano | findstr 1521查看端口监听情况和占用进程5.4 PL/SQL Developer连接测试的建议如果你第一次在新电脑上配置PL/SQL Developer我建议按这个顺序操作先装好Oracle客户端或者Instant Client并确认位数和PL/SQL Developer一致。打开PL/SQL Developer“首选项→连接”把Oracle Home和OCI Library设置正确。在tnsnames.ora中写好配置用tnsping验证。登录时如果下拉框里能看到你写的连接名直接选择即可。如果连接报错第一步先看监听状态第二步看服务名列表第三步再回头看tnsnames。这个顺序看着简单但能少走很多弯路。6. 高频报错速查ORA-12514、ORA-12541、ORA-12154实战排查根据这两年我看到的提问和热搜情况连接Oracle最集中的问题就是那几个错误码。我把它们整理成一套速查表再逐个说一下我亲测过的排查路径。6.1 ORA-12514监听认识IP和端口但不知道服务名报错原文是ORA-12514: TNS:listener does not currently know of service requested in connect descriptor这个错误翻译成大白话是你成功连上了监听但你说的那个服务名监听根本不认识。排查步骤按顺序来在数据库服务器上执行lsnrctl services看监听实际注册了哪些服务名。如果列表里没有你tnsnames.ora里写的那个服务名那问题就是名字对不上。确认数据库实例是否已经启动。如果数据库是刚启动的可能需要等几十秒PMON进程才会把服务注册到监听。如果数据库已启动但服务名始终没注册检查LOCAL_LISTENER参数是否指向了正确的监听地址特别是改了端口或者有多个IP的环境。如果动态注册一直不成功可以用静态注册兜底即前面说的在listener.ora里配置SID_LIST_LISTENER。这四种原因我都碰到过。特别是刚搭建的11g测试库开发人员兴致勃勃地过来连库结果数据库还没启动完成就点了连接报ORA-12514然后怀疑配置错误。实际上等一两分钟再连就好。6.2 ORA-12541根本没有监听进程在工作报错原文ORA-12541: TNS:no listener这说明你连接的那个IP:port上压根没有一个监听进程在等请求。排查重点是lsnrctl status看监听是否已启动。如果没启动lsnrctl start启动即可。确认端口对不对。客户端tnsnames.ora里写的端口可能和服务端listener.ora里实际监听的端口不一样。检查防火墙。Windows防火墙、云安全组都可能拦截1521端口。在服务器本地用tnsping 127.0.0.1:1521能通但用外网IP ping不同基本就是防火墙问题。查看监听进程是否异常退出。Oracle的监听日志在$ORACLE_HOME/network/log/listener.log里面有详细的错误原因。6.3 ORA-12154连接名在tnsnames.ora里压根不存在报错原文ORA-12154: TNS:could not resolve the connect identifier specified这个错误意味着客户端拿着你输入的名字在tnsnames.ora里翻了一圈也没找到。常见原因名字拼写错误。连接名是大小写敏感的写orcl和ORCL可能不一样取决于平台。PL/SQL Developer读的tnsnames.ora不是你改的那份检查“工具→首选项→连接”里的TNS Names File路径。sqlnet.ora里的NAMES.DIRECTORY_PATH排除了TNSNAMES只留下了EZCONNECT和LDAP。6.4 其他高频连接报错除了上面三个还有几个报错也经常被搜到ORA-12560: TNS:protocol adapter error。Windows环境特别多。通常是Oracle服务没启动或者注册表里的ORACLE_HOME和实际安装路径不一致。检查Windows服务里OracleServiceORCL是否在运行。ORA-01017: invalid username/password。账号密码错误。这个看着简单但要注意如果你用了操作系统认证方式登录sysdba可能不是密码问题而是认证方式问题。ORA-28547: connection to server failed, probable Oracle Net admin error。这个报错的原因很杂最常见的是客户端OCI版本和服务端不兼容或者中间网络设备干预了连接。处理办法是统一客户端位数和版本实在不行打开客户端追踪日志看细节。6.5 一个压箱底的排查习惯最后分享一个我自己的排查习惯凡是连接问题我从来不在PL/SQL Developer的弹窗里反复试密码。我会先开一个命令行窗口按“tnsping→sqlplus”的顺序走一遍。这两个命令的输出非常明确能直接告诉你问题在哪一层。大部分时候问题根本不在工具本身而在配置文件的某一处小细节——端口写错了、服务名带了个空格、路径选错了。这些坑你在命令行里一行一行看过去全都能揪出来。配置文件这东西靠背是不行的关键是理解每一行在做什么。只要把tnsnames.ora、listener.ora、sqlnet.ora三份文件的职责和关系搞清楚了连接类问题基本就是按图索骥。我自己这些年排查下来感觉最花时间的从来不是改动本身而是定位到底是哪一份文件的哪一行出了问题。所以也建议你在自己的机器上建一个固定的TNS_ADMIN目录把三份文件集中放在一起再写个小的说明文档记录每次改动原因。这套习惯养成了以后不管换环境还是接手新库都会从容很多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门