ITPub博客

首页 > 数据库 > Oracle > Oracle 19c CDB中如何创建PDB

Oracle 19c CDB中如何创建PDB

原创 Oracle 作者:xfhuangfu 时间:2026-08-12 16:36:16 0 删除 编辑

适用范围
适用于Oracle 19c CDB
方案概述
主要介绍CDB创建的PDB常见方法。
Image.png
实施步骤

一、在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

Image.png
使用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 根容器中:

本操作以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命令创建PDB1SQL> 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。

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。
通过远程克隆方式完成将CDB1中的PDB1克隆到CDB2中--在CDB1的操作1)登录到CDB1的根容器中确保用户具有创建用户的权限
[oracle@19cdb01 ~]$sqlplus sys@cdb1 sys as sysdba
2)创建公共用户并授权
该用户是CDB1和CDB2两个容器之间建立dblink时使用,当然也可以只在目标PDB中创建本地用户,生产环境从管理角度创建公共用户便于管理--创建公共用户c##remote_user_cloneSYS@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           1C##REMOTE_USER_CLONE CREATE SESSION                           NO  YES NO           1C##REMOTE_USER_CLONE CREATE PLUGGABLE DATABASE                NO  YES YES          3C##REMOTE_USER_CLONE CREATE SESSION                           NO  YES YES          3C##REMOTE_USER_CLONE CREATE PLUGGABLE DATABASE                NO  YES YES          6C##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.
验证DBLINKSYS@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中
--在NON-CDB中操作1)连接到19c NON-CDB xfdb中
SQL>sqlplus sys@xfdb sys as sysdba
2)创建用户并授权--创建公共用户remote_user_cloneSYS> 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> create pluggable databse <PDBNAME> from <SourceDB PDBNAME>@dblink refresh mode manual;

自动模式

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> CREATE PLUGGABLE DATABASE pdb1_copy FROM pdb1 USING SNAPSHOT pdb1_wed_4_1201;
  • 创建和实现快照副本 PDB
    可以从底层存储的快照中克隆PDB文件。PDB文件是稀疏的,但可以将其转为实体文件,从而创建一个独立的PDB。
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。

Unplug PDB1 from CDB1:
1). 以公共用户连接到CDB1根容器中确保具有ALTER PLUGGABLE DATABASE权限。2). 确认 PDB1的状态是close 。SQL>show pdbsSQL> ALTER PLUGGABLE DATABASE pdb1
UNPLUG INTO 'xmlfile1';
3.从CDB1中删除PDB1(生产环境建议做好备份)。
Plug PDB1 into CDB2 :
1). 以公共用户连接到CDB2根容器中确保具有ALTER PLUGGABLE DATABASE权限。2).基于生成xml文件来创建PDBSQL> 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。
image.png

两个CDB需要满足

  • UNDO是local undo 模式
  • 开启了ARCHIVELOG模式
在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-


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28373936/viewspace-3179621/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Xiaofei Huangfu Oracle DBA,Oracle ACE Oracle 19c OCM12c OCM,11g OCM MySQL 5.6,5.7,8.0 OCP 18年以上IT从业经验,有丰富的数据库和开发领域经验,多年Oracle运维经验和java开发经验。

注册时间:2013-09-05

  • 博文量
    151
  • 访问量
    231216