Oracle 19c CDB中如何创建PDB
适用范围
适用于Oracle 19c CDB
方案概述
主要介绍CDB创建的PDB常见方法。

实施步骤
一、在CDB中创建新的PDB的工具
• SQL*Plus
• SQL Developer
• Enterprise Manager Cloud Control
• Enterprise Manager Database Express
• Database Configuration Assistant (DBCA)
–clone from PDB seed
–Clone from an existing PDB
–Plug an unplugged PDB
(DBCA)从种子库PDB$SEED、现有PDB或通过插拔方式创建新的PDB
二、创建PDB的主要方式
1、基于 PDB$SEED快速创建PDB

使用PDB种子或应用程序种子的文件在CDB中创建PDB。此技术将与种子相关的文件复制到新位置,并将复制后的文件关联到新的PDB。这是默认的创建方式。其他技术则需要源数据库(PDB或非CDB)或XML文件。
使用 CREATE PLUGGABLE DATABASE 语句,通过 PDB 种子文件(PDB$SEED)在 CDB 中创建一个 PDB。
也可以使用此语句,通过应用程序种子文件或PDB种子文件在应用程序容器中创建应用程序PDB。
使用 CREATE PLUGGABLE DATABASE 语句,通过应用程序种子文件或 PDB 种子文件中的应用程序 PDB 文件来创建一个新的 PDB。
从PDB种子创建新的PDB几乎是瞬间完成的。该操作会将READONLY种子PDB中的数据文件复制到CREATE PLUGGABLE DATABASE语句中指定的目标目录。
它会创建诸如SYSTEM表空间,用于存储包含指向Oracle预定义对象的元数据的完整目录;SYSAUX表空间,用于存放本地辅助数据;以及UNDO表空间,用于存储本地回滚段。
它还会创建默认的 schemas 和公共用户,这些用户存在于PDB SEED中:SYS用户仍保留所有超级用户权限,SYSTEM用户则可管理该PDB。
同时,系统会创建一个本地用户(PDBA),并授予其本地PDB_DBA角色。在PDB的SYS用户未将权限授予本地PDB_DBA角色之前,新创建的PDBA只能连接到PDB,而无法执行其他操作。
此外,在一个 PDB 创建的时候, 会自动创建一个 PDB 同名的 Service
使用 FILE_NAME_CONVERT 子句
以具有 CREATE PLUGGABLE DATABASE 系统权限的普通用户身份连接到 CDB 根容器中:
```sql
本操作以sys用户连接到CDB中
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER admin1 IDENTIFIED BY p1 ROLES=(CONNECT) FILE_NAME_CONVERT = ('PDB$SEEDdir', 'PDB1dir');
- Oracle Managed Files-OMF方式
- PDB_FILE_NAME_CONVERT 参数
OMF方式:
1)DB_CREATE_FILE_DEST = '/u01/app/oradata/CDB1/pdb1'
SYS@CDB1> alter system set DB_CREATE_FILE_DEST='/u01/app/oradata/CDB1/pdb1';
System altered.
2)或者设置参数 PDB_FILE_NAME_CONVERT = '/u01/app/oradata/CDB1/pdbseed','/u01/app/oradata/CDB1/pdb1'
SYS@CDB1> alter system set PDB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/CDB1/pdbseed','/u01/app/oracle/oradata/CDB1/pdb1';
System altered.
使用CREATE PLUGGABLE DATABASE命令创建PDB1
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1_admin IDENTIFIED BY <password> ROLES=(CONNECT);
```
### 2、克隆PDB
克隆PDB是指依托源PDB或NON-CDB来创建一个新的PDB。
该技术可从源PDB或NON-CDB创建一个新的PDB。此过程会自动将新PDB插入到CDB中。
要使用此技术,您必须在 CREATE PLUGGABLE DATABASE 语句中指定源。
该源可以是以下任意一种:
* Local PDB
* PDB in a remote CDB
* Non-CDB
目标PDB是源PDB或NON-CDB的副本,该副本称为克隆PDB。
CREATE PLUGGABLE DATABASE 语句会将源数据库中的相关文件复制到新位置,并将这些文件关联到目标 PDB。当 CDB 处于 ARCHIVELOG 模式和本地回滚模式时,源 PDB 可以在克隆过程中以读写模式打开并正常运行。这种技术称为热克隆。
从克隆过程开始到结束期间生成的归档日志必须保留,以确保克隆过程顺利完成。这样做有助于避免克隆过程中出现错误。
* 本地克隆
可以通过执行 CREATE PLUGGABLE DATABASE 语句,并在 FROM 子句中指定一个本地 PDB 来克隆本地 PDB。
```sql
1)以READ ONLY方式(为了保证源和目标数据一致)
SQL> ALTER PLUGGABLE DATABASE PDB1 CLOSE;
SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN READ ONLY;
PDB1在只读模式克隆PDB PDB2
SQL> create pluggable database PDB2 from PDB1;
2)PDB1运行在LOCAL UNDO MODE模式下,可以进行HOT CLONE方式
SQL>SELECT property_name, property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED TRUE
PDB1可以是READ WRITE模式
SQL>select name,OPEN_MODE from v$pdbs;
NAME OPEN_MODE
-------------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
RCATPDB READ WRITE
HOT 克隆方式创建PDB PDB3
SQL> create pluggable database PDB3 from PDB1;
```
* 远程克隆
可以通过执行 CREATE PLUGGABLE DATABASE 语句,并在 FROM 子句中指定远程 PDB 的数据库链接,来克隆远程 PDB。
```sql
通过远程克隆方式完成将CDB1中的PDB1克隆到CDB2中
--在CDB1的操作
1)登录到CDB1的根容器中确保用户具有创建用户的权限
[oracle@19cdb01 ~]$sqlplus sys@cdb1 sys as sysdba
2)创建公共用户并授权
该用户是CDB1和CDB2两个容器之间建立dblink时使用,当然也可以只在目标PDB中创建本地用户,生产环境从管理角度创建公共用户便于管理
--创建公共用户c##remote_user_clone
SYS@CDB1> CREATE USER c##remote_user_clone identified by Oracle_2026 container=all;
User created.
--给公共用户c##remote_user_clone授权
SYS@CDB1> GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##remote_user_clone container=all;
Grant succeeded.
--验证c##remote_user_clone用户的权限
SYS@CDB1> select * from cdb_sys_privs where grantee = 'C##REMOTE_USER_CLONE';
GRANTEE PRIVILEGE ADM COM INH CON_ID
-------------------- ---------------------------------------- --- --- --- ----------
C##REMOTE_USER_CLONE CREATE PLUGGABLE DATABASE NO YES NO 1
C##REMOTE_USER_CLONE CREATE SESSION NO YES NO 1
C##REMOTE_USER_CLONE CREATE PLUGGABLE DATABASE NO YES YES 3
C##REMOTE_USER_CLONE CREATE SESSION NO YES YES 3
C##REMOTE_USER_CLONE CREATE PLUGGABLE DATABASE NO YES YES 6
C##REMOTE_USER_CLONE CREATE SESSION NO YES YES 6
--在CDB2的操作
1)登录到CDB1的根容器中确保用户具有创建用户的权限
[oracle@19cdb01 ~]$sqlplus sys@cdb2 sys as sysdba
2)创建DBLINK
SYS@CDB2>create database link link_cdb1 connect to c##remote_user_clone identified by <password> using 'cdb1';
Database link created.
验证DBLINK
SYS@CDB2>select sysdate from dual@link_cdb1;
3)通过远程克隆方式创建PDB PDB4
SQL>create pluggable database PDB4 from PDB1@link_cdb1;
```
* 克隆NON-CDB
NON-CDB的步骤与克隆远程PDB的步骤非常相似。
将19c NON-CDB xfdb 克隆到CDB1中
```sql
--在NON-CDB中操作
1)连接到19c NON-CDB xfdb中
SQL>sqlplus sys@xfdb sys as sysdba
2)创建用户并授权
--创建公共用户remote_user_clone
SYS> CREATE USER remote_user_clone identified by <password>;
User created.
--给用户remote_user_clone授权
SYS> GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_user_clone;
3)检查数据库归档模式
SQL> SELECT log_mode FROM v$database;
LOG_MODE
-----------
ARCHIVELOG
确保数据库运行在ARCHIVELOG模式下。
--在CDB1的操作
1)登录到CDB1的根容器中确保用户具有创建用户的权限
[oracle@19cdb01 ~]$sqlplus sys@cdb1 sys as sysdba
2)创建DBLINK
SQL> create database link link_xfdb connect to remote_user_clone identified by <password> using 'xfdb';
创建完对DBLINK进行验证确保正常。
3)通过克隆方式创建PDB pdbxf
SQL> CREATE PLUGGABLE DATABASE pdbxf FROM NON$CDB@link_xfdb ;
4)执行noncdb_to_pdb.sql脚本
SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
5)Open PDB pdbxf 到read/write模式
SQL>ALTER PLUGGABLE DATABASE pdbxf OPEN;
```
* refreshable clone PDB克隆可定时刷新 PDB
18c 开始有 Refreshable PDB Switchover 特性
CREATE PLUGGABLE DATABASE ... REFRESH MODE 语句用于克隆源 PDB,并将克隆实例配置为可刷新。刷新该克隆 PDB 可更新其内容,以包含自上次重做日志应用以来累积的重做数据。
手动模式
```sql
SQL> create pluggable databse <PDBNAME> from <SourceDB PDBNAME>@dblink refresh mode manual;
```
自动模式
```sql
SQL> create pluggable databse <PDBNAME> from <SourceDB PDBNAME>@dblink refresh mode every 120 minutes;2小时自动刷新1次
```
* 基于SNAPSHOT创建PDB
可以通过执行 CREATE PLUGGABLE DATABASE ... USING SNAPSHOT 语句,从 PDB 快照创建 PDB。
从PDB级别的快照创建克隆(ALTER PLUGGABLE DATABASE SNAPSHOT)。指定PDB快照的名称、SCN或时间戳。
PDB快照是PDB文件在某一时刻的副本。在创建快照时,源PDB可以是只读或可读可写的。当源PDB处于打开状态时创建的快照称为热克隆(hot clone)。
使用 CREATE PLUGGABLE DATABASE(或 ALTER PLUGGABLE DATABASE)中的 SNAPSHOT 子句手动创建快照,也可以使用 EVERY interval 子句自动创建。以下语句将创建一个名为 pdb1_wed_4_1201 的 PDB 快照:
SQL>ALTER PLUGGABLE DATABASE SNAPSHOT pdb1_wed_4_1201;
从PDB快照创建副本,在CREATE PLUGGABLE DATABASE语句中指定USING SNAPSHOT子句。例如,以下语句将名为pdb1_copy的PDB从名为pdb1_wed_4_1201的PDB级快照中克隆
```sql
SQL> CREATE PLUGGABLE DATABASE pdb1_copy FROM pdb1 USING SNAPSHOT pdb1_wed_4_1201;
```
* 创建和实现快照副本 PDB
可以从底层存储的快照中克隆PDB文件。PDB文件是稀疏的,但可以将其转为实体文件,从而创建一个独立的PDB。
```sql
SQL>CREATE PLUGGABLE DATABASE pdb1_snap_copy FROM pdb1 SNAPSHOT COPY;
```
* 创建Split Mirror克隆PDB
在 Oracle ASM 中,拆分镜像是指将某个时间点的媒体副本从主副本中分离出来。拆分后,对主副本的更新不会影响子副本。
1).通过SQL*Plus连接到 CDB 根容器。
2).执行 ALTER PLUGGABLE DATABASE ... PREPARE MIRROR COPY 语句来准备源 PDB。
3).执行 CREATE PLUGGABLE DATABASE ... FROM ... USING MIRROR COPY 语句,从源 PDB 创建一个克隆 PDB。
4).查询 V$ASM_DBCLONE_INFO 视图以查看源 PDB、克隆 PDB 与其文件组之间的关系。
### 3、通过通过插拔特性把 PDB 迁移到新 CDB
我们可以通过将未插拔的PDB插入CDB来创建PDB。
要插入一个 PDB,需使用 CREATE PLUGGABLE DATABASE 语句中的 USING 子句。该子句用于指定一个 XML 元数据文件或压缩归档文件(.pdb 文件)。
使用 CREATE PLUGGABLE DATABASE ... USING 语句来插入 PDB。
```sql
Unplug PDB1 from CDB1:
1). 以公共用户连接到CDB1根容器中确保具有ALTER PLUGGABLE DATABASE权限。
2). 确认 PDB1的状态是close 。
SQL>show pdbs
SQL> ALTER PLUGGABLE DATABASE pdb1
UNPLUG INTO 'xmlfile1';
3.从CDB1中删除PDB1(生产环境建议做好备份)。
Plug PDB1 into CDB2 :
1). 以公共用户连接到CDB2根容器中确保具有ALTER PLUGGABLE DATABASE权限。
2).基于生成xml文件来创建PDB
SQL> CREATE PLUGGABLE DATABASE pdb1 USING 'xmlfile1' NOCOPY;
3).打开PDB1
SQL>alter pluggable database PDB1 open;
Unplug和Plug 也可以基于DBCA工具来实施。
```
### 4、创建 Proxy PDB
代理PDB提供了对远程CDB中PDB的访问,类似于符号链接。通过引用另一个CDB中的PDB来创建代理PDB。
两个CDB需要满足
- UNDO是local undo 模式
SQL>SELECT property_name, property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED TRUE
- 数据库运行在ARCHIVELOG模式
SQL> SELECT log_mode FROM v$database;
LOG_MODE
-----------
ARCHIVELOG
```sql
在CDB1中创建PXPDB1代理PDB,该PDB作为视图引用CDB2中整个被代理的PDB1
SQL> CONNECT sys@cdb1 AS SYSDBA
SQL> CREATE PLUGGABLE DATABASE pxpdb1 AS PROXY
FROM pdb1@link_cdb2;
执行 PXPDB1 代理 PDB 中的所有语句,使其在 CDB2 的代理 PDB1 中执行。
SQL> CONNECT sys@pxpdb1 AS SYSDBA
SQL> ALTER PLUGGABLE DATABASE pxpdb1 OPEN;
SQL> SELECT * FROM app.c;
```
-the end-
笔者文章集合详见:
https://www.myhfxf.com
https://www.xiaofeihuangfu.com
CSDN:https://blog.csdn.net/xfhuangfu
ITPUB:https://blog.itpub.net/28373936/
微信公众号:xfhuangfu