容器是多租户容器数据库(CDB)中模式、对象和相关结构的集合,在逻辑上应用程序将其显示为单独的数据库。
在 CDB 中,每个容器都有一个唯一的 ID 和名称,ROOT 和每个 PDB 都被视为一个容器。
PDB 隔离数据和操作,从用户或应用的角度来看,每个 PDB 看起来都是独立的数据库。

CDB ROOT 容器

ROOT 容器是所有 PDB 所属的模式、模式对象和非模式对象的集合。
每个 CDB 有且只有一个 ROOT 容器,被命名为 CDB$ROOT,用于存储管理 PDB 所需的系统元数据。

PDB

PDB 是用户创建的一组模式、对象和相关结构,在逻辑上对应用显示为单独的数据库。
每个 PDB 都归 sys 所有,sys 是 CDB 中的一个公共用户。

使用 PDB 可以实现以下目标:

  • 存储特定应用程序的数据
  • 将数据移动到其它 CDB
  • 在 PDB 中隔离授权

PDB 有单独的名称空间,对以下结构有影响:

  • 模式:一个 PDB 中包含的架构可能与另一个 PDB 中的架构同名,这两个模式可以表示不同的本地用户。
  • 对象:对象必须在 PDB 中具有唯一名称,而不是在 CDB 中的所有容器。

应用程序容器是 CDB 中一个可选的、用户创建的容器,用于存储一个或多个应用程序的数据和元数据,一个应用程序容器可以包含多个应用程序 PDB,并允许这些 PDB 共享元数据和数据。

多租户体系结构的好处:

  • 降低成本(共享进程、共享系统资源)
  • 更容易和更快速的数据和代码的移动
  • 更轻松管理和监控物理数据库
  • 分离数据和代码
  • 安全分离管理权限
  • 轻松性能调优

多租户体系结构对管理性的好处:

  • 更容易升级数据和代码
  • 更容易在服务器之间迁移
  • 防止 PDB 中的数据损坏
  • 能够在一个地方安装、管理和升级特定于应用程序的数据和元数据

CDB 中表空间和数据文件

CDB 的结构与非 CDB 相同,只是每个 PDB 都有自己的表空间集,包括自己的 SYSTEM、SYSAUX 和 undo 表空间。

CDB 和 PDB 管理

查看数据是否为 CDB:

1
2
3
4
5
SYS@orcl(CDB$ROOT)> select cdb from v$database;

CDB
---
YES

创建 PDB:

1
2
3
4
5
6
7
8
9
10
11
12
SYS@orcl(CDB$ROOT)> create pluggable database PDB3 admin user imxcai identified by 123;

Pluggable database created.

SYS@orcl(CDB$ROOT)> show pdbs;

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB3 MOUNTED

查询状态:

1
2
3
4
5
6
7
8
9
SYS@orcl(CDB$ROOT)> col pdb_name format a15
SYS@orcl(CDB$ROOT)> select pdb_name,status from cdb_pdbs;

PDB_NAME STATUS
--------------- ----------
PDB1 NORMAL
PDB$SEED NORMAL
PDB2 NORMAL
PDB3 NORMAL

如果状态为 NEED SYNC ,则需允许
为 PDB 修改名称:
要修改名称的 PDB 一定要处于 opend restricted 状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
SYS@orcl(CDB$ROOT)> select name,open_mode from v$pdbs;

NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
PDB3 READ WRITE

SYS@orcl(CDB$ROOT)> alter pluggable database PDB3 close immediate;

Pluggable database altered.

SYS@orcl(CDB$ROOT)> alter pluggable database PDB3 open restricted;

Pluggable database altered.

SYS@orcl(CDB$ROOT)> select name,restricted from v$pdbs;

NAME RES
--------------- ---
PDB$SEED NO
PDB1 NO
PDB2 NO
PDB3 YES

SYS@orcl(CDB$ROOT)> conn sys/oracle@localhost:1521/PDB3 as sysdba
Connected.
SYS@localhost:1521/PDB3(PDB3)> alter pluggable database PDB3 rename global_name to PDB3_new;

Pluggable database altered.

SYS@localhost:1521/PDB3(PDB3)> alter pluggable database close immediate;

Pluggable database altered.

SYS@localhost:1521/PDB3(PDB3)> conn / as sysdba
Connected.
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3_new open;
Pluggable database altered.

SYS@orcl(CDB$ROOT)> select name, open_mode from v$pdbs;

NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
PDB3_NEW READ WRITE

PDB 删除:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3_NEW close immediate;

Pluggable database altered.

SYS@orcl(CDB$ROOT)> drop pluggable database PDB3_NEW including datafiles;

Pluggable database dropped.

SYS@orcl(CDB$ROOT)> select name,open_mode from v$pdbs;

NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE