ORACLE 19C PDB从一个CDB近零停机迁移到另一个CDB

本文详细描述了如何在Oracle环境中,从CDB1将PDB1热迁移到CDB2,包括设置DBLINK连接、创建用户权限、模拟操作、创建新PDB以及处理可能遇到的错误。

目标:

       把 PDB1从CDB1 热迁移到CDB2

前提:
    1.两个CDB 开启归档
    2.两个CDB 本地UNDO
    3.要求用于DBLINK 的连接用户(源端),必须有CREATE PLUGGABLE DATABASE ,sysoper 权限

环境:
  源端:cdb1
 目标端:cdb2

操作步骤:


1. 源端创建DBLINK连接需要的用户,并授予必须的权限 


   登陆到源端 cdb1

   [oracle@dbserver ~]$ . oraenv
   ORACLE_SID = [cdb1] ? 
   The Oracle base remains unchanged with value /u01/app/oracle
   [oracle@dbserver ~]$ sqlplus /nolog

   SQL*Plus: Release 19.0.0.0.0 - Production on Sun Oct 22 16:37:55 2023
   Version 19.20.0.0.0
   
   Copyright (c) 1982, 2022, Oracle.  All rights reserved.

   @ >conn / as sysdba
   
   SYS@cdb1 >show pdbs

       CON_ID CON_NAME                       OPEN MODE  RESTRICTED
   ---------- ------------------------------ ---------- ----------
            2 PDB$SEED                       READ ONLY  NO
            3 PDB1                           READ WRITE NO
   SYS@cdb1 >

   SYS@cdb1 >create user c##relocate identified by oracle_4U;
   SYS@cdb1 >grant create session,create pluggable database to c##relocate container=all;
   SYS@cdb1 >grant sysoper to c##relocate container=all;

2. 目标端创建连接到源端的DBLINK 


  登陆到源端 cdb2 
  [oracle@dbserver ~]$ . oraenv
  ORACLE_SID = [cdb2] ? 
  The Oracle base remains unchanged with value /u01/app/oracle
  [oracle@dbserver ~]$ sqlplus /nolog
  @ >conn / as sysdba
  
  SYS@cdb2 >

  SYS@cdb2 >create database link link_cdb1
    2      connect to c##relocate
    3      identified by oracle_4U
    4        using 'cdb1'  
    5      ;

  Database link created.


3.模拟有用户在源端PDB1上操作 


    登陆源端 CDB1上PDB1

  [oracle@dbserver admin]$ sqlplus /nolog

  SQL*Plus: Release 19.0.0.0.0 - Production on Sun Oct 22 16:43:15 2023
  Version 19.20.0.0.0

  @ >CONN SYSTEM/oracle_4U@pdb1_cdb1     

  SYSTEM@pdb1_cdb1 >create table test_relocate(create_date date);

  SYSTEM@pdb1_cdb1 >insert into test_relocate values(sysdate);

  SYSTEM@pdb1_cdb1 >

4. 使用RELOCATE创建PDB


    登陆到源端 cdb2 
   
   SYS@cdb2 >create pluggable database pdb1
   2     from pdb1@link_cdb1
   3     relocate
   4     ;

   提示:使用OMF

  SYS@cdb2 >show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB2                           READ WRITE NO
           4 PDB1                           MOUNTED
  SYS@cdb2 >


5.打开目标端PDB1之前,查看一下源端PDB1状态

  SYS@cdb1 >show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           READ WRITE NO

  而且模拟客户端可以正常执行DML操作
   SYSTEM@pdb1_cdb1 >alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';

  SYSTEM@pdb1_cdb1 >select * from test_relocate;

  CREATE_DATE
  -------------------
  2023-10-22 16:43:59

  SYSTEM@pdb1_cdb1 >insert into test_relocate values(sysdate);

  SYSTEM@pdb1_cdb1 >select * from test_relocate;

  CREATE_DATE
  -------------------
  2023-10-22 16:43:59
  2023-10-22 16:48:45

  SYSTEM@pdb1_cdb1 >


6.打开目标端PDB1

SYS@cdb2 >alter pluggable database pdb1 open;

SYS@cdb2 >SHOW pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB2                           READ WRITE NO
         4 PDB1                           READ WRITE NO
SYS@cdb2 >

7.检查源端PDB及客户端链接

--源端PDB1已经没有
SYS@cdb1 > show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
SQL> 

客户端报错
SYSTEM@pdb1_cdb1 >r
  1* select * from test_relocate
ERROR:
ORA-03114: not connected to ORACLE


SYSTEM@pdb1_cdb1 >conn system/oracle_4U@pdb1_cdb1

SYSTEM@pdb1_cdb1 >select * from test_relocate;

no rows selected

--发现迁移前,没有提交的数据,都回滚了。

附:

1.报错信息1:

*
ERROR at line 1:
ORA-17628: Oracle error 1031 returned by remote Oracle server
ORA-01031: insufficient privileges

解决:
grant sysoper to system container=all;

2.报错信息2:


  1   create pluggable database pdb1
  2     from pdb1@link_cdb1
  3*    relocate
 create pluggable database pdb1
*
ERROR at line 1:
ORA-65122: Pluggable database GUID conflicts with the GUID of an existing
container.

<think>嗯,用户想了解Oracle 19c中PDBCDB的区别,之前我问过相关特性但用户需要更系统的对比。根据提供的四个引用,关键点已经很清晰了。 用户引用的材料里,引用[1]和[2]对核心概念解释得很到位:CDB是容器外壳,PDB是独立数据库单元。特别注意到引用[1]强调PDB的可插拔特性——这是与传统数据库最本质的区别。引用[2]补充了用户管理体系的分层,这个细节对DBA管理权限很重要。 考虑到用户上次的问题涉及操作错误(引用[3]提到19c用户创建位置混淆),说明实际运维中容易踩坑。所以复时需要突出两点:架构差异带来的管理变化,以及常见操作陷阱。比如引用[3]的例子正好说明CDB用户和PDB用户创建语法的区别,这个实操细节必须包含。 引用[4]关于实例和数据库的说明可以简化处理,重点保持CDB/PDB的主线。不过其中"实例独立于数据库存在"的概念可以引申到CDB实例与PDB文件的关系上,这样能强化架构理解。 最后用户身份推测是中级DBA——既熟悉传统Oracle架构,又需要适应多租户场景。相关问题的设计要侧重实战:版本迁移、资源隔离这些生产环境高频需求都得覆盖。性能优化虽然没直接问,但资源分配冲突是多租户核心痛点,必须作为延伸问题提出。 </think>在 Oracle 19c 的多租户架构中,**CDB(Container Database)** 和 **PDB(Pluggable Database)** 是核心概念,二者的主要区别如下: ### 📌 1. **架构角色** - **CDB(容器数据库)** 作为**根容器**,不存储业务数据,仅管理元数据和公共资源(如后台进程、内存结构)。所有 PDB 必须插入到 CDB 中运行[^1][^2]。 *示例:* 一个 CDB 实例可同时托管多个 PDB(如 `HR_PDB`、`FIN_PDB`)。 - **PDB(可插拔数据库)** 是**业务数据载体**,包含独立的数据文件(如表空间、控制文件)、Schema 对象(表、索引等)。对应用程序而言,PDB 功能等同于传统独立数据库[^1][^3]。 ### 👥 2. **用户管理** | **类型** | **CDB 用户** | **PDB 用户** | |----------------|----------------------------------|----------------------------------| | 作用范围 | 跨容器公有用户(`COMMON USER`) | 仅限当前 PDB(`LOCAL USER`) | | 创建语法 | `CREATE USER C##ADMIN IDENTIFIED BY pwd` | `CREATE USER LOCAL_ADMIN IDENTIFIED BY pwd` | | 权限管理 | 管理 CDB 及所有 PDB | 仅管理所属 PDB | | *典型场景* | 监控整个 CDB 的 DBA | 应用专属数据库管理员[^2][^3] | ### ⚙️ 3. **运维特性** - **PDB 的可插拔性** - PDB 可在不同 CDB 间**动态拔出(UNPLUG)** 和**插入(PLUG)**,无需数据迁移。 - *操作示例:* ```sql ALTER PLUGGABLE DATABASE sales_pdb UNPLUG INTO '/u01/pdb/sales_pdb.xml'; -- 将文件复制到目标 CDB 后 -- CREATE PLUGGABLE DATABASE sales_pdb USING '/u01/pdb/sales_pdb.xml'; ``` - **资源隔离与共享** - CDB 统一分配内存/SGA 等资源,PDB 通过 **PDB$SEED**(模板库)快速克隆新库[^1]。 - 可通过 `DBMS_RESOURCE_MANAGER` 限制单个 PDB 的 CPU、I/O 用量。 ### 🔧 4. **配置文件与实例** - **CDB 层** 管理 `SPFILE`、`REDO Logs` 和 `UNDO 表空间`,所有 PDB 共享同一实例进程[^4]。 - **PDB 层** 拥有独立的 `TNSNAME` 配置,应用程序通过专属服务名(如 `hr_pdb.local`) 连接,**感知不到其他 PDB 存在**[^1][^3]。 ### 💎 核心对比总结 | **维度** | **CDB** | **PDB** | |-----------------|----------------------------------|----------------------------------| | 数据存储 | 仅元数据 | 业务数据文件与对象 | | 用户可见性 | 对应用透明 | 作为独立数据库暴露给应用 | | 运维单元 | 管理整个容器集群 | 独立备份/恢复/升级 | | 资源分配 | 全局资源池 | 可限制配额的分区 | > ⚠️ **典型误区**: > 在 CDB 中创建用户时,若未指定容器(`ALTER SESSION SET CONTAINER = pdb_name;`),默认会创建公有用户(`C##`前缀),导致 PDB 连接失败[^3]。 --- ### ❓ 相关问题 1. **如何在 Oracle 19c 中克隆一个 PDB?** 2. **CDBPDB 的备份策略有何差异?** 3. **多租户架构下,如何监控单个 PDB 的性能瓶颈?** 4. **PDB 迁移一个 CDB 时需要注意哪些兼容性问题?** [^1]: PDB 作为独立数据载体,可插拔特性实现灵活管理。 [^2]: CDB 用户与 PDB 用户的权限分离保障了多租户安全性。 [^3]: 19c 需显式指定 PDB 容器创建本地用户,避免命名冲突。 [^4]: CDB 实例管理共享资源,PDB 仅依赖文件集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值