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 整個 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 錯誤 :

這個時候只能使用 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 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 一起備份即可。
沒有留言:
張貼留言