一、 cdb和pdb的相关概念
CDB与PDB是Oracle 12C引入的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为ContainerDatabase,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。
二、想要了解cdb和pdb深入概念的小伙伴们可自行查找资料,下面进入主题。
安装好Oracle后使用navicat连接Oracle
新建查询,输入以下SQL语句,点击运行
--创建表空间
create tablespace waterboss datafile 'D:\Oracle19c\waterboss.dbf'
size 5m
autoextend on
next 5m;
但是当我在创建用户时出现了两个错误。
--创建用户
CREATE USER wateruser
IDENTIFIED BY 123456
DEFAULT TABLESPACE waterboss;
1、在填写好用户的基本信息后进行保存,提示错误:ORA-65096: 公用用户名或角色名无效。
这里百度了一波,知道了cdb和pdb的概念。查询到是说cdb创建用户是用户名前面必须要加上C##或c##,不然会返回一个错误。
2.当我将用户名加上C##前缀后又提示错误:ORA-65048:在可插入数据库PDBORCL中处理当前DDL语句时出错 ORA-00959:表空间‘LOCL_DATA’不存在。
--创建用户
CREATE USER C##wateruser
IDENTIFIED BY 123456
DEFAULT TABLESPACE waterboss;
这里呢其实还是和cdb有关。
首先我查询了我现在的session是cdb,这就导致了我在cdb创建了表空间但是pdb上面并没有这个表空间。由于cdb与pdb表空间结构不同,所以就出现了ora-00959的错误。
sqlplus / as sysdba;
show con_name;
然后我查看了一下此时数据库的pdb
select con_id,name,open_mode from v$pdbs;
可以看到里面有个ORCLPDB,于是我就用navicat重新连接了一下这个可插拔数据库。具体连接配置如下:
修改默认服务名ORCL为ORCLPDB后 连接Oracle,创建表空间和用户就没有再报错了,用户名前面也不需要加C##。
新建查询,输入以下SQL语句,点击运行
--创建表空间
create tablespace waterboss datafile 'D:\Oracle19c\waterboss.dbf'
size 5m
autoextend on
next 5m;
--创建用户
CREATE USER C##wateruser
IDENTIFIED BY 123456
DEFAULT TABLESPACE waterboss;
--创建业主表
CREATE TABLE T_OWNERS(
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(30),
ADDRESSID NUMBER,
HOUSENUMBER VARCHAR2(30),
WATERMETER VARCHAR2(30),
ADDDATE DATE,
OWNERTYPEID NUMBER
);
如果用的是sqlplus进行测试的,那就直接修改session就行了。
alter session set container=ORCLPDB;
三、关于Oracle12c 重启后。。。
Oracle 12c 重启后只会重启cdb,其余所有的pdb都会进入mounted状态。这个时候客户端是无法连接这个数据库的。所以们还需要重新启动相应的pdb数据库。
cmd命令窗口:
sqlplus / as sysdba
连接上Oracle后
--查看pdb
select name, pdb from v$services;
--启动相应pdb(orclpdb是我的pdb的名称)
alter pluggable database orclpdb open;
当然,你也可以使用触发器进行自启动。我这里没有进行测试,就不把具体的方法写在上面了。
参考资料
原文链接:https://blog.csdn.net/weixin_43867817/article/details/106548573