Oracle PDB 迁移与重定位
概述
PDB 重定位(Relocate)是将 PDB 从一个 CDB 移动到另一个 CDB 的最快方式,源 PDB 在整个过程中保持读写状态,业务基本不中断。
迁移方式对比
| 方式 | 停机时间 | 说明 |
|---|---|---|
| 重定位(Relocate) | 最短(秒级) | 在线复制,自动切换,推荐 |
| 拔出/插入(Unplug/Plug) | 分钟级 | 需关闭 PDB,适合离线迁移 |
| 远程克隆 | 无 | 克隆而非移动,源库保留 |
方式一:在线重定位(推荐)
前置条件
sql
-- 1. 源 CDB 必须开启本地撤销模式(19c 默认)
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';
-- 2. 保存源 PDB 状态(迁移完成后目标 PDB 自动恢复此状态)
ALTER PLUGGABLE DATABASE ALL SAVE STATE INSTANCES=ALL;
平台要求:
- 源和目标 CDB 字节序(endianness)相同
- 字符集兼容(目标 CDB 为 AL32UTF8 时无限制)
- 目标 CDB 安装的选项是源 CDB 的超集
操作步骤
第一步:在目标 CDB 创建数据库链接
sql
-- 连接到目标 CDB Root
CONNECT sys/password@target_cdb AS SYSDBA;
CREATE PUBLIC DATABASE LINK lnk2src
CONNECT TO c##admin
IDENTIFIED BY password
USING 'SOURCE_CDB';
链接用户需要具有 CREATE PLUGGABLE DATABASE 或 SYSOPER 权限。
第二步:执行重定位
sql
-- 基础语法
CREATE PLUGGABLE DATABASE pdb1
FROM pdb1@lnk2src
RELOCATE
AVAILABILITY MAX;
-- 带路径转换
CREATE PLUGGABLE DATABASE pdb1
FROM pdb1@lnk2src
RELOCATE
AVAILABILITY MAX
FILE_NAME_CONVERT=('/source_path/', '/target_path/');
AVAILABILITY 选项:
| 选项 | 适用场景 |
|---|---|
AVAILABILITY NORMAL |
共享或交叉注册的监听器环境(默认) |
AVAILABILITY MAX |
独立隔离的监听器网络,最短停机时间 |
第三步:监控迁移进度
sql
-- 查看 PDB 状态(迁移中为 RELOCATING)
SELECT PDB_NAME, OPEN_MODE, STATUS FROM CDB_PDBS WHERE PDB_NAME = 'PDB1';
-- 查看文件复制进度
SELECT * FROM V$SESSION_LONGOPS
WHERE OPNAME IN ('kpdbfCopyTaskCbk', 'kcrfremnoc');
第四步:打开目标 PDB
sql
-- 迁移完成后必须以读写模式打开
ALTER PLUGGABLE DATABASE pdb1 OPEN READ WRITE;
-- 验证
SELECT NAME, OPEN_MODE FROM V$PDBS WHERE NAME = 'PDB1';
第五步:立即备份
sql
-- 迁移后归档链断裂,必须立即备份
BACKUP DATABASE PLUS ARCHIVELOG;
方式二:拔出 / 插入(离线迁移)
适合不需要在线迁移、或跨字节序平台的场景。
拔出 PDB
sql
-- 在源 CDB 上执行
-- 先关闭 PDB
ALTER PLUGGABLE DATABASE salespdb CLOSE IMMEDIATE;
-- 拔出,生成 XML 描述文件
ALTER PLUGGABLE DATABASE salespdb UNPLUG INTO '/backup/salespdb.xml';
-- 验证 XML 文件(包含数据文件路径等信息)
SELECT * FROM TABLE(DBMS_PDB.DESCRIBE('/backup/salespdb.xml'));
检查兼容性
sql
-- 在目标 CDB 上检查
DECLARE
v_compatible BOOLEAN;
BEGIN
v_compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/backup/salespdb.xml');
IF v_compatible THEN
DBMS_OUTPUT.PUT_LINE('兼容');
ELSE
DBMS_OUTPUT.PUT_LINE('不兼容,请查看 PDB_PLUG_IN_VIOLATIONS');
END IF;
END;
/
插入 PDB
sql
-- 在目标 CDB Root 执行
CREATE PLUGGABLE DATABASE salespdb
USING '/backup/salespdb.xml'
COPY -- COPY/NOCOPY/MOVE
FILE_NAME_CONVERT=('/source/', '/target/')
TEMPFILE REUSE;
-- 打开并检查
ALTER PLUGGABLE DATABASE salespdb OPEN READ WRITE;
SELECT * FROM PDB_PLUG_IN_VIOLATIONS WHERE NAME = 'SALESPDB';
方式三:DBCA 命令行迁移
无交互方式,适合自动化脚本:
bash
dbca -silent \
-relocatePDB \
-sourceDB source_cdb \
-remotePDBName pdb1 \
-remoteDBConnString sourcehost:1521/source_cdb \
-remoteDBSYSDBAUserName sys \
-remoteDBSYSDBAUserPassword srcpwd \
-dbLinkUsername c##admin \
-dbLinkUserPassword adminpwd \
-sysDBAUserName sys \
-sysDBAPassword tgtpwd \
-pdbName pdb1_new
错误处理
sql
-- 迁移失败时查看 PDB 状态
SELECT PDB_NAME, STATUS FROM CDB_PDBS;
-- STATUS 可能为 UNUSABLE
-- UNUSABLE 的 PDB 只能删除后重建
DROP PLUGGABLE DATABASE pdb1 INCLUDING DATAFILES;
-- 清理源侧残留的 tombstone PDB
SELECT NAME, STATUS FROM V$CONTAINERS WHERE STATUS = 'RELOCATED';
DROP PLUGGABLE DATABASE tombstone_pdb;
最佳实践
✅ 推荐
- 迁移前在源 CDB 做全库备份
- 使用
AVAILABILITY MAX用于跨数据中心迁移 - 配置 Application Continuity + FAN(RAC 环境)
- 迁移完成后立即备份目标 PDB
- 验证应用连接正常后再清理源侧资源
❌ 避免
- 在共享 undo 模式下执行重定位
- 跨字节序平台直接重定位(需使用 Data Pump 导入导出)
- 迁移前未保存 PDB 服务状态
- 忽略字符集兼容性检查