Oracle 12c多租户模式下新建PDB用户登录失败求助
这个问题我太熟了!你猜的完全没错——就是客户端没指定要连接的目标PDB,默认连到CDB$ROOT容器里了,而你创建的testtest用户是在BPDB1这个PDB里的,CDB根容器里根本没有这个用户,所以才会抛出ORA-01017无效用户名/密码的错误。下面给你几种实用的解决办法:
方法一:登录时直接指定PDB(快速测试首选)
有两种方式可以直接指定连接到BPDB1:
- Easy Connect 方式(无需配置tnsnames):直接在sqlplus命令里带上PDB的服务信息,格式如下:
sqlplus testtest/password@//你的服务器IP:监听端口/BPDB1
举个例子,如果你的服务器IP是192.168.1.100,监听用默认的1521端口,那命令就是:
sqlplus testtest/password@//192.168.1.100:1521/BPDB1
- 通过配置好的TNS条目连接:如果你的客户端已经配置了
tnsnames.ora,确保里面有指向BPDB1的条目,比如:
BPDB1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 你的服务器IP)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = BPDB1) # 这里必须写PDB的服务名,别写成CDB的! ) )
配置好后,直接用这个TNS别名登录:
sqlplus testtest/password@BPDB1
方法二:设置客户端默认连接到PDB(一劳永逸)
如果你不想每次登录都手动指定@BPDB1,可以修改客户端的配置文件,让默认连接指向BPDB1:
找到客户端的sqlnet.ora文件(通常在$ORACLE_HOME/network/admin目录下),添加一行:
DEFAULT_SERVICE = BPDB1
保存后,下次直接执行sqlplus testtest/password就会默认连接到BPDB1了。
额外验证:确保用户创建流程没问题
有时候也可能是创建用户时的小疏忽,你可以先验证下testtest用户确实在BPDB1里:
- 以sysdba身份登录CDB,切换到BPDB1:
ALTER SESSION SET CONTAINER = BPDB1;
- 查询用户所在的容器:
SELECT username, con_id FROM dba_users WHERE username = 'TESTTEST';
如果返回的con_id和BPDB1的容器ID一致(可以用SELECT con_id, name FROM v$containers;查看BPDB1的con_id),说明用户确实在PDB里。另外还要确认给用户授予了登录权限:
GRANT CREATE SESSION TO testtest;
这个权限是登录的必要条件,没给的话就算连接对了也会报错。
内容的提问来源于stack exchange,提问作者Kidburla




