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 中的用户了。
六、总结
这次踩坑的核心结论:
- Oracle 19c 是 多租户架构,普通用户必须建在 PDB 里。
CREATE USER前一定要先ALTER SESSION SET CONTAINER = 你的PDB。CONN 用户/密码不带@服务名时,默认连的是CDB$ROOT。- 连接 PDB 用户必须写
@主机:端口/PDB服务名。 - PL/SQL Developer 的"数据库"栏要填服务名,不是监听器名。
希望这篇文章能帮你少走弯路。