From Oracle 12.2 onwards we can flashback a Pluggable database(PDB). And flashback is very easy and simple if LOCAL UNDO is enabled(which is also a new feature in Oracle 12.2).
Let’s start the DEMO.
DEMO:
1. Check whether local undo is enabled or not.
SQL> select * from database_properties where property_name='LOCAL_UNDO_ENABLED'; PROPERTY_NAME PROPE DESCRIPTION ----------------------- ----- --------------------------------------------- LOCAL_UNDO_ENABLED TRUE true if local undo is enabled
For more info – Local undo and shared undo in oracle 12.2
2. Check whether flashback is enabled or not.
In a multitenant database, flashback can be enabled at container level only.
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /export/home/oracle/product/12 c/recovery_area db_recovery_file_dest_size big integer 12690M SQL> Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 3 Next log sequence to archive 5 Current log sequence 5 SQL> SQL> select FLASHBACK_ON from v$database; FLASHBACK_ON ------------------ NO SQL> alter database flashback on; Database altered. SQL> select FLASHBACK_ON from v$database; FLASHBACK_ON ------------------ YES
2. Create a restore point in the pluggable database.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 SDCP1 READ WRITE NO SQL> alter session set container=SDCP1; Session altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 SDCP1 READ WRITE NO --- row_count at time of restore point: SQL> select count(*) from PDBCLASS.TABLE1; COUNT(*) ---------- 72633 SQL> create restore point STAGE1 guarantee flashback database; Restore point created. SQL> SELECT NAME,CON_ID ,TIME FROM V$RESTORE_POINT; NAME CON_ID TIME ------------ ---------- ----------------------------------------------------------------------- STAGE1 3 27-NOV-18 10.18.25.000000000 AM
3. Do some DML changes on the PDB.
SQL> insert into PDBCLASS.TABLE1 select * from PDBCLASS.TABLE1; 72633 rows created. SQL> commit; Commit complete. SQL> select count(*) from PDBCLASS.TABLE1; COUNT(*) ---------- 145266
4. Now do the flashback to the restore point(we created in the previous stage).
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 SDCP1 READ WRITE NO SQL> alter pluggable database SDCP1 CLOSE; Pluggable database altered. SQL> flashback pluggable database SDCP1 to restore point STAGE1; Flashback complete. SQL> alter pluggable database SDCP1 open; alter pluggable database SDCP1 open * ERROR at line 1: ORA-01113: file 13 needs media recovery ORA-01110: data file 13: '/export/home/oracle/product/12c/oradata/ORA12CR2/SDCP1/encryp_ts1.dbf' SQL> alter pluggable database SDCP1 open resetlogs; Pluggable database altered.
5. Check data again(whether we are seeing the old data or not):
SQL> select count(*) from PDBCLASS.TABLE1; COUNT(*) ---------- 72633 SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 SDCP1 READ WRITE NO
What if LOCAL_UNDO is not enabled?
In oracle 12.2 if local_undo is not enabled, then we can use AUXILIARY DESTINATION parameter , which will create an auxiliary instance with container database’s system,sysaux and undo tablespace, and then restore the PDB using rollback transactions. However this flahback will take a long time and will consume additional space on the auxiliary destination.
steps FOR SHARED UNDO:
SQL> alter pluggable database SDCP1 close; SQL>flashback pluggable database SDCP1 to restore point STAGE1 auxiliary destination '/oradata/aux_inst'; SQL> alter pluggable database SDCP1 open resetlogs;