Oracle12C新特性——CDB与PDB(待补充)

Posted YICHU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle12C新特性——CDB与PDB(待补充)相关的知识,希望对你有一定的参考价值。

toc

  Oracle12C引入了CDB和PDB新特性,这与之前11g的情况大相径庭。但是相应的Oracle也从原来的实例与数据库之间要么是一对一的关系要么是多对一的关系(RAC就是多对一)一个数据库可以被多个实例加载。引入这两个新特性后,Oracle便可以实现一个实例对应多个数据库。与DOCKER的容器理念类似。
结构图:

1.相关概念:

  12C中官方解释

  • CDB:container database,容器数据库
    An Oracle Database installation that contains at least one PDB. A PDB appears to an Oracle Net client as a traditional Oracle database. Every Oracle database is either a CDB or a non-CDB.
    

    每个Oracle数据库安装都至少包含了一个PDB,每个PDB对Oracle客户端而言就是传统的Oracle数据库。每一个Oracle数据库分为CBD或者非CDB的。CDB中最高层container被称为CDB$ROOT,用来创建其他PDB的模板。

  • PDB:pluggable databases,可插拔数据库
      In a multitenant container database (CDB), a portable collection of schemas, schema objects, and nonschema objects that appears to an Oracle Net client as a traditional Oracle database (non-CDB).
    

    存放在多租户容器数据库(CDB)中,可以是schemas,schema对象或者nonschema对象但是对于客户端而言只是一个普通的数据库。PDB被称为PDB$SEED,CDB中可以用PDB$SEED创建多个PDB。我们真正接触比较多的是PDB,PDB相当于真正提供业务需求的数据库实例。

  • container:容器
    A container is a collection of schemas, objects, and related structures in a multitenant container database (CDB). Within a CDB, each container has a unique ID and name.
    

    在CDB中容器是各种schema,对象以及相关结构的集合。在CDB中每个容器都有唯一的ID和名字。

  • Current container:当前容器
     For a given session, the current container is the one in which the session is running.The current container can be the CDB root, an application root, or a PDB.
     Each session has exactly one current container at any point in time. Because the data dictionary in each container is separate, Oracle Database uses the data dictionary in the current container for name resolution and privilege authorization.
    

    当前会话正在进行的地方就是当前容器,可以是CDB的根目录,应用程序的根目录或者是一个PDB。任何一个会话在某一时间节点都只有一个当前容器,因为数据字典是独立的,Oracle只能使用当前容器中的数据字典进行解析或者授权。

2.常用操作:
2.1 查看当前会话容器
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
2.2 切换容器
SQL> alter session set container=CDB$ROOT;

Session altered.
2.3 查看有哪些pdb及状态
SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

     CON_ID       DBID NAME            OPEN_MODE
---------- ---------- --------------- ----------
         2 2631744085 PDB$SEED        READ ONLY
         3 2701353008 PDB             MOUNTED
2.4 打开一个pdb
SQL> alter pluggable database open;

Pluggable database altered.
3.使用注意:
3.1 创建用户问题:

  在CDB中创建用户必须以c##开头(common),意为公有用户,无法创建本地用户。而在PDB中只能创建本地用户,在CDB中创建公有用户默认是在所有的PDB中都创建了相同的用户。这也是为什么会遇到下面这个问题:


CDB 数据库内,创建用户并指定默认表空间,报错如下:

ORA-65048: error encountered when processing the current DDL statement in

pluggable database ORCLPDB

ORA-00959: tablespace \'test\' does not exist


现在看来问题很简单,先在CDB下创建了表空间,但是其他pdb并没有这个表空间,而创建用户又是默认给所有pdb也创建那么一定会报找不到这个表空间的错误,解决的话去别的pdb创建相同的表空间,数据文件存放在别的地方就行了。

3.2 授权问题:

如果授权中不指定参数container=all,那么你进行的授权只在当前会话下有效,切换会话就会失效





以上是关于Oracle12C新特性——CDB与PDB(待补充)的主要内容,如果未能解决你的问题,请参考以下文章

浅谈oracle 12C的新特性-CDB和PDB

浅谈oracle 12C的新特性-CDB和PDB

oracle12c的CDB与PDB

Oracle12cR2的CDB与PDB简单管理操作

Oracle 12C 新特性 - “可插拔数据库”功能

Oracle 12c 容器讲解