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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:

       把 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 CDB下创建一个账号密码都为yqndmz的问题。首先,我得确认用户的环境是CDB(容器数据库),并且他们想要创建的是公共用户还是本地用户。通常情况下,如果没有特别说明,可能默认是公共用户,但需要确认。 然后,创建用户的基本语法是CREATE USER,但需要注意在CDB中需要指定CONTAINER子句,或者使用ALTER SESSION设置容器。用户可能没有提到具体在哪个PDB下创建,所以可能需要提醒他们连接到目标PDB,比如使用ALTER SESSION SET CONTAINER=PDB_NAME;。 接下来,密码的设置。用户要求账号和密码都是yqndmz,这可能需要检查密码的复杂度是否符合Oracle的默认策略。如果启用了密码验证函数,简单的密码可能会被拒绝,可能需要临时禁用验证或者使用更复杂的密码。 权限方面,新用户可能需要基本的连接权限,比如CREATE SESSION,否则无法登录。用户可能需要根据实际需求授予更多权限,比如RESOURCE或自定义角色。 外,如果用户是在根容器(CDB$ROOT)下创建公共用户,需要使用CREATE USER c##yqndmz IDENTIFIED BY yqndmz CONTAINER=ALL;,但这样用户名必须以C##开头。如果用户不想用这个前缀,可能需要创建本地用户在特定的PDB中,这时候需要先切换到目标PDB再创建用户。 最后,确保用户测试连接,验证账号是否创建成功,能否正常登录。如果遇到错误,比如ORA-65096,说明用户名不符合公共用户命名规则,需要调整。或者ORA-28000,密码太简单,需要处理密码策略问题。 总结步骤应该是:连接到CDB,切换到目标PDB,创建用户,授予权限,处理可能的密码策略问题,测试验证。需要将这些步骤清晰地告诉用户,并提醒可能的注意事项和常见错误。</think>在Oracle 19c CDB中创建账号需要区分**公共用户**(CDB级别)和**本地用户**(PDB级别)。以下是分步指南: --- ### 一、创建本地用户(适用于PDB) 1. **连接到根容器** ```sql sqlplus / as sysdba ``` 2. **切换到目标PDB** ```sql ALTER SESSION SET CONTAINER = <PDB名称>; -- 例如:ALTER SESSION SET CONTAINER = ORCLPDB1; ``` 3. **创建用户并设置密码** ```sql CREATE USER yqndmz IDENTIFIED BY yqndmz; ``` 4. **授予基本权限** ```sql GRANT CREATE SESSION TO yqndmz; -- 允许登录 GRANT RESOURCE TO yqndmz; -- 基础资源权限(可选) ``` --- ### 二、创建公共用户(CDB级别,需要特殊前缀) Oracle要求公共用户名必须以 `C##` 或 `c##` 开头: ```sql CREATE USER c##yqndmz IDENTIFIED BY yqndmz CONTAINER = ALL; ``` --- ### 三、可能遇到的问题 1. **ORA-65096: 公共用户名无效** **原因**:未使用 `C##` 前缀创建公共用户。 **解决**:添加前缀 `C##` 或改用本地用户。 2. **ORA-28000: 密码过于简单** **原因**:密码不符合复杂度策略。 **解决**: ```sql -- 临时禁用密码验证 ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; -- 再执行创建用户操作 ``` --- ### 四、验证账号 ```sql -- 查看用户是否创建成功 SELECT username FROM dba_users WHERE username LIKE '%YQNDMZ%'; -- 测试登录 conn yqndmz/yqndmz@<PDB服务名> ``` --- ### 总结 - **本地用户**:直接在PDB中创建,无前缀限制。 - **公共用户**:需以 `C##` 开头,作用于所有PDB。 - 密码策略问题需根据实际环境调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值