用Navicat连接docer容器里的Oracle,报错 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor的解决方法

我使用以下docker命令启动了一个oracle-database-free-23ai容器:

docker run \
  -d \
  -p 1521:1521 \
  -p 5500:5500 \
  -e ORACLE_PWD=123456t \
  -v ~/docker/data/oradata:/u01/app/oracle/oradata \
--name oracle-free23ai \
  chinafengzhao/oracle-database-free-23ai

我在主机使用Navicat连接这个容器里的Oracle数据库:

Navicat 连接测试失败,报错 “ORA-12514: TNS:listener does not currently know of service requested in connect descriptor”,这是 Oracle 最常见的连接问题之一,意思是监听器(Listener)知道你的主机和端口,但不认识你指定的“服务名称”(Service Name)。

问题根源

1 服务名称填错了:你填的是 ORCL,但 Oracle 23ai Free 的默认服务名(Service Name)是 FREEPDB1(这是默认的 Pluggable Database,即 PDB)。

Oracle 多租户架构(CDB + PDB)中,连接普通用户数据时,几乎总是用 PDB 的服务名,而不是 CDB 的 SID。

CDB 的 SID 是 FREE,但用 SID 连接通常只用于 sys/system 等系统管理用户,且需要额外指定角色。

2 连接类型选错了:你选了“服务名称”(Service Name),但填的值不对。如果改成 SID 模式,也需要调整。

3 用户名不对:你用了 oracle,但 Oracle 23ai Free 默认没有这个用户(或它不是标准管理员用户)。常用的是:sys(需要 AS SYSDBA)、system或pdbadmin(PDB 管理员)

推荐的 Navicat 连接配置

最简单、最常用的方式是连接到 FREEPDB1 PDB。在 Navicat 的“新建连接 (Oracle)”窗口中,修改如下(其他保持不变):

  • 连接名称:随便(比如 Oracle-23ai-Free-FREEPDB1)
  • 连接类型:Basic
  • 主机:127.0.0.1(或 localhost)
  • 端口:1521
  • 服务名称:选 ○ 服务名称(保持这个)
  • 服务名称(填入):FREEPDB1(全部大写或小写都行,通常小写 freepdb1 也接受,但建议大写一致)
  • 用户名:system(推荐先用这个测试) 或 sys
  • 密码:你在 docker run 时设的 -e ORACLE_PWD=xxx 的值(sys 和 system 共用同一个密码)

如果用 sys 用户:在用户名填 sys,然后在“高级”或连接字符串中加 as sysdba(Navicat 支持在用户名后加 / as sysdba,或在连接测试前选角色)。

点击“测试连接”。

备选方案:用 SID 连接 CDBFREE),适合 sys/system 管理

  • 服务名称:改选 ○ SID
  • SID:FREE(大写)

但推荐优先用 Service Name + FREEPDB1,因为大多数应用和开发都在 PDB 里操作。

快速验证步骤(在终端确认服务名和服务是否注册)

1 进入容器:

docker exec -it oracle-free23ai bash -c "source /home/oracle/.bashrc; bash"

2 进入sqlplus:

sqlplus / as sysdba

3 在 SQL> 提示符下运行下面命令确认:

SHOW PDBS;   -- 应该看到 FREEPDB1 READ WRITE

SELECT name, pdb FROM v$services;   -- 查看监听器注册的服务名,通常有 FREE 和 FREEPDB1

SHOW CON_NAME;   -- 当前是 CDB$ROOT

ALTER SESSION SET CONTAINER = FREEPDB1;   -- 切换到 PDB

SHOW CON_NAME;   -- 变成 FREEPDB1

如果看到 FREEPDB1 已 READ WRITE,且 v$services 有 FREEPDB1,说明一切正常。

4 退出后,用上面 Navicat 配置重试。

如果还失败的额外检查

  • 等待时间:首次启动后,有时服务注册需要 1–2 分钟。等 docker logs 完全稳定(看到 DATABASE IS READY TO USE! 后)再连。
  • 防火墙/端口:Ubuntu 上确认 1521 端口没被防火墙挡(sudo ufw allow 1521)。
  • Navicat 版本:确保 Navicat 支持 Oracle 23c/23ai(较新版通常支持)。
  • 连接字符串测试(Navicat 支持直接填 EZCONNECT 字符串):

在“连接字符串”模式下试:127.0.0.1:1521/FREEPDB1

用户:system,密码是你在 docker run 时设的 -e ORACLE_PWD=xxx 的值(sys 和 system 共用同一个密码)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注