我使用以下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 连接 CDB(FREE),适合 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 共用同一个密码)