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的监听也配上。

 

posted @   头痛不头痛  阅读(12208)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
主题色彩