导出non-cdb作为一个pdb到cdb中。(change a non-cdb to a pdb)

本文记录了一次将非CDB(Container Database)转换为PDB(Pluggable Database)的实际操作过程,包括导出非CDB为XML文件、解决导入过程中遇到的问题及最终成功导入的过程。

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

今天做cdb,pdb的另外一个实验。
就是将non-cdb作为一个pdb导入到cdb当中去。

我现在的库是cdb的库,所以需要切换成non-cdb。

export ORACLE_SID=testdb
SQL> show con_name;

CON_NAME
------------------------------
testdb

停止这个库,然后用read-only方式启动

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL>
SQL> startup open read only;
ORACLE instance started.

SQL>

导出non-cdb的信息到XML文件。

SQL> BEGIN
  2    DBMS_PDB.DESCRIBE(
  3      pdb_descr_file => '/tmp/db12c.xml');
  4  END;
  5  /

PL/SQL procedure successfully completed.

确认一下这个文件是否导出。

[root@localhost tmp]# ls -ltr
total 24
srwxr-xr-x 1 root   root        0 Mar  9 22:57 mapping-root
drwxr-xr-x 2 root   root     4096 Mar 10 02:27 image
drwx------ 2 root   root     4096 Mar 10 05:01 gconfd-root
drwxr-xr-x 2 oracle oinstall 4096 Mar 10 21:47 hsperfdata_oracle
**-rw-r--r-- 1 oracle oinstall 5686 Mar 10 21:47 db12c.xml**

好了,关闭这个non-cdb。

SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>

切换回cdb的testdb1.

export ORACLE_SID=testdb1

确认一下。

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT
SQL>

导入XML文件,嗯?出错了.

SQL> CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/db12c.xml'
  2    COPY
  3    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/testdb/', '/u01/app/oracle/oradata/TESTDB1/pdb2/');
CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/db12c.xml'
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database or pluggable database open for read-only access

状态是OPEN的啊,为什么。。。

SQL> CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/db12c.xml'
  2    COPY
  3    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/testdb/', '/u01/app/oracle/oradata/TESTDB1/pdb2/');
CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/db12c.xml'
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database or pluggable database open for read-only access


SQL> select status from v$instance;

STATUS
------------
OPEN

重启一下试试。

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.

Total System Global Area  838860800 bytes
Fixed Size                  2929936 bytes
Variable Size             562039536 bytes
Database Buffers          268435456 bytes
Redo Buffers                5455872 bytes
Database mounted.
Database opened.
SQL>

再次执行导入XML,成功了。。。

SQL> CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/db12c.xml'
  2    COPY
  3    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/testdb/', '/u01/app/oracle/oradata/TESTDB1/pdb2/');

Pluggable database created.

SQL>

看看文件系统。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB_PLUG_NOCOPY                MOUNTED
         4 PDB2                           MOUNTED
SQL>

SQL> select name from v$datafile where con_id=4;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/TESTDB1/pdb2/system01.dbf
/u01/app/oracle/oradata/TESTDB1/pdb2/sysaux01.dbf
/u01/app/oracle/oradata/TESTDB1/pdb2/users01.dbf

对比下文件大小

[oracle@localhost ~]$ ll /u01/app/oracle/oradata/testdb/
total 2435276
-rw-r----- 1 oracle oinstall   10371072 Mar 10 21:53 control01.ctl
-rw-r----- 1 oracle oinstall   10371072 Mar 10 21:53 control02.ctl
-rw-r----- 1 oracle oinstall   10371072 Mar 10 21:53 control03.ctl
-rw-r----- 1 oracle oinstall   52429312 Mar 10 21:44 redo01.log
-rw-r----- 1 oracle oinstall   52429312 Mar 10 21:45 redo02.log
-rw-r----- 1 oracle oinstall   52429312 Mar 10 21:44 redo03.log
-rw-r----- 1 oracle oinstall  545267712 Mar 10 21:45 sysaux01.dbf
-rw-r----- 1 oracle oinstall 1017126912 Mar 10 21:45 system01.dbf
-rw-r----- 1 oracle oinstall   79699968 Mar 10 04:49 temp01.dbf
-rw-r----- 1 oracle oinstall  707796992 Mar 10 21:45 undotbs01.dbf
-rw-r----- 1 oracle oinstall    5251072 Mar 10 21:45 users01.dbf
[oracle@localhost ~]$ ll /u01/app/oracle/oradata/TESTDB1/pdb2/
total 1532476
-rw-r----- 1 oracle oinstall  545267712 Mar 10 22:11 sysaux01.dbf
-rw-r----- 1 oracle oinstall 1017126912 Mar 10 22:11 system01.dbf
-rw-r----- 1 oracle oinstall   20979712 Mar 10 22:11 temp01.dbf
-rw-r----- 1 oracle oinstall    5251072 Mar 10 22:11 users01.dbf

主要的数据文件大小是一样的。


切换到这个pdb2,然后执行脚本noncdb_to_pdb.sql去清除不属于这个pdb的object,这里需要一段时间。

SQL> alter session set container=pdb2;

Session altered.

SQL>
SQL>
SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
....

PL/SQL procedure successfully completed.

看到清理程序已经完成了。

最后一步,启动PDB2。

SQL>
SQL> ALTER SESSION SET CONTAINER=pdb2;

Session altered.

SQL> ALTER PLUGGABLE DATABASE OPEN;

Pluggable database altered.

SQL> SELECT name, open_mode FROM v$pdbs;

NAME                           OPEN_MODE
------------------------------ ----------
PDB2                           READ WRITE

1 row selected.

SQL>
<think>嗯,用户需要将Oracle 19c的非CDB数据库迁移到CDB环境中,而且都是本地环境。这个问题涉及Oracle数据库架构的核心概念转换,需要谨慎处理。用户可能是个DBA,正在做数据库升级或整合,考虑到引用中提到了12c/19c的迁移经验,说明用户对Oracle新架构应该有一定了解。 从技术角度看,non-CDBCDB的迁移本质是"容器化改造",核心步骤分为准备、克隆、转换三阶段。引用[2]提到的克隆方式和引用[3]的noncdb_to_pdb.sql脚本是关键,必须确保源库处于只读状态保证数据一致性——这点在引用[3]的执行环境中也有体现。用户需要特别注意归档模式,如果源库没开归档,整个流程会失败。 考虑到用户是本地环境,网络传输不是瓶颈,但文件路径可能不同。在创建PDB时要像引用[2]那样显式指定CREATE_FILE_DEST,避免存储冲突。另外引用[4]的GoldenGate信息可能是干扰项,当前场景不需要。 用户可能没说的深层需求:想最小化停机时间。所以我在操作指南里强调了源库恢复读写的时间点,并建议在维护窗口操作。还应该提醒用户提前测试,毕竟noncdb_to_pdb.sql脚本执行时间可能很长(引用[3]提到"很长。。。等等")。 最后补充的注意事项其实比主流程更重要,比如字符集兼容性和PDB数量限制,这些在官方文档里容易忽略但实际会踩坑。特别是用户从19c non-CDB迁移,很可能遇到参数文件兼容问题,所以单独列出"清理遗留参数"的步骤。</think>以下是Oracle 19c非CDB数据库迁移到CDB的本地环境操作指南,结合引用内容整理关键步骤: ### 一、前期准备 1. **环境检查** - 确认源库(non-CDB)和CDB目标库均为19c版本 - 源库必须开启归档模式:`ALTER DATABASE ARCHIVELOG;`(若未开启需先转换) - 确保源库处于`READ WRITE`状态 2. **创建必要路径** 在CDB服务器创建PDB文件存储目录: ```sql ALTER SYSTEM SET DB_CREATE_FILE_DEST='/u01/oradata/CDB1/PDB_DATA' SCOPE=BOTH; ``` --- ### 二、迁移操作步骤 #### 步骤1:源库置为只读 ```sql -- 在源库执行 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE OPEN READ ONLY; ``` #### 步骤2:克隆PDB(核心步骤) ```sql --CDB的root容器执行 CREATE PLUGGABLE DATABASE newpdb FROM NON$CDB@source_db_link CREATE_FILE_DEST='/u01/oradata/CDB1/PDB_DATA' FILE_NAME_CONVERT=('源库数据路径','新PDB存储路径'); ``` > **关键说明**: > - `NON$CDB@source_db_link` 需提前配置源库的DB Link[^2] > - `FILE_NAME_CONVERT` 转换文件路径(本地环境可省略,由`CREATE_FILE_DEST`接管) #### 步骤3:执行PDB转换脚本 ```sql -- 切换到新PDB容器 ALTER SESSION SET CONTAINER=newpdb; -- 执行字典转换 @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql ``` > **注意**:此脚本执行时间较长(约10-30分钟),需耐心等待[^3] #### 步骤4:开启PDB并验证 ```sql ALTER PLUGGABLE DATABASE newpdb OPEN; -- 检查状态 SELECT name, open_mode FROM v$pdbs; ``` --- ### 三、迁移后操作 1. **源库恢复读写** ```sql -- 源库执行 SHUTDOWN IMMEDIATE; STARTUP; ``` 2. **PDB用户同步** 检查原用户权限是否迁移完整,重点验证: ```sql SELECT username FROM dba_users WHERE common='NO'; ``` --- ### ⚠️ 关键注意事项 1. **字符集兼容性** 源库与CDB的字符集、国家字符集必须一致,可通过以下命令检查: ```sql SELECT parameter, value FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); ``` 2. **PDB数量限制** 确认CDB许可证支持的PDB数量(标准版最多3个PDB) 3. **清理遗留参数** 删除源库参数文件中的`__data_transfer_cache_size`等non-CDB专用参数 --- ### 相关问题 1. 迁移后如何验证PDB数据的完整性? 2. 如果迁移过程中`noncdb_to_pdb.sql`脚本报错如何处理? 3. 如何将PDB回退到迁移前的状态? 4. 迁移后源库的监听配置需要调整吗? > 引用说明: > [^1]: 非CDB数据库与CDB架构的本质区别 > [^2]: 克隆命令语法参考 > [^3]: `noncdb_to_pdb.sql`脚本的执行要求与时长预估 > [^4]: 环境检查工具的使用示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值