IPv6地址在listener.ora中必须用方括号包裹,如[2001:db8::1],否则报TNS-12537;双栈需显式配置独立IPv4和IPv6 ADDRESS条目,不可混用或依赖通配符。
listener.ora 中 IPv6 地址写法必须带方括号
oracle 监听器默认不识别裸 ipv6 地址(如 2001:db8::1),直接写会报错 tns-12537: tns:connection closed 或启动失败。正确做法是将 ipv6 地址用方括号包裹,且需配合协议显式指定 ipc 或 tcps(实际常用 tcp)。
常见错误写法:(ADDRESS = (PROTOCOL = TCP)(HOST = 2001:db8::1)(PORT = 1521))
正确写法:(ADDRESS = (PROTOCOL = TCP)(HOST = [2001:db8::1])(PORT = 1521))
- 方括号是强制要求,否则监听器解析时截断地址
-
HOST值不能混用域名和 IPv6 地址——比如HOST = mydb.local和HOST = [::1]必须分两条ADDRESS定义 - 若系统启用了 IPv6 但网卡未分配有效 global 地址,
[::1](本地回环)可作为最小验证路径
双栈监听必须定义多个 ADDRESS 条目,不能靠通配符自动适配
Oracle 不支持单条 ADDRESS 同时绑定 IPv4 和 IPv6 —— 即使你写 HOST = 0.0.0.0 或 HOST = ::,监听器也只按当前操作系统默认协议栈行为响应,无法保证双栈可达。
真正可靠的双栈配置,是显式列出 IPv4 和 IPv6 的独立监听端点:
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = [2001:db8::100])(PORT = 1521)) )
- 两个
ADDRESS共享同一PORT是允许的,只要底层 OS 支持端口复用(Linux 默认支持,Windows 需开启netsh interface ipv6 set privacy state=disabled等兼容设置) - 不要试图用
HOST = 0.0.0.0+HOST = ::组合:后者在多数 Oracle 版本中会被忽略或触发TNS-12545 - 若数据库运行在容器或云主机上,确认宿主机/安全组已放行 IPv6 流量(ICMPv6 和 TCP 1521 均需放开)
tnsnames.ora 客户端连接时需匹配服务端 listener.ora 的协议栈类型
客户端 tnsnames.ora 中的 HOST 值,必须与监听器中某条 ADDRESS 的协议类型一致,否则连接会 fallback 到 DNS 解析或超时。
例如监听器配置了 IPv6 地址 [2001:db8::100],客户端却写成:
DB6 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db6.example.com)(PORT = 1521)))
而该域名只返回 A 记录(IPv4),则无法命中 IPv6 监听端点。
- 测试 IPv6 连接优先用字面量:
HOST = [2001:db8::100],绕过 DNS 干扰 - 若依赖 DNS,确保域名同时有 A 和 AAAA 记录,且客户端 resolver 支持 IPv6(
nslookup -type=AAAA db6.example.com可验证) - Oracle 12c 及以后版本支持
ADDRESS_LIST内多地址 failover,但 IPv4/IPv6 混排可能导致连接顺序不可控,建议按协议拆分成不同 net service name
验证双栈是否生效的关键命令和日志位置
仅靠 lsnrctl status 显示 “Listening on” 不足以确认双栈就绪——它可能只列出 IPv4 接口,即使 IPv6 地址已配置成功。
真正有效的验证方式:
- 执行
lsnrctl services,检查输出中是否有对应 IPv6 地址的监听行,例如:Service "ORCL" has 1 instance(s). ... Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=[2001:db8::100])(PORT=1521))) - 用
netstat -tlnp | grep :1521(Linux)或Get-NetTCPConnection -LocalPort 1521(PowerShell)确认进程是否绑定到:::1521或具体 IPv6 地址 - 查看
$ORACLE_HOME/network/log/listener.log,搜索Listening on和Failed to open,IPv6 初始化失败通常伴随getaddrinfo错误 - 从 IPv6 客户端(如另一台启用了 IPv6 的 Linux 机器)运行
sqlplus system/oracle@//\[2001:db8::100\]:1521/ORCL实测连通性
双栈配置里最容易被跳过的环节,是操作系统层面的 IPv6 路由和防火墙策略——监听器跑起来了,但包根本进不来。别只盯着 listener.ora 文件改来改去。

















