• Oracle12C 新特性 —— CDB & PDB


    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

  • 相关阅读:
    Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题
    java JDK JRE 1.6,1.7,1.8各个版本版本下载链接
    window 10 企业版激活
    IntelliJ IDEA 缺少 javax 包 支持
    IntelliJ Idea 2017 免费激活方法
    url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介【转】
    【转载】 CUDA_DEVICE_ORDER 环境变量说明 ( ---------- tensorflow环境下的应用 )
    【转载】 TensorFlow tf.app&tf.app.flags用法介绍
    中国知网(cnki)上caj格式转pdf的方法 ----------------- 转载
    同时购入两台同款thinkpad笔记本电脑,分别使用同一账户激活office失败--------------解决方法(账户下有多个Office激活信息,重装后提示“许可证不正确或者最大激活次数”)
  • 原文地址:https://www.cnblogs.com/ruishine/p/14389500.html
Copyright © 2020-2023  润新知