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

轉換的方式可以使用 XML file 或者是 Remote Clone 。
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 則是透過 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; |
另一種 Clone 的方式可以使用 Refreshable Clone PDB ,在 Source Non-CDB 不是 Read Only 下,使用 Refreshable Clone PDB 來同步 Non-CDB 的資料,直到正式將 Non-CDB 轉換為 PDB 為止,此時 Source Non-CDB 必須為 archive log mode 才行。

直接從 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 |