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 Seed | Application 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;
3.2 远程克隆(通过 DB Link)
-- 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. 最佳实践
- 使用 OMF:简化文件管理
- PDB$SEED 不修改:保持模板干净
- 克隆用 Hot Clone:12.2+ 在线克隆
- Refresh 用于 Dev/Test:自动同步
- Application Container:SaaS 多租户
- 服务名与 PDB 一致:清晰标识
- UNDO 模式 LOCAL(19c+):独立 UNDO
- 资源计划限制:避免争抢
- 定期检查违规:pdb_plug_in_violations
- 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