Ruishine  

CDB 和 PDB关系介绍

 Oracle 12C引入了CDB与PDB的新特性。
 在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个 CDB(Container Database:数据库容器) 承载多个 PDB(Pluggable Database:可插拔数据库 )。

 在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。但ORACLE 12C,实例与数据库可以是一对多的关系。

 下面是官方文档中 CDB 与 PDB 的关系图:
在这里插入图片描述
 在12.2版本中,Oracle对多租户功能进行了增强,在CDB Root 容器中可以创建一个叫做Application Root 的容器,可在其内创建多个依赖于 Application root 的 Application PDBs,架构图如下:
在这里插入图片描述
CDB包含如下组件:

  • ROOT组件
     ROOT又叫 CDB$ROOT , 存储着 ORACLE 提供的元数据和 Common User ,元数据的一个例子是ORACLE 提供的 PL/SQL 包的源代码,Common User 是指在每个容器中都存在的用户。

  • SEED组件
     Seed 又叫 PDB$SEED,这个是你创建 PDBS 数据库的模板,你不能在 Seed 中添加或修改一个对象。一个 CDB 中有且只能有一个 Seed 。 类似于 SQL Server 中的model数据库。

  • PDBs
     CDB 中可以有一个或多个 PDBs,PDBs 向后兼容,可以像以前在数据库中那样操作 PDBs,这里指大多数常规操作。

 这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个 PDB 是一个容器。每个容器在 CDB 中都有一个独一无二的的 ID 和名称。

 CDB 相当于操作系统,调用并管理各个 PDB。PDB 相当于真正提供业务需求的数据库实例。
 oracle 12C 安装后只创建了 CDB,需要自己生成相应的 PDB。oracle 12C 使用了CDB-PDB架构,类似于Docker,在 CDB 内可以加载多个 PDB 。我们平时的数据库操作大多和 PDB 相关 。

 其实 CDB-PDB 架构和 SQL Server 的单实例多数据库架构有些类似。可以把 PDB$SEED 类比成master、msdb 等系统数据库,PDBs 可类比成用户自己创建的数据库。并且 PDB 可插拔的概念与 SQL Server 中用户数据库的分离、附加也有相似支持。

 Oracle Database 12.1 版本安装的时候会默认安装一个名称为 pdborcl 的实例(Oracle Database 12.2 版本默认名是orclpdb),具体安装本文不做赘述 。
在这里插入图片描述
图 Oracle 12.1 默认安装实例

12C 数据库常用操作

1)连接到CDB数据库

连接到CDB数据库容器非常简单,跟之前版本连接数据库是一样的

  • $ sqlplus / as sysdba
$ sqlplus / as sysdba   //默认情况下使用sqlplus / as sysdba 登录连接的是CDB

SQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 7 19:36:53 2021

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

2)查看数据库是否为CDB

  • SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;
  • SQL> select name, decode(cdb, 'NO', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;

说明:YES表示该数据库是 CDB ,如果是 NO 表示是 NO-CDB (普通数据库)

例:

SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;

NAME      Multitenant Option         OPEN_MODE                CON_ID
--------- -------------------------- -------------------- ----------
STUDY     Multitenant Option enabled READ WRITE                    0
SQL>  select name, decode(cdb, 'NO', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;

NAME      Multitenant Option         OPEN_MODE                CON_ID
--------- -------------------------- -------------------- ----------
STUDY     Regular 12c Database:      READ WRITE                    0

3)查看当前容器(Container)

  • SQL> show con_name
  • SQL> select sys_context('userenv', 'con_name') "Container DB" from dual;

例:

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> select sys_context('userenv', 'con_name') "Container DB" from dual;

Container DB
--------------------------------------------------------------------------------
CDB$ROOT

4)查看CDB容器中的PDBs信息(在CDB模式下)

  • SQL> show pdbs
  • SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

例:

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBORCL                        READ WRITE NO

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

    CON_ID    DBID          GUID                         NAME       OPEN_MODE
---------- ---------- --------------------------------------------------------
     2     3012372808 BABBD7C6CEFE76EEE055E3D5AC69F4C3  PDB$SEED    READ ONLY
     3     1862374014 BABBF75EF6217B0EE055E3D5AC69F4C3  PDBORCL     READ WRITE                  

5)在容器间切换
说明:使用这个命令需要的sysdba级别的权限

  • SQL> alter session set container=容器名;

例:

SQL> show con_name; //查看当前容器

CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=PDBORCL; //切换至 PDB 容器 PDBORCL

Session altered.

SQL> show con_name;

CON_NAME
------------------------------
PDBORCL

SQL> alter session set container=CDB$ROOT; //切换至 CDB 容器 CDB$ROOT

Session altered.

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

6)启动/关闭 PDB

  • SQL> alter pluggable database PDB_NAME open; //开启指定 PDB
  • SQL> alter pluggable database all open; //开启所有 PDB
  • SQL> alter session set container=PDB_NAME; //切换到 PDB 后开启数据库
    SQL> startup
  • SQL> alter pluggable database PDB_NAME close; //关闭指定的PDB
  • SQL> alter pluggable database all close; //关闭所有PDB
  • SQL> alter session set container=PDB_NAME; //切换到 PDB 后关闭数据库
    SQL> shutdown immediate

补充:启动或者关闭多个 PDB,指定的名称为一个以逗号分隔的列表。

例:

SQL> alter session set container=PDBORCL;

SQL> shutdown immediate  //关闭PDB
Pluggable Database closed.

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

    CON_ID DBID    GUID                               NAME    OPEN_MODE
---------- ---------- -------------------------------------------------
      3 1862374014 BABBF75EF6217B0EE055E3D5AC69F4C3  PDBORCL  MOUNTED

SQL> startup   //启动PDB
Pluggable Database opened.

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

    CON_ID DBID    GUID                               NAME    OPEN_MODE
---------- ---------- -------------------------------------------------
      3 1862374014 BABBF75EF6217B0EE055E3D5AC69F4C3  PDBORCL  READ WRITE

SQL> alter pluggable database PDBORCL close; //关闭PDB

Pluggable database altered.

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

    CON_ID DBID    GUID                               NAME    OPEN_MODE
---------- ---------- -------------------------------------------------
      3 1862374014 BABBF75EF6217B0EE055E3D5AC69F4C3  PDBORCL  MOUNTED

SQL>  alter pluggable database PDBORCL open; //启动PDB

Pluggable database altered.

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

    CON_ID DBID    GUID                               NAME    OPEN_MODE
---------- ---------- -------------------------------------------------
      3 1862374014 BABBF75EF6217B0EE055E3D5AC69F4C3  PDBORCL  READ WRITE

7)启动/关闭 CDB

  • SQL> shutdown immediate //关闭
  • SQL> startup //启动
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 3288334336 bytes
Fixed Size                  2929744 bytes
Variable Size            1895828400 bytes
Database Buffers         1375731712 bytes
Redo Buffers               13844480 bytes
Database mounted.
Database opened.

8)创建/克隆 PDB
说明:创建或克隆前要指定文件映射的位置(需要CBD下sysdba权限)
例:

SQL> alter system set db_create_file_dest='/oradata/app/oracle/orcl/orcl2';
  • 创建一个新的 PDB(需要CBD下sysdba权限)
SQL> create pluggable database orcl2 admin user admin identified by oracle;//创建 PDB orcl2
SQL> alter pluggable database orcl2 open;   //打开 PDB orcl2
  • 克隆PDB(需要CBD下sysdba权限)
SQL> create pluggable database orcl2 from orcl1; //由 orcl1 克隆 orcl2
SQL> alter pluggable database orcl2 open; //打开 orcl2

9)删除PDB(需要CBD下sysdba权限)

SQL> alter pluggable database  orcl2 close;  //关闭 PDB orcl2
SQL> drop pluggable database orcl2 including datafiles;  //删除PDB orcl2

10)设置 CDB 启动 PDB 自动启动(需要CBD下sysdba权限)

使用如下触发器:

CREATE OR REPLACE TRIGGER open_pdbs
AFTER STARTUP ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
END open_pdbs;
/

参考文章:
https://blog.csdn.net/qq_41262248/article/details/107734533?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
https://www.cnblogs.com/sonnyBag/p/11557952.html

posted on 2021-02-08 16:52  夜光兔  阅读(669)  评论(0编辑  收藏  举报