tnsnames.ora中别名必须严格匹配@后名称且=前后无空格,service_name须与show parameter service_names值完全一致(区分大小写),文件须置于$oracle_home/network/admin下且sqlnet.ora中names.directory_path含tnsnames。

tnsnames.ora 中的别名必须严格匹配客户端命令中 @ 后面写的名称,且等号前后不能有空格,括号和关键词大小写不敏感但格式不能错。
tnsnames.ora 别名定义的基本语法
别名就是你在 sqlplus、PL/SQL Developer 或 JDBC URL 里 @ 后面写的那个名字,比如 sqlplus scott/tiger@ORCLPDB 中的 ORCLPDB。这个名称必须在 tnsnames.ora 文件中以 ORCLPDB = (DESCRIPTION = ...) 形式开头,= 前后绝对不能有空格,否则解析失败。
-
ORCLPDB是别名,可任意命名,但建议见名知义(如环境+库名) -
=后第一个字符必须是(,不能换行或加空格 -
DESCRIPTION必须大写或小写统一(推荐全大写,避免混淆) - 整个结构不支持注释(
#或!都会被当作非法字符)
ADDRESS 和 CONNECT_DATA 的关键字段写法
Oracle 12c 起默认启用多租户,SID 多数已失效,必须用 SERVICE_NAME;端口必须显式写 PORT = 1521,不能写成 port: 或漏掉等号;主机名用 HOST = db-server,不是 host: 或 server:。
-
HOST可以是域名、IP 或localhost,但必须能被客户端ping通 -
PORT必须与监听器实际监听端口一致(查lsnrctl status确认) -
SERVICE_NAME必须与数据库中show parameter service_name输出值完全一致(区分大小写) -
SERVER = DEDICATED可省略(默认),但写上更明确;SHARED需显式声明且服务端支持
配置多个地址实现故障转移
用 ADDRESS_LIST 包裹多个 ADDRESS,Oracle 客户端会按顺序逐个尝试连接,直到成功或全部失败。这不是负载均衡,而是 failover 机制。
- 顺序很重要:
ADDRESS出现的先后决定连接优先级 - 每个
ADDRESS必须包含完整的(PROTOCOL = TCP)(HOST = ...)(PORT = ...) - 不要混用
ADDRESS_LIST和单个ADDRESS—— 二者语法不兼容 - 示例中若
192.168.1.100不可达,客户端会等超时(默认约 60 秒)后才试下一个,这点容易误判为“卡住”
tnsnames.ora 文件位置和生效条件
文件必须放在 Oracle 客户端能识别的路径下,且 sqlnet.ora 中的 NAMES.DIRECTORY_PATH 必须包含 TNSNAMES,否则直接跳过该文件。
- Linux/Unix 默认路径:
$ORACLE_HOME/network/admin/tnsnames.ora - Windows 常见路径:
%ORACLE_HOME%\network\admin\tnsnames.ora - 可通过
echo $TNS_ADMIN(Linux)或set TNS_ADMIN(Windows)覆盖默认路径 - 修改后无需重启客户端,但已有连接进程不会自动重载 —— 新开终端或重连才生效
- 验证是否加载成功:运行
tnsping ORCLPDB,返回OK且耗时合理即表示解析和网络层通
最容易被忽略的是 SERVICE_NAME 和 SID 的混淆,以及 tnsnames.ora 文件路径未被客户端实际读取 —— 很多人改了文件却仍在旧路径下找,结果怎么调都不生效。











