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 创建四种方式的数据来源与目标关系 PDB$SEED 只读种子模板 本地已有 PDB 同 CDB 内源 PDB 远程 CDB 中的 PDB 通过 DBLINK 访问 Unplugged PDB XML + 数据文件 种子克隆 CREATE PLUGGABLE DATABASE 本地 PDB 克隆 FROM 本地 PDB 远程克隆 FROM PDB@DBLINK 插入未 Plugged PDB USING XML 元数据 目标 CDB 中的新 PDB 初始状态:MOUNTED 需显式 OPEN 检查 V$PDBS 检查 PDB_PLUG_IN_VIOLATIONS OPEN READ WRITE 所有方式创建后均需显式打开;远程克隆与插入方式需额外检查平台兼容性与违规项

二、打开与关闭模式

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是不可逆操作。执行前应确认已备份必要数据,并确认没有其他PDB或应用依赖该PDB中的对象。若只是临时下线,应使用CLOSE而非DROP。

四、生命周期管理的关键检查点

无论采用哪种创建方式,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适合离线迁移和版本升级场景。选择哪种方式,取决于数据来源、网络条件、停机窗口和平台兼容性。