2025年11月25日 星期二

8. Pluggable Database 備份與還原

  • Backup

Pluggable Database 備份的方式與傳統的 Non-CDB 備份方式無異,不同的是 Multitenant 架構下

有分為 CDB 的備份與 PDB 的備份,一般情況下於 CDB 層級執行 backup database 會將 CDB 以及

底下的所有 PDB 一起備份,例如於 CDB 執行 full backup ,包含 CDB$ROOT 以及全部的 PDB 都會

一起備份 :

$ rman target /

RMAN> 

run {

crosscheck backup;

crosscheck archivelog all;

allocate channel ch1 type disk;

allocate channel ch2 type disk;

delete noprompt obsolete;

backup database format '/u02/backup/fulldb_%s_%t';

sql 'alter system archive log current';

backup archivelog all format '/u02/backup/archivelog_%t_%s_%p' delete input;

backup current controlfile format '/u02/backup/controlfile_%s_%t';

backup spfile format '/u02/backup/spfile_%T_%U';

release channel ch1;

release channel ch2;

}


 如果只要備份 PDB 可以使用 backup pluggable database 單獨備份 PDB :

備份 Pluggable database PDB1 :

RMAN> backup pluggable database pdb1 format '/u02/backup/pdb1_%s_%t';

備份 CDB$ROOT 與 PDB1 :

RMAN> backup pluggable database "CDB$ROOT",PDB1 format '/u02/backup/pdb1_%s_%t';


由於 PDB 必須要有外層的 CDB 才能夠存在,因此備份的時候比較不會只單獨備份 PDB ,

至少會備份 CDB$ROOT 加上所需要的 PDB ,這樣還原的時候才不會因為沒有 CDB$ROOT 

造成 PDB 無法還原。


如果是需要 Duplicate 整個 CDB ,可以使用 skip pluggable database 排除某些 PDB 不要進行 duplicate ,

不一定整個 CDB 底下的所有 PDB 都進行 duplicate :

Duplicate CDB 排除 PDB_ROOT,PDB_APP1,PDB_APP2 :

$ rman target /

RMAN> connect auxiliary sys/welcome1@cdb2

run {

 allocate auxiliary channel ch1 type disk;

 allocate auxiliary channel ch2 type disk;

 duplicate database to cdb2;

 skip pluggable database PDB_ROOT,PDB_APP1,PDB_APP2;

 nofilenamecheck;

 }


  • Restore

Restore 整個 CDB 的方式與原本還原 Non-CDB 的方式無異。如果只是將 PDB restore 至原本的 CDB 

只需要簡單的執行 restore pluggable database 就可以了 :

還原 PDB2 至原本的 CDB :

$ sqlplus / as sysdba

SQL> alter pluggable database pdb2 close abort;

$ rman target /

RMAN> restore pluggable database pdb2;

RMAN> recover pluggable database pdb2;

RMAN> exit;

$ sqlplus / as sysdba

SQL> alter pluggable database pdb2 open;


這邊要注意的是,如果執行了 drop pluggable database 命令之後,就沒有辦法簡單的使用 restore 來還原了,

例如執行了 drop pluggable database PDB2 將 PDB2 drop ,此時就無法直接 restore 了,因為執行了 drop 

命令之後,這個 PDB 的 metadata 已不存在 CDB ,此時如果再執行 restore pluggable database 便會出現 

RMAN-06813: could not translate pluggable database PDB2 錯誤 :

A screen shot of a computer screen

AI-generated content may be incorrect.


這個時候只能使用 PDB PITR (Point In Time Recovery) 來進行還原,它的原理是利用備份先還原到 

auxiliary destination ,然後再將 PDB unplug / plug 回來,例如使用 PITR 來還原 PDB2 :

還原 PDB2 至原本的 CDB :

$ rman target /

RMAN> run {

set until time "to_timestamp('20251124 16:40:00','yyyymmdd hh24:mi:ss')";

recover pluggable database pdb2 auxiliary destination='/u02/auxiliary';

alter pluggable database pdb2 open resetlogs;

}


這邊要注意的是,設定 until time 的時間必須要有 CDB$ROOT 與 PDB2 的備份,並且 auxiliary destination 

的空間必須要可以容納 CDB$ROOT + PDB2 才行。


  • Flashback

最後來說一下 flashback database , PDB 可以單獨執行 flashback database ,只要於 CDB 層級有

 enable flashback database 功能即可,首先於 CDB 層級啟用 flashback :

SQL> show con_name

CON_NAME

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

CDB$ROOT


SQL> alter system set db_recovery_file_dest_size=30G;

SQL> alter system set db_recovery_file_dest='/u01/recovery_area';

SQL> SQL> alter database flashback on;


例如於 PDB2 建立 restore point 以及單獨進行 flashback :

建立 restore point :

SQL> alter session set container=pdb2;

SQL> create restore point rp_2025 guarantee flashback database;

執行 flashback database :

SQL> alter session set container=pdb2;

SQL> alter pluggable database close immediate;

SQL> flashback pluggable database to restore point rp_2025;

SQL> alter pluggable database open resetlogs;


總結 Multitenant 的備份與傳統的 Non-CDB 備份差異不大, DBA 只需要注意 PDB 必須連同其所在的 

CDB$ROOT 一起備份即可。