از اوراکل 18c،با plug کردن یک pdb به cdb دیگر، امکان استفاده از بکاپهای قدیمی این pdb در cdb جدید امکان پذیر است. در ادامه با یک مثال، خواهیم دید که چگونه می توان از بکاپ pdb18c که ماقبل عملیات plug تهیه شده است، استفاده کرد و دیتافایلهای از دست رفته ای را بدون از دست دادن حتی رکوردی(چه قبل از plug و چه بعد از ان) برگرداند.
جهت انجام این سناریو، قبل از unplug کردن pdb مورد نظر، tablespace، کاربر و همچنین جدولی را ایجاد می کنیم تا از انها برای انجام تست بکاپ/ریکاوری استفاده کنیم:
–in cdb1–
SQL> alter session set container=pdb18c;
Session altered.
SQL> create tablespace tbs01 datafile ‘/u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/tbs01.dbf’ size 100m;
Tablespace created.
SQL> create user usef identified by a default tablespace tbs01;
User created.
SQL> grant dba to usef;
Grant succeeded.
SQL> create table usef.tbl(name varchar2(9));
Table created.
SQL> insert into usef.tbl values(‘USEF’);
1 row created.
SQL> commit;
Commit complete.
در همین cdb، از pdb18c بکاپی را تهیه می کنیم:
–in cdb1–
RMAN> BACKUP PLUGGABLE DATABASE Pdb18c format ‘/18c/bkp/%U’ PLUS ARCHIVELOG format ‘/18c/bkp/%U’;
Starting backup at 28-JUN-18
current log archived
input archived log thread=1 sequence=67 RECID=27 STAMP=979995400
input archived log thread=1 sequence=68 RECID=28 STAMP=979995401
input archived log thread=1 sequence=69 RECID=29 STAMP=979995409
piece handle=/18c/bkp/0vt6j2oi_1_1 tag=TAG20180628T125650 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
input datafile file number=00057 name=/u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_sysaux_fm96sf4s_.dbf
input datafile file number=00056 name=/u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_system_fm96sf4q_.dbf
input datafile file number=00058 name=/u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_undotbs1_fm96sf4t_.dbf
input datafile file number=00059 name=/u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/tbs01.dbf
piece handle=/18c/bkp/10t6j2p2_1_1 tag=TAG20180628T125706 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
current log archived
input archived log thread=1 sequence=70 RECID=30 STAMP=979995441
piece handle=/18c/bkp/11t6j2ph_1_1 tag=TAG20180628T125721 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 28-JUN-18
بعد از تهیه بکاپ، این pdb را unplug می کنیم:
–in cdb1–
SQL> alter pluggable database pdb18c close immediate;
Pluggable database altered.
SQL> alter pluggable database pdb18c unplug into ‘/18c/pdb18c.xml’;
Pluggable database altered.
SQL> drop pluggable database pdb18c keep datafiles;
Pluggable database dropped.
و در همان ماشین، ان را به cdb2 پلاگ(plug) می کنیم:
–in cdb2–
SQL> create pluggable database Pdb18c using ‘/18c/pdb18c.xml’ NOCOPY;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
6 PDB18C MOUNTED
SQL> alter pluggable database PDB18C open;
Pluggable database altered.
عملیات plug/unplug به درستی انجام شد! حال جهت انجام تست، به جدول tbl رکورد دومی را اضافه می کنیم، تا بعد از انجام عملیات ریکاوری، از برگشت رکوردهای بعد از plug اطمینان حاصل کنیم:
SQL> alter session set container=pdb18c;
Session altered.
SQL> select name from usef.tbl;
NAME
———
USEF
SQL> insert into usef.tbl values(‘VAHID’);
1 row created.
SQL> commit;
Commit complete.
SQL> alter session set container=cdb$root;
Session altered.
SQL> alter system switch logfile;
System altered.
بعد از درج این رکورد، دیتافایلهای این pdb را حذف می کنیم:
SQL> alter session set container=pdb18c;
Session altered.
[oracle@cdb2 ~]$ rm -rf /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/*
با حذف این دیتافایلها، بدیهی است که اطلاعات جدول tbl هم در دسترس نخواهند بود:
SQL> alter session set container=pdb18c;
Session altered.
SQL> startup force;
ORA-01157: cannot identify/lock data file 46 – see DBWR trace file
حال از این دیتافایلها، تنها یک نسخه بکاپ در دسترس است که ان هم به قبل از plug شدن این pdb در cdb2 برمی گردد. با ویژگی جدید اوراکل در نسخه 18c، می توان از این نسخه بکاپ، برای برگرداندن دیتافایلها استفاده کرد. در ابتدا لیست بکاپهای ماقبل از plug این pdb را مشاهده می کنیم:
–in cdb2–
RMAN> SET PREPLUGIN CONTAINER=pdb18c;
executing command: SET PREPLUGIN CONTAINER
using target database control file instead of recovery catalog
RMAN> LIST PREPLUGIN BACKUP OF PLUGGABLE DATABASE pdb18c;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
——- —- — ———- ———– ———— —————
31 Full 530.55M DISK 00:00:08 28-JUN-18
BP Key: 31 Status: AVAILABLE Compressed: NO Tag: TAG20180628T125706
Piece Name: /18c/bkp/10t6j2p2_1_1
List of Datafiles in backup set 31
Container ID: 6, PDB Name: PDB18C
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
—- — —- ———- ——— ———– —— —-
43 Full 19703906 28-JUN-18 NO /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_system_fm96sf4q_.dbf
44 Full 19703906 28-JUN-18 NO /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_sysaux_fm96sf4s_.dbf
45 Full 19703906 28-JUN-18 NO /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_undotbs1_fm96sf4t_.dbf
46 Full 19703906 28-JUN-18 NO /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/tbs01.dbf
با دستور زیر و با کمک عبارت preplugin، تمامی دیتافایلهای مربوط به این pdb را برمی گردانیم:
RMAN> restore pluggable database pdb18c from preplugin;
Starting restore at 28-JUN-18
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00043 to /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_system_fm96sf4q_.dbf
channel ORA_DISK_1: restoring datafile 00044 to /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_sysaux_fm96sf4s_.dbf
channel ORA_DISK_1: restoring datafile 00045 to /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/o1_mf_undotbs1_fm96sf4t_.dbf
channel ORA_DISK_1: restoring datafile 00046 to /u02/18c/base/oradata/CDB18C2/6FB071F31A631D00E0530288200ADC84/datafile/tbs01.dbf
channel ORA_DISK_1: reading from backup piece /18c/bkp/10t6j2p2_1_1
channel ORA_DISK_1: piece handle=/18c/bkp/10t6j2p2_1_1 tag=TAG20180628T125706
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
Finished restore at 28-JUN-18
و همچنین با دستور زیر و با کمک ارشیوهای موجود در بکاپ، ریکاوری را انجام می دهیم:
RMAN> recover pluggable database pdb18c from preplugin;
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 71 and starting SCN of 19703925
همانطور که می بینید، دستور ریکاوری با خطا متوقف شد. این دستور برای اجرای موفق، به ارشیو شماره 71 نیاز دارد که در بکاپ ارشیوها، خبری از ان نیست(این ارشیو، بعد از بکاپ و قبل از unplug ایجاد شده است). با دستور زیر، ادرس این ارشیو را تعیین می کنیم:
RMAN> catalog preplugin archivelog ‘/u02/18c/base/fast_recovery_area/CDB18C2/archivelog/2018_06_28/o1_mf_1_71_fm97dl0r_.arc’;
cataloged archived log
archived log file name=/u02/18c/base/fast_recovery_area/CDB18C2/archivelog/2018_06_28/o1_mf_1_71_fm97dl0r_.arc RECID=31 STAMP=0
با اجرای مجدد دستور قبلی، ریکاوری با موفقیت انجام خواهد شد:
RMAN> recover pluggable database pdb18c from preplugin;
Starting recover at 28-JUN-18
starting media recovery
archived log for thread 1 with sequence 70 is already on disk as file /u02/18c/base/fast_recovery_area/CDB18C2/archivelog/2018_06_28/o1_mf_1_70_fm96z9d8_.arc
archived log for thread 1 with sequence 71 is already on disk as file /u02/18c/base/fast_recovery_area/CDB18C2/archivelog/2018_06_28/o1_mf_1_71_fm97dl0r_.arc
media recovery complete, elapsed time: 00:00:01
Finished recover at 28-JUN-18
در نهایت، دستور ریکاوری را بدون استفاده از عبارت preplugin اجرا می کنیم تا تغییرات بعد از plug(مشابه رکوردی که به جدول tbl اضافه شد)، به این pdb اعمال شوند:
RMAN> recover pluggable database pdb18c;
Starting recover at 28-JUN-18
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 28-JUN-18
pdb18c را در وضیعت open قرار می دهیم:
SQL> alter pluggable database pdb18c open;
Pluggable database altered.
با اتصال به این pdb، اطلاعات جدول tbl را مورد بررسی قرار می دهیم که خواهیم دید بدون از دست دادن رکوردی، ریکاوری انجام شده است:
SQL> alter session set container=pdb18c;
Session altered.
SQL> select name from usef.tbl;
NAME
———
USEF
VAHID
Comment (1)