Oracle数据库CDB与PDB
Oracle 12C以及更高版本中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
CDB相当于操作系统,调用并管理各个PDB。PDB相当于真正提供业务需求的数据库实例。Oracle 12C安装后只创建了CDB,需要自己生成相应的PDB。 Oracle 12C在安装时,默认创建为容器数据库。
1、查看当前是否处于容器CDB
show con_name;
如果结果为CDB&ROOT,则为容器状态(CBD),结果为ORCLPDB(这个PDB名字根据自己的实际情况而定,不是固定的),则为可插拔数据库(PDB)。
2、查看容器中的数据库名
show pdbs;
3、切换到PDB
alter session set container=ORCLPDB1(这个pdb名字根据自己实际情况而定)
4、切换到CDB
alter session set container=CDB&ROOT
注:处于容器CDB时,新建的用户必须以C##开头
常用命令:
--查看oralce版本
select * from v$version;
--查看当前使用容器
select sys_context ('USERENV', 'CON_NAME') from dual;
--查看数据库存在的容器及其状态等
select con_id, dbid, guid, name, open_mode from v$pdbs;
--或
show pdbs;
创建新用户
--创建新用户
create user 用户名 identified by 密码;
--用户授权
grant connect,resource,dba to 用户名;
--修改用户密码
alter user 用户名 identified by 密码;
--删除用户
drop user 用户名;
drop user 用户名 cascade;
需要注意:
1、由于oracle从12c开始引入了容器(PDB和CDB)、租户的概念。直接连接sysdba用户创建新用户时,会默认在CDB中创建公有用户,用户名需要以“C##”或“c##”开头。如果用户名开头不想使用“C##”或“c##”,则需要做如下操作。
--方法1:关闭容器(未尝试)
--a. 执行命令
alter pluggable database pdb名称 close;
--b. 或者在安装创建oracle的时候将“创建为容器数据库”前面的打勾✔去掉。--方法2:切换会话container到PDB容器(尝试可用)
--打开容器
alter pluggable database pdb名称 open;
--关闭容器
--alter pluggable database pdb名称 close;
--保存容器当前状态,避免主机/orcl服务重启时,pdb自动关闭
--alter pluggable database all save state;
--切换容器
alter session set container=pdb名称(指定容器);
2、删除用户时,若用户拥有对象,则不能直接删除,否则将返回一个错误值。
需要指定关键字cascade,可删除用户所有的对象,然后再删除用户。
3、在创建用户,重启电脑/数据库服务后,发现一个用户登录的问题。详细描述如下:
问题描述:
a、在将用户创建到其他pdb容器后,电脑重启。
b、然后再次用新创建的用户连接数据库时,发现报错“ORA-01109 数据库未打开”。
c、查看用户pdb状态为MOUNTED,而不是一个打开的可读可写的状态。
问题原因分析:
重启电脑,或oracle服务重启后,pdb状态被重置为open之前的状态。
解决问题方法:
a、打开容器。
b、保存容器当前状态,避免主机/orcl服务重启时,pdb自动关闭
###########################################################
SQL> show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED READ ONLY NO3 ORCLPDB1 MOUNTEDSQL> show con_name;CON_NAME
------------------------------
ORCLPDB1
SQL> create user autotest identified by autotest;
create user autotest identified by autotest
*
ERROR at line 1:
ORA-01109: database not openSQL> alter pluggable database ORCLPDB1 open;Pluggable database altered.SQL> create user autotest identified by autotest;User created.SQL>
切换到 pdb用户后,创建用户提示:database not open 。需要open database
SQL> create user autotest identified by autotest;
create user autotest identified by autotest*
ERROR at line 1:
ORA-65096: invalid common user or role name
报错:ORA-65096: invalid common user or role name(公用用户名或角色名无效).ide
错误缘由:用户想在PDBORCL中建立autotest用户,却未设置会话container到PDB,而在CDB中建立公有用户因没法经过名称或角色验证出错。
SQL> alter session set container=ORCLPDB1SQL> alter pluggable database ORCLPDB1 open;Pluggable database altered.SQL> create user autotest identified by autotest;User created.SQL> grant dba to autotest;Grant succeeded.
参考:
https://blog.csdn.net/lixiangss1993/article/details/121677355
https://blog.csdn.net/GeorgeChan_/article/details/124040161