Oracle PDB 迁移与重定位

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 DATABASESYSOPER 权限。

第二步:执行重定位

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 服务状态
  • 忽略字符集兼容性检查

相关推荐
原来是猿2 小时前
MySQL【索引下】
数据库·mysql
九章-2 小时前
国产时序数据库选型技术指南:从需求匹配到价值验证
数据库·时序数据库
江不清丶2 小时前
MySQL深分页原理与优化实践:从根因剖析到生产级解决方案
数据库·mysql
倔强的石头_2 小时前
核心交易系统国产化工程实践:Oracle PL、SQL 兼容性与 RAC 架构演进解析
数据库
炸炸鱼.2 小时前
MySQL 数据库核心操作手册
数据库·adb·oracle
ShineWinsu2 小时前
sqlite
jvm·数据库·oracle
慵懒的猫mi2 小时前
deepin UOS AI 助手接入钉钉(DingTalk)配置指南
linux·数据库·人工智能·ai·钉钉·deepin
海山数据库2 小时前
移动云大云海山数据库分页查询性能优化时间:从16s到2ms
数据库·oracle·性能优化·he3db·大云海山数据库