3. PDB生命周期管理
PDB(Pluggable Database,可插拔数据库)是Oracle多租户架构中的核心交付单元。与传统的非CDB数据库不同,PDB可以在不重启CDB实例的前提下被创建、克隆、迁移和删除。理解PDB的生命周期管理,本质上就是掌握“如何把一套数据字典和用户数据装进一个可插拔容器,并让它按需上线或下线”。本节围绕创建PDB的四种主要方式、打开与关闭模式、以及删除PDB展开,重点说明每种方式的适用场景、关键参数和结果判断。
一、创建PDB的四种方式
创建PDB的核心思路是“获得一套完整的PDB数据文件与元数据”。根据数据来源不同,Oracle提供了四条路径:种子克隆、本地PDB克隆、远程克隆、插入未plugged的PDB。
1. 种子克隆(Seed Clone):以CDB中的种子PDB(PDB$SEED)为模板,创建一个全新的、只读模板派生出的空PDB。这是最常用的“从零开始”方式。语法如下:
CREATE PLUGGABLE DATABASE salespdb
ADMIN USER pdbadmin IDENTIFIED BY "Welcome_123"
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB1/pdbseed/',
'/u01/app/oracle/oradata/CDB1/salespdb/')
STORAGE (MAXSIZE 10G)
DEFAULT TABLESPACE salesdata
DATAFILE '/u01/app/oracle/oradata/CDB1/salespdb/salesdata01.dbf'
SIZE 500M AUTOEXTEND ON;
执行后,Oracle会复制种子文件到目标路径,并创建新的PDB。此时PDB处于MOUNT状态,需要显式打开。判断创建是否成功,可查询V$PDBS中NAME='SALESPdb'的记录,确认OPEN_MODE为MOUNTED,且CON_ID大于2。
2. PDB克隆(Local Clone):以同一个CDB中已存在的某个PDB为源,克隆出一个新PDB。适用于快速复制一套已有业务环境,例如从生产PDB克隆出测试PDB。关键点是源PDB必须处于OPEN或MOUNT状态,且克隆时建议使用CREATE PLUGGABLE DATABASE ... FROM ...语法:
CREATE PLUGGABLE DATABASE salespdb_test
FROM salespdb
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB1/salespdb/',
'/u01/app/oracle/oradata/CDB1/salespdb_test/')
PARALLEL 4;
克隆过程中,Oracle会复制源PDB的数据文件,并重新生成PDB GUID和DBID。克隆完成后,新PDB默认处于MOUNT状态。若源PDB处于OPEN状态,克隆期间源PDB仍可正常读写,但克隆出的数据是克隆开始时刻的一致性快照。
3. 远程克隆(Remote Clone):通过数据库链接(DBLINK)从另一个CDB中的PDB克隆到当前CDB。适用于跨服务器、跨CDB迁移或复制PDB。语法中需要指定FROM pdb_name@dblink:
CREATE PLUGGABLE DATABASE salespdb_remote
FROM salespdb@lnk_to_remote
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB2/salespdb/',
'/u01/app/oracle/oradata/CDB1/salespdb_remote/')
CREATE_FILE_DEST = '/u01/app/oracle/oradata/CDB1/salespdb_remote/';
远程克隆要求源PDB处于OPEN READ ONLY或OPEN状态,且DBLINK用户具有CREATE PLUGGABLE DATABASE权限。克隆过程中,数据通过DBLINK传输,因此网络带宽和延迟会直接影响耗时。完成后同样需要打开PDB。
4. 插入未plugged的PDB(Unplugged PDB Insert):先从一个CDB中UNPLUG一个PDB,生成一个XML元数据文件和对应的数据文件集,再将该PDB插入到另一个CDB中。这是PDB迁移的标准方式。操作分为两步:
-- 在源CDB中
ALTER PLUGGABLE DATABASE salespdb UNPLUG INTO '/tmp/salespdb.xml';
-- 在目标CDB中
CREATE PLUGGABLE DATABASE salespdb
USING '/tmp/salespdb.xml'
COPY
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB2/salespdb/',
'/u01/app/oracle/oradata/CDB1/salespdb/');
插入时可以选择COPY(复制数据文件)或MOVE(移动数据文件)。若源与目标平台字节序不同,还需要CONVERT子句。插入完成后,PDB处于MOUNT状态,需要打开并检查PDB_PLUG_IN_VIOLATIONS视图,确认没有未解决的违规项。
二、打开与关闭模式
PDB创建完成后处于MOUNT状态,此时数据文件已关联但未打开,用户无法连接。打开PDB使用ALTER PLUGGABLE DATABASE ... OPEN。PDB的打开模式主要有三种:
- MOUNTED:数据文件已关联,但未打开。可用于执行某些维护操作,如重命名数据文件、修改PDB属性。
- OPEN READ ONLY:只读打开。用户可查询,但不能写入。常用于源PDB作为克隆源时的状态,或报表类只读访问。
- OPEN READ WRITE:读写打开。正常业务状态,用户可执行DML和DDL。
打开命令示例:
ALTER PLUGGABLE DATABASE salespdb OPEN READ WRITE;
-- 或只读打开
ALTER PLUGGABLE DATABASE salespdb OPEN READ ONLY;
关闭PDB使用ALTER PLUGGABLE DATABASE ... CLOSE,可加IMMEDIATE立即关闭。关闭后PDB回到MOUNT状态。若需要让PDB随CDB启动自动打开,可配置保存状态:
ALTER PLUGGABLE DATABASE salespdb SAVE STATE;
-- 取消自动打开
ALTER PLUGGABLE DATABASE salespdb DISCARD STATE;
判断打开是否成功,可查询V$PDBS的OPEN_MODE列,或使用SHOW PDBS命令。若打开失败,常见原因包括:数据文件路径不存在、文件权限不足、PDB_PLUG_IN_VIOLATIONS中存在未解决项、或源PDB与目标CDB的字符集不兼容。
三、删除PDB
删除PDB使用DROP PLUGGABLE DATABASE。删除前必须确保PDB处于MOUNT或CLOSE状态,不能处于OPEN状态。若PDB当前打开,需先关闭。删除时可以选择是否同时删除数据文件:
ALTER PLUGGABLE DATABASE salespdb CLOSE IMMEDIATE;
DROP PLUGGABLE DATABASE salespdb INCLUDING DATAFILES;
INCLUDING DATAFILES会删除PDB对应的数据文件、临时文件和归档日志中的相关记录。若不指定该子句,数据文件会保留在文件系统中,但PDB元数据被删除,后续无法直接重新挂载。删除后,可查询V$PDBS确认该PDB记录已消失,同时检查CDB_PDBS视图。
四、生命周期管理的关键检查点
无论采用哪种创建方式,PDB生命周期管理都遵循“创建→打开→使用→关闭→删除”的主线。在实际操作中,建议关注以下检查点:
| 阶段 | 关键命令/视图 | 判断依据 |
|---|---|---|
| 创建后 | V$PDBS、CDB_PDBS |
OPEN_MODE=MOUNTED,CON_ID正确 |
| 打开前 | PDB_PLUG_IN_VIOLATIONS |
无未解决违规项 |
| 打开后 | V$PDBS.OPEN_MODE |
READ WRITE或READ ONLY |
| 删除前 | V$PDBS、文件系统 |
PDB已CLOSE,确认无依赖 |
| 删除后 | V$PDBS、CDB_PDBS |
记录消失,数据文件按需清理 |
掌握这四种创建方式与打开、关闭、删除操作,就具备了PDB生命周期管理的基本能力。实际工作中,种子克隆适合快速交付新环境,本地克隆适合测试复制,远程克隆适合跨库迁移,插入未plugged PDB适合离线迁移和版本升级场景。选择哪种方式,取决于数据来源、网络条件、停机窗口和平台兼容性。