در اوراکل نسخه 19c، دیتاگارد نمی تواند عملیاتی نظیر hot cloning و point-in-time recovery را در سطح PDB مدیریت کند و در صورت انجام این قبیل عملیات در primary، دیتاگارد بدون آنکه از حالت recover خارج شود، از آن PDB صرف نظر کرده و با نادیده گرفتن PDB، به کارش ادامه خواهد داد.
–Data Guard 19c
SQL> select OPEN_MODE from v$database;
OPEN_MODE
——————–
READ ONLY WITH APPLY
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ ONLY NO
–Primary 19c
SQL> create pluggable database pdb2 from pdb1;
Pluggable database created.
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
5 PDB2 READ WRITE NO
–Data Guard 19c
SQL> select OPEN_MODE from v$database;
OPEN_MODE
——————–
READ ONLY WITH APPLY
SQL> alter pluggable database pdb2 open;
ORA-01111: name for data file 13 is unknown – rename to correct file
SQL> select name,status from v$datafile;
NAME STATUS
———————————– ——-
/oracle19c/home/dbs/UNNAMED00013 SYSOFF
/oracle19c/home/dbs/UNNAMED00014 RECOVER
/oracle19c/home/dbs/UNNAMED00015 RECOVER
/oracle19c/home/dbs/UNNAMED00016 RECOVER
در نسخه 21c، اوراکل برای حل این مسئله قابلیت PDB Recovery Isolation را معرفی کرد که بر اساس آن، پروسه(process)ای اجرا می شود و PDB کلون شده(و یا PDBای که برای آن point in time recovery انجام شده) را در پس زمینه restore و recover خواهد کرد.
در این حین، CDB هرگز از مود recover خارج نمی شود و برای مدت زمان کوتاهی، دو نوع MRP خواهیم داشت که یکی مسئولیت ریکاوری در سطح CDB را بر عهده دارد و دیگری PDB مورد نظر را ریکاور می کند.
با sync شدن PDB با CDB، پروسه MRP مربوط به PDB، از حالت اجرا خارج شده و این دو نوع MRP با هم ادغام خواهند شد.
–Data Guard 21c
SQL> select OPEN_MODE from v$database;
OPEN_MODE
——————–
READ ONLY WITH APPLY
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
5 PDB1 READ ONLY NO
–Primary 21c
SQL> create pluggable database pdb2 from pdb1;
Pluggable database created.
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB2 MOUNTED
5 PDB1 READ ONLY NO
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
4 PDB2 READ WRITE NO
5 PDB1 READ WRITE NO
–Data Guard 21c
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs where NAME=’PDB2′;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB2 4 DISABLED AUTOMATIC RECOVER
SQL> !sleep 60
SQL> /
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB2 4 ENABLED
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
4 PDB2 READ ONLY NO
5 PDB1 READ ONLY NO
همانطور که می بینید، pdb2 در دیتاگارد restore و recover شده است. برای آشنایی بیشتر با این قابلیت، کافی است تا نگاهی به محتویات alert log بیندازیم:
PDB2(4):File #82 added to control file as ‘/oracle21cR3/base/oradata/ST21C/D10C10B001CB7C42E0530488200A6418/datafile/o1_mf_tbs2_jsddhzs7_.dbf’.
2021-11-18T05:59:07.490261-05:00
PDB2(4):Full restore complete of datafile 82 /oracle21cR3/base/oradata/ST21C/D10C10B001CB7C42E0530488200A6418/datafile/o1_mf_tbs2_jsddhv8o_.dbf. Elapsed time: 0:00:00
PDB2(4): checkpoint is 72901012
PDB2(4): last deallocation scn is 2601845
PDB2(4):Datafile #82 has been copied to the standby.
PDB2(4):PDB Side Media Recovery started for pdbid(4)
PDB2(4):…. (PID:457352): Managed Recovery starting Real Time Apply [krsm.c:15865]
PDB2(4):max_pdb is 6
PDB2(4):…. (PID:457352): Media Recovery Waiting for T-1.S-524 (in transit) [krsm.c:6185]
PDB2(4):Media Recovery of Online Log [Thread=1, Seq=524]
PDB2(4):Recovery of Online Redo Log: Thread 1 Group 5 Seq 524 Reading mem 0
PDB2(4): Mem# 0: /oracle21cR3/base/oradata/ST21C/onlinelog/o1_mf_5_jscwnzg2_.log
PDB2(4): Mem# 1: /oracle21cR3/FRA/ST21C/onlinelog/o1_mf_5_jscwnznq_.log
PDB2(4):The merge request has been submitted by side recovery for pdbid 4
PR00 (PID:457274): Background Media Recovery cancelled with status 16037 [krd.c:27039]
PSR: Background Media Recovery will be reactivated in an attempt to take over PDB side recovery sessions
Errors in file /oracle21cR3/base/diag/rdbms/st21c/st21c/trace/st21c_pr00_457274.trc:
ORA-16037: user requested cancel of managed recovery operation
PR00 (PID:457274): Managed Recovery not using Real Time Apply [krsm.c:15876]
Recovery interrupted!
Recovered data files to a consistent state at change 72901067
Errors in file /oracle21cR3/base/diag/rdbms/st21c/st21c/trace/st21c_pr00_457274.trc:
ORA-16037: user requested cancel of managed recovery operation
PDB2(4):…. (PID:457352): Side Recovery Complete [krds.c:1584]
PR00 (PID:457979): Media Recovery Waiting for T-1.S-524 (in transit) [krsm.c:6185]
2021-11-18T05:59:42.565481-05:00
Recovery of Online Redo Log: Thread 1 Group 5 Seq 524 Reading mem 0
Mem# 0: /oracle21cR3/base/oradata/ST21C/onlinelog/o1_mf_5_jscwnzg2_.log
Mem# 1: /oracle21cR3/FRA/ST21C/onlinelog/o1_mf_5_jscwnznq_.log
چالشها!
چالش 1: اگر دیتاگارد در وضعیت mount قرار داشته باشد، process مربوط به قابلیت PDB Recovery Isolation تا زمان open شدن دیتاگارد منتظر خواهد ماند و بلافاصله بعد از open شدن دیتاگارد، عملیات ریکاوری را برای PDB استارت خواهد زد:
–Data Guard
SQL> startup mount force;
SQL> alter database recover managed standby database disconnect;
–Primary
SQL> create pluggable database pdb3 from pdb1;
Pluggable database created.
SQL> alter pluggable database pdb3 open;
Pluggable database altered.
–Data Guard
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED MOUNTED
3 PDB3 MOUNTED
4 PDB2 MOUNTED
5 PDB1 MOUNTED
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB$SEED 2 ENABLED
PDB3 3 DISABLED AUTOMATIC RECOVER
PDB2 4 ENABLED
PDB1 5 ENABLED
در ادامه مشاهده می کنید که بلافاصله با open شدن دیتاگارد، AUTOMATIC RECOVER برای PDB3 استارت خواهد شد:
–Data Guard
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database open;
Database altered.
SQL> alter database recover managed standby database disconnect;
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB$SEED 2 ENABLED
PDB3 3 DISABLED AUTOMATIC RECOVER
PDB2 4 ENABLED
PDB1 5 ENABLED
SQL> /
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB$SEED 2 ENABLED
PDB3 3 DISABLED AUTOMATIC RECOVER
PDB2 4 ENABLED
PDB1 5 ENABLED
SQL> !sleep 60
SQL> /
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB$SEED 2 ENABLED
PDB3 3 ENABLED
PDB2 4 ENABLED
PDB1 5 ENABLED
همانطور که می بینید، PDB3 به صورت خودکار ریکاور شده و RECOVERY_STATUS آن در حالت ENABLED قرار گرفته است.
چالش 2: در صورتی که هنگام انجام عملیات PDB Recovery Isolation، دیتاگارد restart شود، عملیات PDB Recovery Isolation پس از قرار گرفتن دیتاگارد در حالت recover، مجددا استارت خواهد شد و به کارش ادامه می دهد(دیتافایلها صرفا یکبار restore خواهند شد):
–Primary
SQL> create pluggable database pdb4 from pdb1;
Pluggable database created.
–Data Guard
SQL> startup force;
SQL> alter database recover managed standby database disconnect;
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs where NAME=’PDB5′;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB4 6 DISABLED AUTOMATIC RECOVER
SQL> !sleep 60
SQL> /
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB4 6 ENABLED
چالش 3: برای متوقف کردن عملیات PDB Recovery Isolation می توان از دستور زیر استفاده کرد:
–Primary
SQL> create pluggable database pdb5 from pdb1;
Pluggable database created.
–Data Guard
SQL> ALTER PLUGGABLE DATABASE PDB5 RECOVER MANAGED STANDBY DATABASE CANCEL;
Pluggable database altered.
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs where NAME=’PDB5′;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB5 7 DISABLED
همچنین برای استارت مجدد ان می توان از دستور زیر استفاده کرد:
–Data Guard
SQL> ALTER PLUGGABLE DATABASE PDB5 RECOVER MANAGED STANDBY DATABASE;
Pluggable database altered.
SQL> select name,CON_ID,RECOVERY_STATUS from v$pdbs where NAME=’PDB5′;
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB5 7 DISABLED AUTOMATIC RECOVER
SQL> !sleep 60
SQL> /
NAME CON_ID RECOVERY_STATUS
———- ———- ————————–
PDB5 7 ENABLED
چالش 4: در قسمت ابتدایی متن هم بیان شد که Point-In-Time Recovery در سطح PDB به صورت خودکار توسط قابلیت PDB Recovery Isolation مدیریت خواهد شد(در نسخه 21c).در ادامه تفاوت رفتار اوراکل نسخه 19c و 21c را در این زمینه مشاهده می کنید.
–Primary_19c
[oracle@RAC2 ~]$ rman target /
Recovery Manager: Release 19.0.0.0.0 – Production on Thu Nov 18 16:42:34 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: DB21C (DBID=249297340)
RMAN> RUN {
ALTER PLUGGABLE DATABASE pdb1 CLOSE;
SET UNTIL SCN 2518869;
RESTORE PLUGGABLE DATABASE pdb1;
RECOVER PLUGGABLE DATABASE pdb1;
ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS;
}
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
–Data Guard_19c
SQL> alter database recover managed standby database;
ORA-00283: recovery session canceled due to errors
ORA-65138: Data file 9 of pluggable database PDB1 belongs to an orphan PDB
incarnation.
ORA-01110: data file 9: ‘/oracle19c/base/oradata/DB21C/pdb1/system01.dbf’
همانطور که می بینید، در اوراکل 19c عملیات PITR در سطح PDB توسط دیتاگارد مدیریت نمی شود اما در ادامه خواهیم دید که اوراکل 21c، قابلیت PDB Recovery Isolation مانع از رخ دادن خطاهای فوق خواهد شد:
–Primary_21c
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE immediate;
Pluggable database altered.
SQL> select name from v$datafile where con_id=3;
[oracle@oLinux7 ~]$ rm -rf /oracle21c/base/oradata/DB21C/D1111E988CA95792E0530488200A2486
–Data Guard_21c
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE immediate;
SQL> select name from v$datafile where con_id=3;
[oracle@oLinux7 ~]$ rm -rf /oracle21c/base/oradata/DB21C/D1111E988CA95792E0530488200A2486
–Primary_21c
[oracle@oLinux7 ~]$ rman target /
Recovery Manager: Release 21.0.0.0.0 – Production on Thu Nov 18 08:31:59 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
connected to target database: DB21C (DBID=246486353)
RMAN> RUN {
SET UNTIL SCN 72957710;
RESTORE PLUGGABLE DATABASE pdb1;
RECOVER PLUGGABLE DATABASE pdb1;
ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS;
}
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
SQL> SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn FROM v$pdb_incarnation ORDER BY 3;
CON_ID STATUS INC# BEGIN_RESETLOGS_SCN END_RESETLOGS_SCN
———- ——- ———- ——————- —————–
3 PARENT 0 27261799 27261799
3 CURRENT 2 72958406 72958406
–Data Guard_21c
SQL> select OPEN_MODE from v$database;
OPEN_MODE
——————–
READ ONLY WITH APPLY
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ ONLY NO
SQL> alter session set container=pdb1;
Session altered.
SQL> SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn FROM v$pdb_incarnation ORDER BY 3;
CON_ID STATUS INC# BEGIN_RESETLOGS_SCN END_RESETLOGS_SCN
———- ——- ———- ——————- —————–
3 PARENT 0 27261799 27261799
3 CURRENT 2 72958406 72958406