Oracle中的插拔式数据库(CDB/PDB)
目录一、环境要求1.1.确认当前环境1.1.1.确认当前为CDB架构1.1.2.查看已有得PDB1.1.3.查看当前容器二、基础概念与术语三、实操练习3.1.创建一个全新的PDB最常用方式3.1.1.创建pdb时使用种子模板3.1.2.创建PDB时使用OMF自动管理3.1.3.两者的区别3.2.打开pdb3.3.切换到新创建的PDB3.3.1.查看当前环境3.2.在PDB中创建表空间、用户和表3.3.克隆一个已存在的PDB快速复制3.4.拔出一个PDB将PDB从CDB中分离3.5.插入一个PDB将已拔出的PDB接入另一个CDB3.6.使用Application Container高级主题四、常用管理操作4.1.查看PDB状态4.2.开关PDB4.3.设置PDB自动启动4.4.删除PDB五、进阶练习建议六、常见问题与排错一、环境要求Oracle 12c及以上版本数据库已安装且为CDB架构拥有 SYSDBA 或 SYSTEM 权限建议在测试环境如虚拟机中操作1.1.确认当前环境sqlplus / as sysdba1.1.1.确认当前为CDB架构select name,cdb,con_id,open_mode from v$database;注意nameprdcdb:即表示当前容器数据库CDB的名字cdbyes:明确表示这是一个容器数据库可支持多租户架构可容纳多个PDBcon_id:表示当前查询的视角是整个CDB根容器这里的0表示“整个CDB级别”open_moderead_write:说明整个CDB处于读写模式所有功能正常运行。如果 CDB 列为 YES说明是CDB架构。如果只有一个 PDB$SEED种子模板说明还没有任何用户PDB。1.1.2.查看已有得PDBselect pdb_id,pdb_name,status from dba_pdbs;或者show pdbs;1.1.3.查看当前容器select sys_context(USERENV,CON_NAME) as current_container from dual;或则show con_name;二、基础概念与术语官方解释The multitenant architecture enables an Oracle Database to be a container database. A container database (CDB) contains one or more user-created, pluggable databases and application containers. A pluggable database (PDB) is a portable collection of schemas, schema objects, and nonschema objects that appears to an application as a separate database. At the physical level, each pluggable database has its own set of data files that store the data for the pluggable database. The container database includes all the data files for the pluggable databases contained within it and a set of system data files that store metadata for the container database itself.多租户架构使Oracle数据库成为一个容器数据库。容器数据库CDB包含一个或多个用户创建的可插拔数据库和应用程序容器。可插拔数据库PDB是模式、模式对象和非模式对象的可移植集合在应用程序中表现为一个独立的数据库。在物理层面上每个可插拔数据库都有自己的一组数据文件用于存储可插拔数据库的数据。容器数据库包含其中所含可插拔数据库的所有数据文件以及一组用于存储容器数据库本身元数据的系统数据文件。核心术语术语解释CDB容器数据库是所有PDB的宿主包含根容器CDBROOT、种子容器PDBROOT、种子容器PDBSEED和所有用户自行创建的PDBPDB$SEED系统自带的种子模板用于快速创建新PDB只读状态不能进行修改CDB$ROOT根容器存储所有PDB共享的元数据和系统对象管理用户如SYS、SYSTEM在此操作PDB可插拔数据库对应用而言就是独立的完整数据库Application Container一个CDB中特殊的PDB可包含多个子PDB便于管理关联应用的数据三、实操练习3.1.创建一个全新的PDB最常用方式# 以sysdba的方式进行连接sqlplus / as sysdba# 在根容器下执行3.1.1.创建pdb时使用种子模板需指定管理员用户和文件路径create pluggable database pdb_demo admin user pdb_demo1 identified by pdbDemo123roles(DBA)file_name_convert(/u01/app/oracle/oradata/prdcdb/pdbseed/,/u01/app/oracle/oradata/pdb_demo1/);3.1.2.创建PDB时使用OMF自动管理注意如果路径不熟悉可以用OMFOracle Manged files自动管理create pluggable database pdb_demo2 admin user pdb_admin identified by pdbAdmin123 create_file_dest/u01/app/oracle/oradata/pdb_demo2/;create pluggable database pdb_demo3 admin user pdb_admin identified by pdbAdmin123 create_file_dest/u01/app/oracle/oradata/;注意CREATE_FILE_DEST就像一个“托管模式”你告诉 Oracle 新PDB放在哪个文件夹里剩下的文件命名和位置都由 Oracle 自动处理OMF即Oracle托管文件。创建的文件路径[oracleprdcdb01 oradata]$ ll 总用量 4 drwxr-x--- 2 oracle oinstall 111 6月 23 11:22 pdb_demo1 drwxr-xr-x 3 oracle oinstall 20 6月 23 11:34 pdb_demo2 drwxr-x--- 4 oracle oinstall 4096 6月 18 12:32 prdcdb drwxr-x--- 3 oracle oinstall 46 6月 23 11:37 PRDCDB [oracleprdcdb01 oradata]$ cd PRDCDB/ [oracleprdcdb01 PRDCDB]$ ll 总用量 0 drwxr-x--- 3 oracle oinstall 22 6月 23 11:37 54E444F8769615FDE0656864C5C81E9D [oracleprdcdb01 PRDCDB]$ cd 54E444F8769615FDE0656864C5C81E9D/ [oracleprdcdb01 54E444F8769615FDE0656864C5C81E9D]$ ll 总用量 0 drwxr-x--- 2 oracle oinstall 142 6月 23 11:37 datafile [oracleprdcdb01 54E444F8769615FDE0656864C5C81E9D]$ cd datafile/ [oracleprdcdb01 datafile]$ ll 总用量 696400 -rw-r----- 1 oracle oinstall 346038272 6月 23 11:37 o1_mf_sysaux_o3mzvp2z_.dbf -rw-r----- 1 oracle oinstall 262152192 6月 23 11:37 o1_mf_system_o3mzvp2s_.dbf -rw-r----- 1 oracle oinstall 67117056 6月 23 11:37 o1_mf_temp_o3mzvp30_.dbf -rw-r----- 1 oracle oinstall 104865792 6月 23 11:37 o1_mf_undotbs1_o3mzvp2z_.dbf [oracleprdcdb01 datafile]$ [oracleprdcdb01 datafile]$ [oracleprdcdb01 datafile]$ cd .. [oracleprdcdb01 54E444F8769615FDE0656864C5C81E9D]$ cd .. [oracleprdcdb01 PRDCDB]$ ll 总用量 0 drwxr-x--- 3 oracle oinstall 22 6月 23 11:37 54E444F8769615FDE0656864C5C81E9D drwxr-x--- 3 oracle oinstall 22 6月 23 11:41 54E444F8769715FDE0656864C5C81E9D [oracleprdcdb01 PRDCDB]$3.1.3.两者的区别对比维度CREATE_FILE_DESTFILE_NAME_CONVERT核心作用指定一个存放目录Oracle自动管理文件。指定一个路径映射规则手动精准控制文件位置语法create_file_dest/u01/app/oracle/oradata/注意这里不用括号file_name_convert(源路径,目标路径)是否需要提前创建目录不需要Oracle回自动创建。需要必须要手动创建目标目录否则会报错。文件命名方式Oracle自动生成唯一的文件名OMF方式。沿用源文件的名称或按指定的规则生成。一般不用适用范围仅适用于整个PDB的创建在create pluggable database命令中适用更为通用也常用预克隆PDB或数据文件迁移。易用性非常简单推荐单机、学习环境使用较为复杂需要了解文件路径结构适合精细化控制。如果你在使用ASM自动存储管理CREATE_FILE_DEST 可以指定一个磁盘组例如 DATA而 FILE_NAME_CONVERT 则需写成类似 (DATA/种子路径, DATA/新PDB路径) 的格式。3.2.打开pdbalter pluggable database pdb_demo open;3.3.切换到新创建的PDBalter session set containerpdb_demo;3.3.1.查看当前环境select name,con_id,open_mode from v$database;3.2.在PDB中创建表空间、用户和表为了整洁和方便管理需规划专门的房间USERS、DATA、INDEX 等表空间来分类存放不同数据信息。# 创建用户表空间create tablespace users datafile /u01/app/oracle/oradata/pdb_demo1/users.dbf size 500M autoextend on next 50M maxsize unlimited;# 创建普通用户并指定所使用的专门用户存储用户的表空间create user hr_ops identified by hrOps123 default tablespace users quota unlimited on users;# 创建业务数据存放的专用表空间create tablespace app_data datafile /u01/app/oracle/oradata/pdb_demo1/app_data.dbf size 500M autoextend on next 50M maxsize unlimited;# 授予基本权限grant connect,resource,create session to hr_ops ;grant create table,create sequence,create view to hr_ops ;# 切换到hr_ops 用户connect hr_ops/hrOps123pdb_demo# 创建测试表create table employees(emp_id number primary key,emp_name varchar2(100),hire_date date default sysdate);insert into employees(emp_id, emp_name) values(1, 张三);insert into employees(emp_id, emp_name) values(2, 李四);COMMIT;# 查询验证select * from employees;[oracleprdcdb01 admin]$ sqlplus hr_ops/hrOps123pdb_demo SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 23 14:32:03 2026 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL SQL create table employees(emp_id number primary key,emp_name varchar2(100),hire_date date default sysdate); Table created. SQL insert into employees(emp_id, emp_name) values(1, 张三); 1 row created. SQL SQL insert into employees(emp_id, emp_name) values(2,李四); 1 row created. SQL SQL set linesize 200; SQL select * from employees; EMP_ID EMP_NAME HIRE_DATE ---------- ---------------------------------------------------------------------------------------------------- ------------------ 1 张三 23-JUN-26 2 李四 23-JUN-26 SQL此时你已经在一个独立的数据库环境中操作与其他PDB完全隔离。3.3.克隆一个已存在的PDB快速复制克隆是PDB的核心优势之一可用于创建测试环境、开发环境等。# 切换到根容器sqlplus / as sysdba# 关闭PDB(克隆前需要处于只读模式)alter pluggable database pdb_demo close immediate;alter pluggable database pdb_demo open read only;# 克隆PDB(从pdb_demo克隆出pdb_clone)create pluggable database pdb_clonefrom pdb_demofile_name_convert(/u01/app/oracle/oradata/pdb_demo1/,/u01/app/oracle/oradata/pdb_clone/);# 打开克隆出的PDBalter pluggable database pdb_clone open;# 将源PDB恢复正常模式alter pluggable database pdb_demo close immediate;alter pluggable database pdb_demo open;# 克隆完成后验证数据是否完整alter session set containerpdb_demo;select * from hr_ops.employees;注意应该能看到张三、李四[oracleprdcdb01 admin]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 23 14:36:03 2026 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ WRITE NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED SQL SQL alter pluggable database pdb_demo close immediate; Pluggable database altered. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO MOUNTED 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED SQL SQL alter pluggable database pdb_demo open read only; Pluggable database altered. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED SQL SQL SQL create pluggable database pdb_clone 2 from pdb_demo 3 file_name_convert(/u01/app/oracle/oradata/pdb_demo1/,/u01/app/oracle/oradata/pdb_clone/); Pluggable database created. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED 8 PDB_CLONE MOUNTED SQL SQL alter pluggable database pdb_clone open; Pluggable database altered. SQL SQL alter session set containerpdb_clone; Session altered. SQL SQL CONNECT hr_ops/hrOps123pdb_demo Connected. SQL SQL set linesize 200 SQL select * from employees; EMP_ID EMP_NAME HIRE_DATE ---------- ---------------------------------------------------------------------------------------------------- ------------------ 1 张三 23-JUN-26 2 李四 23-JUN-26 SQL# 查看pdb的数据文件3.4.拔出一个PDB将PDB从CDB中分离拔出是迁移数据库的第一步。# 切换到根容器sqlplus / as sysdba;# 关闭需要拔出的pdbalter pluggable database pdb_clone unplug into /tmp/pdb_clone.xml;# 删除pdb(此时数据文件还在但CDB不再管理它)drop pluggable database pdb_clone keep datafiles;[oracleprdcdb01 admin]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 23 14:43:53 2026 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED 8 PDB_CLONE READ WRITE NO SQL SQL alter pluggable database pdb_clone unplug into /tmp/pdb_clone.xml; alter pluggable database pdb_clone unplug into /tmp/pdb_clone.xml * ERROR at line 1: ORA-65025: Pluggable database PDB_CLONE is not closed on all instances. SQL SQL alter pluggable database pdb_clone close immediate; Pluggable database altered. SQL SQL alter pluggable database pdb_clone unplug into /tmp/pdb_clone.xml; Pluggable database altered. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED 8 PDB_CLONE MOUNTED SQL SQL drop pluggable database pdb_clone keep datafiles; Pluggable database dropped. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED SQL SQL# 查看XML文件内容非必需但可以了解元数据cat /tmp/pdb_clone.xml拔出后pdb_clone的数据文件仍保存在磁盘上XML文件记录了它的元数据。你可以将这个文件夹和XML文件打包迁移到另一个CDB。3.5.插入一个PDB将已拔出的PDB接入另一个CDB这个操作让你体验PDB的“可插拔”特性。# 切换到根容器sqlplus / as sysdba# 检查是否存在同名的pdbselect pdb_name from dba_pdbs;# 插入pdb(将之前拔出的pdb_clone插回来)create pluggable database pdb_cloneusing /tmp/pdb_clone.xmlmovefile_name_convert(/u01/app/oracle/oradata/pdb_clone/,/u01/app/oracle/oradata/pdb_clone_new/);# 打开插入的PDBalter pluggable database pdb_clone open read write;# 验证数据完整性alter session set containerpdb_clone;select * from hr_ops.employees;SQL alter session set containerCDB$ROOT; Session altered. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED 8 PDB_CLONE MOUNTED SQL SQL drop pluggable database pdb_clone keep datafiles; Pluggable database dropped. SQL SQL show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PRDPDB01 MOUNTED 4 PDB_DEMO READ ONLY NO 5 PDB_DEMO2 MOUNTED 6 PDB_DEMO3 MOUNTED 7 PDB_DEMO4 MOUNTED SQL SQL SQL SQL create pluggable database pdb_clone using /tmp/pdb_clone.xml 2 move 3 file_name_convert(/u01/app/oracle/oradata/pdb_clone/,/u01/app/oracle/oradata/pdb_clone_new/); Pluggable database created. SQL SQL alter pluggable database pdb_clone open read write; Pluggable database altered. SQL SQL alter session set containerpdb_clone; Session altered. SQL SQL set linesize 200; SQL select * from hr_ops.employees; EMP_ID EMP_NAME HIRE_DATE ---------- ---------------------------------------------------------------------------------------------------- ------------------ 1 张三 23-JUN-26 2 李四 23-JUN-26 SQL注意使用move参数之后源文件夹里边的数据文件会被移动到新的路径。MOVE参数表示移动数据文件到新位置如果路径有变化。如果目标CDB的文件路径结构与源CDB相同可以用NOCOPY。eg:这里由于之前的文件改变了知晓这个用法就行了。3.6.使用Application Container高级主题当多个PDB共享同一套应用表结构时Application Container非常有用。# 创建应用容器本质上是一个特殊的PDBsqlplus / as sysdbacreate pluggable database app_containeradmin user app_admin identified by appAdmin123roles(dba);alter pluggable database app_container;# 安装应用种子创建一个共享的对象集合alter pluggable database application app_hr installbegin-- 创建共享表create table shared_employees(emp_id number,emp_name varchar2(100));end;/四、常用管理操作4.1.查看PDB状态# 切换到根容器查看所有的PDBselect pdb_id,pdb_name,status,open_mode from dba_pdbs order by pdb_id;# 查看当前pdbshow con_name;或者select sys_contect(USERENV,CON_NAME) from dual;前面已经说过。4.2.开关PDB# 打开alter pluggable database pdb_demo open;alter pluggable database pdb_demo open read only; --以只读方式打开# 关闭alter pluggable database pdb_demo close immediate; --立即断开所有连接alter pluggable database pdb_demo close; -- 等待活动事务完成4.3.设置PDB自动启动# 保存PDB的状态使其在CDB启动后自动打开alter pluggable database pdb_demo save state;# 取消自动启动alter pluggable database pdb_demo discard state;4.4.删除PDB# 先关闭PDBalter pluggable database pdb_demo close immediate;# 删除KEEP DATAFILES保留数据文件INCLUDING DATAFILES同时删除物理文件drop pluggable database pdb_demo including datafiles/keep datafiels;五、进阶练习建议跨CDB迁移在另一台服务器上安装Oracle将拔出的PDB文件夹和XML文件复制过去尝试插入到新的CDB中。使用数据泵迁移对比expdb/impd和插拔两种迁移方式的区别expdp system/managerpdb_demo fully directoryDATA_PUMP_DIR dumpfilepdb_export.dmp资源管理在CDB层面为PDB限制资源最大CPU、内存等ALTER SYSTEM SET CPU_COUNT2 CONTAINERpdb_demo;ALTER SYSTEM SET PGA_AGGREGATE_TARGET200M CONTAINERpdb_demo;备份恢复使用RMAN备份单个PDBrman target /BACKUP PLUGGABLE DATABASE pdb_demo;PDB刷新从另一个位置刷新PDB用于快速同步数据类似复制CREATE PLUGGABLE DATABASE pdb_refresh FROM pdb_source REFRESH MODE EVERY 60 MINUTES;六、常见问题与排错问题原因解决方法ORA-65040: operation not allowed from within a pluggable database在PDB内执行了只能在根容器执行的操作切换到根容器ALTER SESSION SET CONTAINERCDB$ROOT;ORA-65011: Pluggable database already openPDB已打开先关闭ALTER PLUGGABLE DATABASE xxx CLOSE;ORA-01537: cannot add file ... file already part of database文件路径冲突使用不同的数据文件路径或使用OMF无法打开PDB数据文件路径不正确在根容器下执行ALTER PLUGGABLE DATABASE xxx OPEN READ ONLY查看具体错误