2025年7月25日 星期五

4. Migrate Non-CDB to PDB

傳統 Non-CDB 的資料庫架構可以轉換為 PDB 架構 :

A drawing of a cylinder

AI-generated content may be incorrect.


轉換的方式可以使用 XML file 或者是 Remote Clone 。


  • 使用 XML file

Non-CDB 可以透過 DBMS_PDB 這個 Package 產生出 XML file ,然後於 CDB 上使用此 XML file 來建立 PDB 來達到 Non-CDB 轉 PDB 的目的。


在使用 DBMS_PDB 之前必須將 Non-CDB 開啟為 Read Only :

Open Non-CDB ORA19c to Read Only Mode :

SQL> shutdown immediate

SQL> startup mount

SQL> alter database open read only;

SQL> select name,open_mode from v$database;

NAME                        OPEN_MODE

--------------------------- ------------------------------

ORA19C                      READ ONLY


執行 DBMS_PDB.DESCRIBE 產出 XML 檔案 :

SQL> begin

      dbms_pdb.describe(

       pdb_descr_file => '/tmp/ora19c.xml');

     end;

     /

PL/SQL procedure successfully completed.


使用此 XML 檔案於 CDB 建立新的 PDB :

SQL> create pluggable database pora19 using '/tmp/ora19c.xml' file_name_convert=('/u01/oradata/ORA19C','/u01/oradata/ORAPDB/pora19');

Pluggable database created.

SQL> show pdbs

CON_ID CON_NAME               OPEN MODE  RESTRICTED

---------- ------------------------------ ------------------- -----------------

         2 PDB$SEED                   READ ONLY  NO

         3 PDB1                           READ WRITE NO

         4 PDB2                           READ WRITE NO

         7 PORA19                    MOUNTED

         8 RPDB                           READ WRITE NO


於新的 PDB 執行 noncdb_to_pdb.sql 更新 PDB 相關的 Data Dictionary 完成轉換 :

SQL> alter session set container=pora19;

SQL> @?/rdbms/admin/noncdb_to_pdb.sql


Open PDB to READ WRITE MODE

SQL> alter pluggable database pora19 open;


如果 PDB 開啟後 RESTRICTED 為 YES ,則需檢查 pdb_plug_in_violations 並修正錯誤才可以算完成轉換。

SQL> select time,name,cause,type,status,message,action from pdb_plug_in_violations;


  • 使用 Remote Clone

Remote Clone 則是透過 DB Link 的方式將 Non-CDB 建立為 PDB 。

首先於 CDB 建立 DB Link 至來源端的 Non-CDB ,來源端用來作為 DB Link 的使用者必須要有 create pluggable database 的權限 :

Grant create pluggable database to user on Source Non-CDB:

SQL> grant create pluggable database to system;


Create database link from CDB to Non-CDB

SQL> create public database link non_cdb_to_pdb connect to system identified by oracle using 'ora19c';


同樣將來源端的 Non-CDB 開啟至 Read Only :

Open Non-CDB ORA19c to Read Only Mode :

SQL> shutdown immediate

SQL> startup mount

SQL> alter database open read only;


於 CDB 透過 DB Link 建立 PDB :

SQL> create pluggable database pora192 from ora19c@non_cdb_to_pdb file_name_convert=('/u01/oradata/ORA19C','/u01/oradata/ORAPDB/pora192');

Pluggable database created.


於新的 PDB 執行 noncdb_to_pdb.sql完成轉換 :

SQL> alter session set container=pora192;

SQL> @?/rdbms/admin/noncdb_to_pdb.sql

SQL> alter pluggable database pora192 open;


  • 使用 Refreshable Clone PDB

另一種 Clone 的方式可以使用 Refreshable Clone PDB ,在 Source Non-CDB 不是 Read Only 下,使用 Refreshable Clone PDB 來同步 Non-CDB 的資料,直到正式將 Non-CDB 轉換為 PDB 為止,此時 Source Non-CDB 必須為 archive log mode 才行。

A diagram of a data transfer

AI-generated content may be incorrect.


直接從 CDB 透過 DB Link 建立 Refreshable PDB :

SQL> create pluggable database pora193 from ora19c@non_cdb_to_pdb file_name_convert=('/u01/oradata/ORA19C','/u01/oradata/ORAPDB/pora193') refresh mode manual;


refresh mode manual 表示手動執行 refresh 動作,查詢 dba_pdbs 可以檢查目前狀態 :


PDB 必須在 mount 狀態下才可以進行 refresh ,使用 alter pluggable database <pdb_name> refresh 來進行 refresh :

SQL> alter pluggable database pora193 refresh;

Pluggable database altered.


在同步過程中可以隨時開啟 PDB 為 Read Only 來檢查資料是否有正確同步,檢查完畢後再將 PDB 回歸 mount 繼續進行同步 :

SQL> alter pluggable database pora193 open read only;

SQL> alter pluggable database pora193 close immediate;

SQL> alter pluggable database pora193 refresh;


除了手動進行 refresh 外,也可以設定自動 refresh 的間隔時間,例如設定每 1 分鐘同步一次 :

SQL> alter pluggable database pora193 refresh mode every 1 minutes;

Pluggable database altered.


到了 Non-CDB 要正式切換為 PDB 時,就可以停止同步並執行 noncdb_to_pdb.sql :

SQL> alter pluggable database pora193 refresh mode none;

Pluggable database altered.

SQL> alter session set container=pora193;

SQL> @?/rdbms/admin/noncdb_to_pdb.sql


當設定 refresh mode 為 none 時,表示已經切斷同步,此時就不可以再恢復到同步狀態。


執行完 noncdb_to_pdb.sql 後將 PDB 開啟至 READ WRITE MODE 完成切轉。

SQL> alter pluggable database pora193 open;


SQL> show pdbs;


CON_ID CON_NAME           OPEN MODE  RESTRICTED

---------- ------------------------------ ------------------ -------------------

         2 PDB$SEED                   READ ONLY   NO

         3 PDB1                           READ WRITE NO

         4 PDB2                           READ WRITE NO

         9 PORA193                  READ WRITE NO