为了创建用户,我通过 SQL*Plus 运行了以下命令:
SQL> conn / as sysdba;
Connected.
SQL> alter session set container = orclpdb;
Session altered.
SQL> create user admin identified by qq;
User created.
SQL> grant dba to admin;
Grant succeeded.
SQL> connect admin/qq@db12c;
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
我一直收到这个错误:
ORA-01017: 无效的用户名/密码;登录被拒绝
我究竟做错了什么?
我还将附上 tnsnames.ora 文件:
# tnsnames.ora Network Configuration File: C:\app\admin\product\12.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
PROBA.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PROBA)
)
)
LISTENER_DB12C =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
DB12C =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db12c)
)
)
TL;DR 对于新创建的用户,
admin您需要通过数据库本身 (PDB) 的服务名称进行连接,而不是容器 (CDB):在其他应用程序/工具中类似,例如通过 JDBC:
一般来说,开发人员只需要知道可插拔数据库(PDB)服务的名称即可。连接后,它就像一个常规数据库一样工作,与早期版本中的单个数据库没有什么不同。它不应该知道包含该数据库的某个容器的存在。
再深入一点
从版本 12 开始,引入了多租户(multitenant)架构,包括:
Container DB(CDB Container Database):这是一个或多个数据库的包装器,用于管理它们并且只包含它们的公共部分。应用程序用户和他们的数据都不在这里。
可插拔数据库(PDB Pluggable Database):这些就是数据库本身,也就是说,PDB是大家习惯的同义词——数据库。它实际上包含用户和应用程序数据。PDB 与其他 PDB 共享 CDB 的公共部分,但完全独立于它们。
在 CDB 和 PDB 之间移动的第一步。
在不指定服务名称的情况下,连接始终在 CDB 中,然后,转换到指定的 PDB 并返回: