You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里:

  1. 以sysdba身份登录CDB,切换到BPDB1:
ALTER SESSION SET CONTAINER = BPDB1;
  1. 查询用户所在的容器:
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

火山引擎 最新活动