اوراکل در نسخه 19c اجازه نمی دهد که یک pdb را به زمانی از یک ORPHAN incarnation برگردانیم:
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 21 08:28:57 2022
Version 19.3.0.0.0
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 1920977 1920977
3 ORPHAN 1 1963437 1963437
3 CURRENT 2 1964176 1964176
SQL> alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> flashback pluggable database to scn 1962565;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
SQL> flashback pluggable database PDB1401 to scn 1963437;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
[oracle@stb ~]$ rman target sys/sys@192.168.1.20:1521/pdb1401
RMAN> reset pluggable database pdb1401 to incarnation 1;
'RMAN-07536: command not allowed when connected to a Pluggable Database'
اما در نسخه 21c این قابلیت به وجود آمد تا بتوان یک PDB را به هر زمانی در گذشته برگرداند(البته گذشته نزدیک). در ادامه با سناریوی زیر و با ایجاد یک ORPHAN incarnation بیشتر با این فیچر را آشنا خواهیم شد.
alter session set container=pdb1401;
SQL> create table usef.mtbl (id number,des varchar2(100));
Table created.
SQL> insert into usef.mtbl values (1,'flashback_0');
1 row created.
SQL> commit;
Commit complete.
SQL> SELECT CURRENT_SCN from V$DATABASE;
CURRENT_SCN
-----------
2665904
SQL> create restore point flashback_0;
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 1 1
3 CURRENT 0 2601843 2601843
تا اینجای سناریو، عبارت flashback_0 را در جدول mtbl(ستون des) درج کرده ایم در این قسمت با اجرای دستور زیر عبارت flashback_0 را به flashback_1 تغییر می دهیم:
SQL> update usef.mtbl set des='flashback_1'; 1 row updated. SQL> commit; Commit complete. SQL> SELECT CURRENT_SCN from V$DATABASE; CURRENT_SCN ----------- 2665948 SQL> create restore point flashback_1; Restore point created.
اولین flashback
قصد داریم تغییر انجام شده(تغییر از عبارت flashback_0 به flashback_1) را از طریق flashback کردن pdb برگردانیم(البته در این حالت روشهای بهتری چون flashback کردن جدول هم در دسترس هستند):
SQL> alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1401 MOUNTED
SQL> flashback pluggable database to restore point flashback_0;
Flashback complete.
SQL> alter pluggable database pdb1401 open resetlogs;
Pluggable database altered.
SQL> select des from usef.mtbl;
DES
-------------------
flashback_0
همانطور که می بینید، جدول mtbl بعد از انجام عملیات flashback، عبارت flashback_0 را در خود دارد و PDB هم وارد incarnation جدید شده است:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1401 READ WRITE NO
SQL> SELECT CURRENT_SCN from V$DATABASE;
CURRENT_SCN
-----------
2666758
SQL> SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn FROM v$pdb_incarnation ORDER BY 3;
3 PARENT 0 2601843 2601843
3 CURRENT 1 2666493 2666493
برای پیش بردن سناریو، نیاز داریم تا یک ORPHAN incarnation ایجاد کنیم بنابرین باید flashback دیگری را اجرا کنیم. قبل از انجام flashback جدید، عبارت flashback_2 را در ستون des ثبت می کنیم.
SQL> update usef.mtbl set des='flashback_2'; 1 row updated. SQL> commit; Commit complete. SQL> SELECT CURRENT_SCN from V$DATABASE; CURRENT_SCN ----------- 2666829 SQL> create restore point flashback_2; Restore point created.
دومین flashback
PDB را به incarnation اول بر می گردانیم(restore point flashback_0):
SQL> alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1401 MOUNTED
SQL> flashback pluggable database to restore point flashback_0;
Flashback complete.
SQL> alter pluggable database pdb1401 open resetlogs;
Pluggable database altered.
SQL> select des from usef.mtbl;
DES
------------------------
flashback_0
flashback به درستی انجام شد و pdb وارد incarnation جدید شد. همچنین incarnation قبلی که در آن عبارت flashback_2 را در جدول mtbl ثبت کرده بودیم، وضعیتش به ORPHAN تغییر کرده است:
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 2601843 2601843
3 ORPHAN 1 2666493 2666493
3 CURRENT 2 2667898 2667898
سومین flashback
قصد داریم pdb1401 را به ORPHAN incarnation ایجاد شده برگردانیم جایی که عبارت flashback_2 را در جدول mtbl ثبت کرده بودیم و همینطور restore pointای با نام flashback_1 را ساخته بودیم. این کار در نسخه 19c امکان پذیر نبود اما اوراکل نسخه 21c این قابلیت را به ما می دهد:
SQL> alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1401 MOUNTED
SQL> flashback pluggable database to restore point flashback_1;
Flashback complete.
SQL> alter pluggable database pdb1401 open resetlogs;
Pluggable database altered.
SQL> select des from usef.mtbl;
DES
--------------------------------------------------------------------------------
flashback_1
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 2601843 2601843
3 ORPHAN 1 2666493 2666493
3 ORPHAN 2 2667898 2667898
3 CURRENT 3 2669267 2669267
سلام و عرض ادب
جناب مهندس مطالب منتسب به شما مثل همیشه عالی و کاربردی اند.
تشکر از نظر لطفتون