Oracle 19c 创建用户并连接 PDB 完整避坑指南

Oracle 19c 创建用户并连接 PDB 完整避坑指南

前言

最近在 Windows 上安装 Oracle 19c 后,准备用 PL/SQL Developer 连接自己新建的用户,结果一路踩坑:

  • 创建用户时报 ORA-65096
  • 连接时反复报 ORA-01017
  • sqlplus 能连,PL/SQL Developer 却连不上

最后发现,问题几乎都出在 Oracle 19c 的多租户架构(CDB/PDB) 上。

这篇文章把整个流程和踩坑点整理出来,希望能帮到同样被 Oracle 19c 折磨的朋友。


一、Oracle 19c 的多租户架构

Oracle 12c 以后引入了 CDB(容器数据库) 和 PDB(可插拔数据库)。

简单理解:

  • CDB$ROOT:根容器,相当于"总库"
  • PDB:实际存放业务数据的"子库"

在 19c 默认安装中:

  • 根容器叫 CDB$ROOT
  • 默认 PDB 通常叫 ORCLPDB

关键点:

普通业务用户必须创建在 PDB 里,不能直接创建在 CDB$ROOT 里。

如果你直接在根容器执行:

sql 复制代码
CREATE USER LRL IDENTIFIED BY 1234;

就会报:

复制代码
ORA-65096: 公用用户名或角色名无效

二、正确创建用户的完整步骤

1. 以管理员身份登录

bash 复制代码
sqlplus / as sysdba

2. 查看 PDB 列表

sql 复制代码
SHOW PDBS;

输出示例:

复制代码
CON_ID CON_NAME     OPEN MODE  RESTRICTED
------ ------------ ---------- ----------
     2 PDB$SEED     READ ONLY  NO
     3 ORCLPDB      READ WRITE NO

记住你的 PDB 名称,这里是 ORCLPDB。

3. 切换到 PDB

sql 复制代码
ALTER SESSION SET CONTAINER = ORCLPDB;

4. 确认当前容器

sql 复制代码
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

应该返回 ORCLPDB。

5. 创建用户

sql 复制代码
CREATE USER LRL IDENTIFIED BY "Lrl123456";

建议:

  • 密码用字母 + 数字组合
  • 加双引号,避免大小写和特殊字符问题

6. 授予登录权限

sql 复制代码
GRANT CREATE SESSION TO LRL;

如果需要建表,再补:

sql 复制代码
GRANT RESOURCE, UNLIMITED TABLESPACE TO LRL;
GRANT IMP_FULL_DATABASE TO LRL; 授予导入dmp文件的权限
GRANT UNLIMITED TABLESPACE TO LRL; 用管理员身份给 LRL 授个不限表空间的权限

三、ORA-01017 的终极原因

创建完用户后,如果你直接执行:

sql 复制代码
CONN LRL/Lrl123456

很可能报:

复制代码
ORA-01017: 用户名/口令无效; 登录被拒绝

注意:这个错误不一定真的是密码错。

在 Oracle 19c 中,不带 @服务名 的 CONN 默认连接到 CDB$ROOT 。而你的用户 LRL 只存在于 ORCLPDB 里,根容器里根本没有这个用户,所以 Oracle 直接拒绝登录。

验证方法

sql 复制代码
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

如果返回 CDB$ROOT,说明你当前就在根容器里。

正确连接方式

bash 复制代码
sqlplus LRL/Lrl123456@localhost:1521/ORCLPDB

或者在 SQL*Plus 里先切容器:

sql 复制代码
ALTER SESSION SET CONTAINER = ORCLPDB;
CONN LRL/Lrl123456

四、PL/SQL Developer 连接配置

在 PL/SQL Developer 登录窗口中:

字段 填写内容
用户名 LRL
密码 Lrl123456
数据库 localhost:1521/ORCLPDB
以...连接 Normal

注意:

不要选 LISTENER_ORCL,也不要只写 ORCL。

  • LISTENER_ORCL 是监听器名称
  • ORCL 是根容器的 SID

这两个都不是你的 PDB 服务名。

正确写法是:

复制代码
localhost:1521/ORCLPDB

或者如果 tnsnames.ora 里配置过:

复制代码
ORCLPDB

五、验证是否连接成功

连接成功后,执行:

sql 复制代码
SELECT USER, SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

应该返回:

复制代码
USER                           SYS_CONTEXT('USERENV','CON_NAME')
------------------------------ --------------------------------
LRL                            ORCLPDB

看到这个结果,就说明你已经成功连上 PDB 中的用户了。


六、总结

这次踩坑的核心结论:

  1. Oracle 19c 是 多租户架构,普通用户必须建在 PDB 里。
  2. CREATE USER 前一定要先 ALTER SESSION SET CONTAINER = 你的PDB。
  3. CONN 用户/密码 不带 @服务名 时,默认连的是 CDB$ROOT。
  4. 连接 PDB 用户必须写 @主机:端口/PDB服务名。
  5. PL/SQL Developer 的"数据库"栏要填服务名,不是监听器名。

希望这篇文章能帮你少走弯路。

相关推荐
雨落在了我的手上1 小时前
MySQL数据库基础(3):库的操作
数据库
slandarer2 小时前
MATLAB | R2026b 更新了哪些有趣的新东西
开发语言·数据库·matlab
其实防守也摸鱼2 小时前
SQL注入实验笔记
android·运维·数据库·安全·oracle·自动化
做运维的阿瑞2 小时前
一张用户表串懂 MySQL 的库、表、列、行、主键
数据库·sql·mysql·oracle
细嗅蔷薇@2 小时前
MySQL中数据类型介绍
数据库·mysql
JosieBook2 小时前
【数据库】MySQL 实战精通系列 · 第3篇:SQL 核心与复杂查询实战
数据库·sql·mysql
Dragon_qu·x2 小时前
MongoDB 高可用集群部署
运维·数据库·mongodb·k8s·helm
爱签AI电子合同2 小时前
电子合同大批量怎么测?并发与批量处理维度专项测评
服务器·数据库·人工智能·企业微信·电子签名