oracle 23c默认监听localhost导致远程连接失败,须修改listener.ora中host为实际ip或0.0.0.0、放行防火墙1521端口、使用service_name(如freepdb1)而非sid,并确保tns_admin环境变量正确指向tnsnames.ora所在目录。

Oracle 23c 默认只监听 localhost,不对外网开放 —— 这是绝大多数远程连接失败的根源,不是密码错、不是服务没启,而是监听器压根没绑你的网卡 IP。
检查 listener.ora 是否监听了真实 IP
Oracle 23c 安装后生成的 listener.ora 默认只写 HOST = localhost,导致监听器拒绝所有来自局域网或外网的 TCP 连接请求。必须显式添加你机器的实际 IP 或通配地址。
- 编辑
$ORACLE_HOME/network/admin/listener.ora,找到LISTENER的ADDRESS块 - 删掉仅含
HOST = localhost的那一行,替换成实际 IP,例如:(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.23)(PORT = 1521)) - 或者更稳妥地用
0.0.0.0(仅限可信内网):(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) - 改完后必须执行
lsnrctl reload或lsnrctl stop && lsnrctl start,reload不重启监听器但重载配置,更安全
确认防火墙放行 1521 端口
Linux 上即使监听器绑定了正确 IP,iptables 或 firewalld 仍会拦截外部连接。Oracle 23c 不会自动操作系统防火墙。
- 查当前状态:
sudo firewall-cmd --list-ports(firewalld)或sudo iptables -L -n | grep 1521 - 永久放行:
sudo firewall-cmd --permanent --add-port=1521/tcp,再sudo firewall-cmd --reload - 若用
iptables:sudo iptables -I INPUT -p tcp --dport 1521 -j ACCEPT,然后保存:sudo service iptables save(CentOS 7)或sudo netfilter-persistent save(Debian/Ubuntu) - 别忘了在云平台(如 OCI、AWS)的安全组里也放开 1521 入向规则
tnsnames.ora 条目必须匹配 SERVICE_NAME,不是 SID
Oracle 23c 默认启用多租户,数据库实例名(SID)基本失效;客户端连接必须用 SERVICE_NAME,否则报 ORA-12514: TNS:listener does not currently know of service requested。
- 查真实服务名:
sqlplus / as sysdba→ 执行SELECT value FROM v$parameter WHERE name = 'service_names'; - 典型返回是
freepdb1(Free 版)或orclpdb(Enterprise),不是FREE或ORCL -
tnsnames.ora中条目必须写SERVICE_NAME = freepdb1,不能写SID = FREE - Java、Python 等非 Oracle 官方客户端默认不读
tnsnames.ora,需显式设置TNS_ADMIN环境变量,或直接用 Easy Connect 字符串:jdbc:oracle:thin:@192.168.1.23:1521/freepdb1
SQL*Plus 能连但应用连不上?大概率是 TNS_ADMIN 没生效
SQL*Plus 依赖 $ORACLE_HOME 自动定位 tnsnames.ora,而 Java、Node.js、Python cx_Oracle 等完全不认这个逻辑,全靠 TNS_ADMIN 环境变量驱动。
- 验证是否生效:
echo $TNS_ADMIN(Linux/macOS)或echo %TNS_ADMIN%(Windows),路径必须精确到admin目录,不是上层network - Java 启动时加参数:
-Doracle.net.tns_admin=/path/to/network/admin - Python 中设置:
os.environ["TNS_ADMIN"] = "/path/to/network/admin"(必须在 import cx_Oracle 前) - 容器化部署时,
TNS_ADMIN极易漏设或挂载路径错误 —— 别假设它会继承宿主机环境
最常被忽略的是监听器绑定 IP 和 SERVICE_NAME 的对应关系:改了 listener.ora 却没查 v$parameter 确认服务名,或者改了服务名却忘了在 tnsnames.ora 里同步更新 —— 这两个点一错,所有连接都会静默失败,连错误码都可能误导你去查网络或密码。











