首页 > 数据库 > Oracle > Oracle 19c CDB中如何创建PDB
适用范围
适用于Oracle 19c CDB
方案概述
主要介绍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种子或应用程序种子的文件在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);
克隆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;
通过远程克隆方式完成将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中操作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;
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次
SQL> CREATE PLUGGABLE DATABASE pdb1_copy FROM pdb1 USING SNAPSHOT pdb1_wed_4_1201;
SQL>CREATE PLUGGABLE DATABASE pdb1_snap_copy FROM pdb1 SNAPSHOT COPY;
我们可以通过将未插拔的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工具来实施。
代理PDB提供了对远程CDB中PDB的访问,类似于符号链接。通过引用另一个CDB中的PDB来创建代理PDB。

两个CDB需要满足
在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/ ,如需转载,请注明出处,否则将追究法律责任。