Oracle 19环境下新建PDB用户并授权后连接报ORA-01017错误问题
Oracle 19c 新建用户连接报ORA-01017的核心故障原因
最高概率根因:连接目标与用户所属容器不匹配
- 你在操作说明中明确提到,是用SYSTEM账号登录指定PDB后创建的teste用户,该用户的归属容器是你登录的PDB,并非Oracle实例的根容器CDB$ROOT。
- 你在CMD中执行
SET oracle_sid=orcl后直接运行sqlplus teste/teste,这种不带服务名的本地连接,默认会指向orcl实例下的根容器CDB$ROOT,根本没有路由到你创建用户的PDB中。 - 根容器内不存在teste用户,因此必然返回
ORA-01017: 用户名/密码无效; 登录被拒绝的报错,这是19c多租户架构下新建PDB用户连接失败的最高发问题。
快速验证方法
使用SYSTEM账号本地连接到根容器后,执行以下SQL确认用户所属位置:
SELECT username, common, con_id FROM dba_users WHERE username='TESTE';
- 如果查询结果中
con_id为1、common为YES,说明用户确实建在根容器,需要继续排查其他配置问题 - 如果查询无结果,说明用户仅存在于你之前登录的PDB中,完全可以确认是连接路由错误导致的问题
- 你也可以切换回之前创建用户的PDB,查询用户状态:
确认用户是否处于未锁定的正常状态(如果建用户时未指定解锁配置,碰到默认profile的锁定策略可能出现LOCKED状态,同样会触发ORA-01017报错)。SELECT username, account_status FROM dba_users WHERE username='TESTE';
正确的连接方式
本地连接时必须指定PDB的服务名,不能依赖默认的SID映射,格式参考:
sqlplus teste/teste@<主机地址>:1521/<PDB的服务名>
举例:如果你的PDB服务名为orclpdb,执行以下命令即可正常连接:
sqlplus teste/teste@localhost:1521/orclpdb
其他次要排查点
- 不要在连接时省略服务名后反复输入用户名密码,这种操作全程都在往根容器发起连接,永远不会找到PDB内创建的用户。
- 连接前确认目标PDB处于打开状态:用SYSTEM账号登录根容器执行
SELECT name, open_mode FROM v$pdbs;,如果对应PDB为MOUNTED状态,执行ALTER PLUGGABLE DATABASE <PDB名称> OPEN;启动PDB,否则指定服务名也无法正常连接。 - 你给自定义角色授予的
create session权限属于角色权限,只要用户的默认角色配置正常,登录时会自动启用,不会因为角色未授权直接报ORA-01017(权限不足类的角色问题会触发ORA-01045报错,与当前报错无关)。 - 19c默认开启密码大小写敏感校验,你创建用户时用的密码是小写
teste,连接时输入小写密码即可匹配,无需强行输入大写密码。
内容的提问来源于stack exchange,提问作者Gustavo Borges
相关产品推荐
相关产品推荐

