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 的"数据库"栏要填服务名,不是监听器名。

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

相关推荐
codigger1 小时前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
倔强的石头_1 小时前
集中式与分布式怎么选?我把手头11套系统重新过了一遍秤
数据库
挖掘狂人1 小时前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
Rainmicro1 小时前
【无标题】
java·数据库·算法
Thanks_ks2 小时前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
CoderYanger8 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wafrdggh10 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿11 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
龙腾AI白云14 小时前
仿真到现实(Sim-to-Real)迁移:跨越仿真与现实鸿沟
数据库·机器学习·plotly·知识图谱·tornado
freejackman16 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql