先直接上操作步骤吧,最后有解释操作步骤的原因:
1.首先是查看当前容器,如果显示的是CDB$ROOT,表示是CDB容器
show con_name
2.下面我们就在CDB容器中直接创建表空间
注意CDB容器中创建表空间,
create tablespace CDBTEST datafile 'D:/app/oradata/orcl/CDB_TBSPACE.dbf' size 1500M autoextend on next 50m maxsize unlimited;
3.创建新用户,注意CDB容器中创建一个通用用户,用户名必须以C##或者c##开头,因为CDB中默认创建的是common user
如果想要创建本地用户,则要在PDB容器中创建,下面会说如何切换到PDB容器
create user C##test identified by 123456; //其中C##test为用户名,123456为密码
4.给新用户授权
grant create session to C##test;
grant create table to C##test;
grant create tablespace to C##test;
grant create view to C##test;
5.需要切换到PDB容器,首先查看当前CDB容器中包含的PDB容器
select con_id,dbid,guid,name,open_mode from v$pdbs;
CON_ID DBID GUID NAME OPEN_MODE
2 530000825 C78D5E8D63184B5F91529A34D2261A30 PDB$SEED READ ONLY
3 2277952447 95FAD312FCEF42A29188893F08230324 ORCLPDB MOUNTED
可以看到当前容器中有一个PDB容器ORCLPDB,我们必须在PDB容器中创建与CDB容器相同的表空间,才能给用户赋予新建的表空间
6.切换至查到的某个PDB容器(上面查到的是ORCLPDB)
注意使用这个命令需要的sysdba级别的权限,否则无法执行
alter session set container=ORCLPDB;
7.在PDB容器下创建相同表空间名称CDBTEST
create tablespace CDBTEST datafile 'D:/app/oradata/orcl/PDB_TBSPACE.dbf' size 1500M autoextend on next 50m maxsize unlimited;
8.授予用户使用表空间的权限
alter user C##test quota unlimited on CDBTEST;
至此就可以用这个用户使用新创建的表空间了,总结下:
1)如果在CDB容器下新建的用户,并且有CDB和PDB容器,在两者里面需要建一样名字的表空间,才能给用户赋予新表空间;
2)如果在PDB容器下新建的用户,只需要在PDB容器下建表空间,赋予用户即可使用;
至于为什么如此,参考下面Oracle12c新特性!
Oracle12c 中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为 ContainerDatabase,中文翻译为数据库容器,PDB全称为PluggableDatabase,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对 多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
首先,容器数据库创建新用户并分配表空间时必须在没有PDB的情况下进行或PDB与CDB有相同的表空间的时候进行,否则会报错。如果是在PDB与CDB 有相同表空间的情况下给CDB用户分配表空间,则分配CDB的表空间给用户PDB的表空间并不受影响。而且,CDB用户必须以‘C##’为开头,否则创 建不了。如下:
1.这是在没有PDB的情况下创建用户“C##ukprod”并分配”USERS“(系统自带的表空间),如果不以C##开头的用户名就会报错。
2.在CDB中创建表空间TBLSPACE_OTH,而PDB中不存在该表空间,然后创建用户默认表空间为TBLSPACE_OTH将报错
3.在PDB中创建表空间TBLSPACE_OTH,注意文件名不能和CDB中的一样(在不同目录也没关系)
3.1 show con_name --查看当前容器
3.2 alter session set container=UKPDB1; --转换容器到PDB
alter session set container=CDB$ROOT; --转换容器到CDB
通过查询可知: “C##test” 的默认表空间是容器数据库 “CDB” 的, 跟插接式数据库 “PDB” 一点关系都没有。如果硬要说有关系的话就是 ” 如果 PDB中没有表空间 ’TBLSPACE_OTH‘ 的话 CDB 中的用户就不能以 ’TBLSPACE_OTH‘ 表空间做为默认表空间 ” 。
oracle推荐是把应用放在PDB中的,然而PDB中创建的用户你会发现按照以前11g的方法是连接不上的,如下图:
这是为什么呢?
原因是要写成conn test11/test11@UKPDB1
这个UKPDB1是tnsName, 如下图:
注意这个SERVER_NAME,并不是UKPDB1,可以用lsnrctl -status查看,我在本地客户端按照11g的惯例写了SERVER_NAME = UKPDB1;结果怎么也连不上,在本地注意把PDB的监听也配上。
转载文章内容:https://blog.csdn.net/aaronmer/article/details/78748952
https://www.cnblogs.com/zydev/p/5209473.html