当前位置: 代码迷 >> 综合 >> Oracle12C 新特性 —— CDB PDB
  详细解决方案

Oracle12C 新特性 —— CDB PDB

热度:46   发布时间:2024-01-03 14:37:53.0

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 默认安装实例 pdborcl

12C 数据库常用操作

1)连接到CDB数据库

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

  • $ sqlplus / as sysdba
$ sqlplus / as sysdba   //默认情况下使用sqlplus / as sysdba 登录连接的是CDBSQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 7 19:36:53 2021Copyright (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_nameCON_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 pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 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 ONLY3     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 容器 PDBORCLSession altered.SQL> show con_name;CON_NAME
------------------------------
PDBORCLSQL> alter session set container=CDB$ROOT; //切换至 CDB 容器 CDB$ROOTSession 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  MOUNTEDSQL> 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; //关闭PDBPluggable 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  MOUNTEDSQL>  alter pluggable database PDBORCL open; //启动PDBPluggable 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