Oracle监听器默认不监听IPv6,需在listener.ora中显式配置ADDRESS=(PROTOCOL=TCP)(HOST=::)(PORT=1521)并重启;TNSNAMES.ORA和JDBC URL中IPv6地址必须用方括号包裹,且OS、防火墙、DNS等各层须同步支持IPv6。
Oracle监听器不监听IPv6地址,lsnrctl status 显示只有 IPv4
默认安装的 oracle(12c 及以后版本)监听器会自动绑定到 ipv4 的 0.0.0.0,但不会主动监听 ipv6 的 ::,即使系统已启用 ipv6 且网卡有有效 ipv6 地址。根本原因不是 oracle 不支持 ipv6,而是监听器配置未显式声明 ipv6 协议栈。
实操建议:
- 编辑
$ORACLE_HOME/network/admin/listener.ora,确保ADDRESS中包含明确的 IPv6 地址或通配符:ADDRESS = (PROTOCOL = TCP)(HOST = ::)(PORT = 1521)
注意:不能写成HOST = localhost或HOST = 127.0.0.1,这些在 IPv6 环境下可能被解析为仅 IPv4 - 若需同时支持 IPv4 和 IPv6,必须写两个独立
ADDRESS条目(Oracle 不支持单条配置双栈):ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)<br>ADDRESS = (PROTOCOL = TCP)(HOST = ::)(PORT = 1521)
- 重启监听器后,用
lsnrctl status查看输出中是否出现(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=::)(PORT=1521)))—— 这才是 IPv6 监听生效的标志
TNSNAMES.ORA 中使用 IPv6 地址连接报 ORA-12170: TNS:Connect timeout
客户端 TNS 配置里直接写 IPv6 字面量(如 2001:db8::1)时,Oracle 网络层要求必须用方括号包裹,否则解析失败或误判为域名。
实操建议:
- TNS 别名中的
HOST值必须加[],例如:DB6 =<br> (DESCRIPTION =<br> (ADDRESS = (PROTOCOL = TCP)(HOST = [2001:db8::1])(PORT = 1521))<br> (CONNECT_DATA = (SERVICE_NAME = orcl))<br> )
- 若使用 DNS 解析 IPv6 地址,确保 DNS 返回的是
AAAA记录,且客户端操作系统能正确解析(可先用nslookup -type=aaaa db6.example.com验证) - 避免在
HOST中混用 IPv4 和 IPv6 地址(比如写成HOST = [::1],127.0.0.1),Oracle 不支持这种逗号分隔写法
监听器日志报错 ORA-12537: TNS:connection closed 或 ORA-12545
这类错误常出现在 IPv6 配置看似正确但实际连不通时,多数是底层协议栈或防火墙层面的问题,而非 Oracle 配置本身。
实操建议:
- 检查系统级 IPv6 是否真正启用:
sysctl net.ipv6.conf.all.disable_ipv6必须为0;ip -6 addr show应能看到有效 global 地址 - 确认防火墙允许 IPv6 流量:
ip6tables -L -n或ufw status(若启用 ufw,需sudo ufw allow proto tcp to any port 1521,并确认 ufw 支持 IPv6) - Oracle 默认不校验反向 DNS,但如果客户端启用了
SQLNET.INVITED_NODES或设置了SQLNET.ALLOWED_LOGON_VERSION_SERVER,而服务端反向解析失败(IPv6 PTR 记录缺失),也可能触发连接关闭
Java JDBC 使用 IPv6 连接 Oracle 报 “UnknownHostException”
JDBC Thin 驱动对 IPv6 字面量支持较严格,URL 中的主机部分若含冒号,必须用方括号,且整个 URL 需符合 RFC 3986 格式;否则 JVM 网络层直接抛异常。
实操建议:
- JDBC URL 必须写成:
jdbc:oracle:thin:@[2001:db8::1]:1521/orcl
注意:方括号仅包 IP,不包端口;斜杠后是 service_name,不是 SID - 如果使用主机名,确保该主机名在
/etc/hosts或 DNS 中有对应的AAAA记录,且 Java 进程启动时未设置-Djava.net.preferIPv4Stack=true(该参数会强制禁用 IPv6) - Oracle JDBC driver 12.2+ 对 IPv6 支持较好,低于 12.1 的版本存在解析 bug,升级驱动是最稳妥的规避方式

















