连接远程Oracle数据库时,tnsnames.ora中的域名应填写数据库所在服务器的主机名或IP地址;连接本机数据库则填localhost或127.0.0.1。
很多初学者在配置tnsnames.ora文件时,卡在最基本的问题上:这里到底填什么?填错了连不上,填对了也不知道为什么对,本文直接拆解这个问题的核心,按场景给出明确答案。
区分连接场景:本地数据库与远程数据库
tns配置时域名填什么,首先取决于你连的是哪台机器上的Oracle,混淆这两个场景是报错的头号原因。
连接本地数据库:填localhost
如果你的Oracle就装在当前这台电脑上,tnsnames.ora中的HOST字段填localhost或127.0.0.1就够了。
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
这是最常见的单机开发环境配置,localhost是回环地址的别名,走的是本机网络栈,不经过网卡物理链路,速度快且不受防火墙拦截。
连接远程数据库:填服务器IP或主机名
连接局域网内其他机器或云服务器上的Oracle时,HOST字段填入对方机器的IP地址或可解析的主机名。
REMOTE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb1)
)
)
这里的192.168.1.100是数据库服务器的内网IP,如果数据库部署在云端(如简米云、酷番云),则填公网IP或云服务商提供的DNS域名。
域名、IP与主机名:tnsnames.ora域名怎么填不踩坑
三种填法各自适用的情况
- IP地址:最直接,不依赖DNS解析,适用于IP固定不变的服务器,大多数企业内部静态分配IP,直接填IP最稳妥。
- 主机名:适用于有内网DNS服务的环境,填主机名比填IP灵活服务器IP变更时只要改DNS记录,客户端配置不用动。
- 完整域名(FQDN):形如db-server.example.com,用于跨网段访问,或数据库位于云厂商托管环境时,云平台提供的连接串有时就是这种格式。
判断主机名能否使用的技巧
在客户端机器上打开命令行,执行:
ping db-server
能返回IP地址,说明主机名可解析,tnsnames.ora域名怎么填就可以直接填这个主机名,如果ping不通,检查是否在同一网段、是否开了ICMP协议(很多云服务器默认禁ping),改用IP地址作为替代方案。
云数据库场景的特殊处理
不少云数据库(如简米云RDS、酷番云TDSQL)在控制台给出的连接地址本身就是域名形式,比如rm-xxxxxx.mysql.rds.aliyuncs.com(Oracle版也类似),这类地址是云厂商的负载均衡网关,不是具体的物理服务器。
这种情况下HOST字段必须原样填这个域名,不能擅自解析成IP填进去,因为云数据库底层是多节点集群,IP是动态漂移的,填IP反而会连不上。
配置Oracle监听时服务名与域名的关系
SERVICE_NAME不是域名
容易混淆的地方在于,新手常把SERVICE_NAME当成域名,SERVICE_NAME是数据库服务的逻辑名称,它由数据库的db_name和db_domain拼接而成,比如db_domain设为example.com,db_name为orcl,则SERVICE_NAME为orcl.example.com。
但这是数据库内部的服务命名,与tnsnames.ora中HOST字段的域名是两码事,HOST负责网络路由,SERVICE_NAME负责日志服务匹配,二者不能互相替代。
listener.ora与tnsnames.ora的配合
服务器端监听器listener.ora定义了监听端口和目标数据库,tnsnames.ora是客户端的连接描述,连接流程是:
- 客户端根据HOST和PORT找到服务器的监听进程
- 监听进程根据SERVICE_NAME匹配到对应的数据库实例
所以HOST填对了,SERVICE_NAME填错,报错是ORA-12514(监听程序无法识别服务);SERVICE_NAME填对而HOST填错,报错是ORA-12541(无法连接监听)或ORA-12545(连接失败)。
表格式对比这两种报错的区别:
| 报错码 | 含义 | 原因 | 检查方向 |
|---|---|---|---|
| ORA-12514 | 监听未识别服务 | SERVICE_NAME错误 | tnsnames.ora和listener.ora的服务名 |
| ORA-12541 | 无法连接监听 | HOST或PORT错误 | 防火墙、监听状态、IP可达性 |
| ORA-12545 | 连接失败 | 主机不可达或网络问题 | ping测试、路由、安全组规则 |
tns配置数据库连接失败怎么办:排查路径
第一步:确认监听状态
在数据库服务器上执行:
lsnrctl status
如果显示准备接受请求,说明监听正常,如果监听未启动,执行:
lsnrctl start
第二步:用tnsping验证tnsnames.ora配置
在客户端执行:
tnsping ORCL
tnsping结果会显示尝试连接的IP和端口,如果显示OK,说明网络层和域名/IP配置正确,若显示FAILED,问题出在HOST的IP不可达、端口被防火墙拦截,或监听未启动。
第三步:测试端口连通性
telnet 192.168.1.100 1521
连不上时,按顺序排查:
- 服务器防火墙是否放行1521端口(Linux用firewall-cmd或iptables,Windows查看入站规则)
- 云服务器安全组是否添加了1521端口的入方向规则
- 双网卡服务器是否存在多IP绑定问题,监听是否绑定到了正确的网卡地址
第四步:检查sqlnet.ora的域名解析顺序
客户端sqlnet.ora文件中有一条参数:
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP)
这决定了服务名解析的优先顺序,常规情况下TNSNAMES排在第一位,意味着先查本地的tnsnames.ora文件,如果配置了LDAP目录服务且排前头,可能绕过本地配置导致tnsnames.ora域名怎么填都无效。
tnsnames.ora中经常被忽视的参数
PORT不是固定1521
大多数Oracle默认监听端口是1521,但不少DBA出于安全考虑改成非标准端口,比如1522、1526等,甚至一个监听器上绑定多个端口,配置前询问数据库管理员实际端口,不要想当然填1521。
多个监听地址的写法
生产环境的高可用架构中,数据库可能同时有两个监听地址,tnsnames.ora支持并列多个ADDRESS:
PROD_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = prod_service)
)
)
客户端会依次尝试,第一个地址不通时自动切换第二个,配置这种模式时,HOST字段允许填多个不同IP,这也是tnsnames.ora域名填IP时的进阶用法。
常见Oracle数据库tns配置错误汇总
| 错误类型 | 现象 | 修正方法 |
|---|---|---|
| localhost被解析成IPv6 | 本机连接报连接拒绝 | 把localhost换成127.0.0.1 |
| 服务器名带下划线 | 解析异常 | 删除下划线或用IP替代 |
| 域名末尾多了空格 | tnsping超时 | 编辑tnsnames.ora后保存为无BOM的UTF-8 |
| 服务器绑定了多个IP | 外网访问不通 | 监听配置指定具体IP或用动态注册 |
| 云数据库域名解析慢 | 连接超时 | 检查本地DNS设置,改用云厂商建议的DNS服务器 |
localhost被解析成IPv6”值得展开说说,部分系统(尤其较新版本的Windows和Linux)在hosts配置存在时,localhost优先解析为::1,如果Oracle监听只绑定在了IPv4地址上,连接就会失败,此时在tnsnames.ora中直接写成:
HOST = 127.0.0.1
是最快的解决办法。
tns配置时域名相关问题和答案
问:tnsnames.ora中的HOST填主机名和IP地址有什么区别?
填IP地址省去了DNS解析环节,直接发起TCP连接,故障点少一个,适用于IP长期不变的服务器,填主机名则多了一层解析,好处是服务器IP变更后只需要改DNS记录,客户端配置文件无需修改,行业共识认为:内网环境且IP稳定时优选IP,存在IP变更预期的环境优选主机名。
问:连接云数据库时tns配置域名填什么?
填云厂商在控制台提供的数据库连接地址,这类地址一般是形如gp-xxxxxx.gpdb.rds.aliyuncs.com的域名,云数据库的底层架构是集群,公网连接经由负载均衡转发,该域名的IP可能随时变化,因此必须完整填写域名,同时把sqlnet.ora的NAMES.DIRECTORY_PATH配置中把LDAP放在靠后位置,或者不使用ORA格式连接串改用EZCONNECT简写格式。
问:tnsnames.ora中SERVICE_NAME和SID有什么区别?
SID是Oracle实例的唯一标识,通常对应一个进程和内存结构,SERVICE_NAME是数据库对外提供的服务逻辑名,一个实例可以注册多个服务名,一个服务名也可以对应多个实例(RAC集群),在tnsnames.ora中两者写法类似:
(CONNECT_DATA = (SID = orcl)) -- 传统写法
(CONNECT_DATA = (SERVICE_NAME = orcl)) -- 推荐写法
自Oracle 8i后的版本都推荐使用SERVICE_NAME,RAC环境中用SERVICE_NAME可以自动负载均衡,用SID则只连接固定实例。
tnsnames.ora中HOST字段的填写没有固定公式,唯一的标准是“能解析、能到达、能匹配”,本地填localhost,远程填IP或主机名,云上填平台域名,改完配置后用tnsping验证,看到OK就踏踏实实继续往下走。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/629363.html





