Oracle PDB 创建与克隆

Oracle PDB 创建与克隆

适用版本:Oracle Database 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

PDB(Pluggable Database) 创建方式多样[1]:

方式说明
从 PDB$SEED 创建默认方式
克隆现有 PDB本地或远程
插入已拔出 PDB迁移场景
从 Non-CDB 转换升级到多租户
从 Application SeedApplication Container

2. 从 PDB$SEED 创建

2.1 基本语法

CREATE PLUGGABLE DATABASE hrpdb 
  ADMIN USER pdbadmin IDENTIFIED BY ****** 
  DEFAULT TABLESPACE users 
  DATAFILE '/u01/oradata/orcl/hrpdb/users01.dbf' SIZE 500M
  PATH_PREFIX = '/u01/oradata/orcl/hrpdb/'
  FILE_NAME_CONVERT = ('/u01/oradata/orcl/pdbseed/', '/u01/oradata/orcl/hrpdb/');

2.2 OMF 自动管理文件名

-- 启用 OMF
ALTER SYSTEM SET db_create_file_dest='/u01/oradata' SCOPE=BOTH;

-- 创建(无需指定文件名)
CREATE PLUGGABLE DATABASE hrpdb 
  ADMIN USER pdbadmin IDENTIFIED BY ******

2.3 打开 PDB

ALTER PLUGGABLE DATABASE hrpdb OPEN;
ALTER PLUGGABLE DATABASE hrpdb SAVE STATE;

3. 克隆现有 PDB

3.1 本地克隆

-- 克隆本地 PDB
CREATE PLUGGABLE DATABASE hrpdb_clone FROM hrpdb
  FILE_NAME_CONVERT = ('/u01/oradata/orcl/hrpdb/', '/u01/oradata/orcl/hrpdb_clone/');

-- 打开
ALTER PLUGGABLE DATABASE hrpdb_clone OPEN;
-- 1. 在源库配置 tnsnames
HRPDB_SOURCE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = src-host)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = hrpdb))
  )

-- 2. 在目标库创建 DB Link
CREATE DATABASE LINK src_link 
  CONNECT TO system IDENTIFIED BY ****** 
  USING 'HRPDB_SOURCE';

-- 3. 远程克隆
CREATE PLUGGABLE DATABASE hrpdb_new FROM hrpdb@src_link
  FILE_NAME_CONVERT = ('/u01/oradata/src/hrpdb/', '/u01/oradata/orcl/hrpdb_new/');

-- 4. 打开
ALTER PLUGGABLE DATABASE hrpdb_new OPEN;

3.3 12.2+ Hot Clone(在线克隆)

-- 12.2+ 支持源 PDB 处于 READ WRITE 时克隆
-- 源 PDB 无需 READ ONLY

-- 在线克隆
CREATE PLUGGABLE DATABASE hrpdb_clone FROM hrpdb@src_link;

-- 源 PDB 可正常使用

3.4 18c+ PDB Refresh(自动刷新)

-- 创建可刷新 PDB
CREATE PLUGGABLE DATABASE hrpdb_ref FROM hrpdb@src_link REFRESH MODE EVERY 60 MINUTES;

-- 手动刷新
ALTER PLUGGABLE DATABASE hrpdb_ref REFRESH;

-- 切换为 READ WRITE(不可逆)
ALTER PLUGGABLE DATABASE hrpdb_ref REFRESH MODE NONE;

4. 插入已拔出 PDB

4.1 拔出 PDB

-- 拔出 PDB(生成 manifest 文件)
ALTER PLUGGABLE DATABASE hrpdb UNPLUG INTO '/tmp/hrpdb.xml';

-- 关闭 PDB
ALTER PLUGGABLE DATABASE hrpdb CLOSE;

-- 删除 PDB(保留文件)
DROP PLUGGABLE DATABASE hrpdb KEEP DATAFILES;

4.2 检查兼容性

SET SERVEROUTPUT ON
DECLARE
  compatible BOOLEAN := FALSE;
BEGIN
  compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
    pdb_descr_file => '/tmp/hrpdb.xml',
    pdb_name => 'hrpdb');
  IF compatible THEN
    DBMS_OUTPUT.PUT_LINE('Compatible');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Incompatible - check pdb_mismatch');
  END IF;
END;
/

-- 查看不兼容项
SELECT message, status 
FROM pdb_plug_in_violations 
WHERE name='HRPDB' AND status <> 'RESOLVED';

4.3 插入 PDB

-- NOCOPY:使用原文件路径
CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml' NOCOPY;

-- COPY:复制到新路径
CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml'
  SOURCE_FILE_NAME_CONVERT=('/u01/oradata/src/hrpdb/','/u01/oradata/orcl/hrpdb/')
  FILE_NAME_CONVERT=('/u01/oradata/src/hrpdb/','/u01/oradata/orcl/hrpdb/')
  COPY;

-- MOVE:移动到新路径
CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml'
  SOURCE_FILE_NAME_CONVERT=('/u01/oradata/src/hrpdb/','/u01/oradata/orcl/hrpdb/')
  MOVE;

5. 从 Non-CDB 转换

5.1 准备 Non-CDB

-- Non-CDB 必须是 12c+
-- 以 READ ONLY 打开
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;

-- 生成 manifest
EXEC DBMS_PDB.DESCRIBE('/tmp/noncdb.xml');

5.2 插入到 CDB

-- 插入
CREATE PLUGGABLE DATABASE ncdb USING '/tmp/noncdb.xml' COPY;

-- 打开(需升级)
ALTER PLUGGABLE DATABASE ncdb OPEN UPGRADE;

-- 执行转换脚本
ALTER SESSION SET CONTAINER = ncdb;
@?/rdbms/admin/noncdb_to_pdb.sql

-- 重启 PDB
ALTER PLUGGABLE DATABASE ncdb CLOSE;
ALTER PLUGGABLE DATABASE ncdb OPEN;

6. Application Container

6.1 创建 Application Root

-- 创建 Application Root
CREATE PLUGGABLE DATABASE approot AS APPLICATION USER admin IDENTIFIED BY ******

-- 切换到 Application Root
ALTER SESSION SET CONTAINER = approot;

6.2 安装 Application

ALTER SESSION SET CONTAINER = approot;

-- 开始安装
ALTER PLUGGABLE DATABASE APPLICATION app_sales BEGIN INSTALL 'v1.0';

-- 创建共享对象
CREATE TABLE app_sales.shared_lookup (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
) SHARED=METADATA;

-- 结束安装
ALTER PLUGGABLE DATABASE APPLICATION app_sales END INSTALL;

6.3 创建 Application PDB

-- 创建 Application Seed
CREATE PLUGGABLE DATABASE appseed AS APPLICATION SEED;

-- 创建 Application PDB
CREATE PLUGGABLE DATABASE app_sales_pdb1 ADMIN USER admin IDENTIFIED BY ******

-- 同步 Application
ALTER PLUGGABLE DATABASE app_sales_pdb1 SYNC;

7. PDB 配置

7.1 服务名

-- 创建服务
ALTER SESSION SET CONTAINER = hrpdb;
EXEC DBMS_SERVICE.CREATE_SERVICE('hrpdb', 'hrpdb');
EXEC DBMS_SERVICE.START_SERVICE('hrpdb');

7.2 表空间

-- 切换到 PDB
ALTER SESSION SET CONTAINER = hrpdb;

-- 创建表空间
CREATE TABLESPACE users DATAFILE SIZE 1G AUTOEXTEND ON;
CREATE TEMPORARY TABLESPACE temp TEMPFILE SIZE 500M;

7.3 默认表空间

ALTER DATABASE DEFAULT TABLESPACE users;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;

8. PDB 拔出与迁移

8.1 拔出

-- 拔出 PDB
ALTER PLUGGABLE DATABASE hrpdb UNPLUG INTO '/tmp/hrpdb.xml';
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
DROP PLUGGABLE DATABASE hrpdb KEEP DATAFILES;

8.2 复制文件

# 复制数据文件
scp /u01/oradata/orcl/hrpdb/*.dbf new-host:/u01/oradata/orcl/hrpdb/
scp /tmp/hrpdb.xml new-host:/tmp/

8.3 插入新 CDB

CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml'
  SOURCE_FILE_NAME_CONVERT=('/u01/oradata/orcl/hrpdb/','/u01/oradata/orcl/hrpdb/')
  NOCOPY;

9. 监控 PDB

9.1 PDB 列表

SELECT 
  con_id, 
  name, 
  open_mode, 
  restricted, 
  open_time 
FROM v$pdbs;

9.2 PDB 容器

-- CDB 中的容器
SELECT con_id, dbid, name, open_mode 
FROM v$containers;

9.3 PDB 违规项

SELECT time, name, cause, status, message 
FROM pdb_plug_in_violations 
ORDER BY time DESC;

10. 常见坑与排错

10.1 ORA-65005: 文件名缺失

现象:创建 PDB 时报 ORA-65005。

修复

-- 1. 使用 FILE_NAME_CONVERT
CREATE PLUGGABLE DATABASE hrpdb 
  ADMIN USER pdbadmin IDENTIFIED BY ****** 
  FILE_NAME_CONVERT = ('/u01/oradata/orcl/pdbseed/', '/u01/oradata/orcl/hrpdb/');

-- 或 2. 启用 OMF
ALTER SYSTEM SET db_create_file_dest='/u01/oradata' SCOPE=BOTH;

10.2 ORA-65028: 无法克隆到自身

现象:克隆 PDB 失败。

修复:使用不同名称。

10.3 ORA-65122: PDB 不存在

现象:操作 PDB 报错。

修复

-- 1. 检查 PDB 列表
SELECT name, open_mode FROM v$pdbs;

-- 2. 检查容器
SELECT sys_context('USERENV','CON_NAME') FROM dual;

-- 3. 切换到 CDB$ROOT
ALTER SESSION SET CONTAINER = CDB$ROOT;

10.4 克隆 PDB 失败 ORA-65169

现象:远程克隆失败。

修复

-- 源 PDB 必须以 READ ONLY 打开(12.2 之前)
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
ALTER PLUGGABLE DATABASE hrpdb OPEN READ ONLY;

10.5 PDB 状态未保存

现象:CDB 重启后 PDB 处于 MOUNT。

修复

ALTER PLUGGABLE DATABASE hrpdb OPEN;
ALTER PLUGGABLE DATABASE hrpdb SAVE STATE;

11. 最佳实践

  1. 使用 OMF:简化文件管理
  2. PDB$SEED 不修改:保持模板干净
  3. 克隆用 Hot Clone:12.2+ 在线克隆
  4. Refresh 用于 Dev/Test:自动同步
  5. Application Container:SaaS 多租户
  6. 服务名与 PDB 一致:清晰标识
  7. UNDO 模式 LOCAL(19c+):独立 UNDO
  8. 资源计划限制:避免争抢
  9. 定期检查违规:pdb_plug_in_violations
  10. PDB 备份独立:RMAN 单独备份

12. 参考资料

[1] Oracle Multitenant Administrator’s Guide 19c, “Creating and Removing PDBs” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/creating-and-removing-pdbs.html

[2] Oracle Multitenant Administrator’s Guide 19c, “Cloning a PDB” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/cloning-a-pdb.html