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