FLASHBACK PDB In Oracle

In a multitenant environment, we basically use 2 terms to indicate the container mode Dedicated Container & Shared Container.

Dedicated Container: When there is only one PDB resides under a root container except PDB$SEED then that type of container we called as dedicated container.

Shared Container: When there are multiple PDB resides under a root container then that type of container we called  as shared container.

     Sometimes we receive a request to flashback a PDB in a shared container environment and in that case we’ve to flashback only that particular PDB not the entire CDB, flashback the entire CDB in a shared container mode only to flashback one PDB will create lot of issues and outage as well, so prior to flashback a PDB we must have to validate whether the container is a Dedicated or shared one.

Steps To Flashback PDB In a Shared Container

Step 1st:  Check if local undo is enabled or not

One of the mandatory and important condition to flashback a PDB is to check whether local undo is enabled or not, if local undo is not enabled then we can’t flashback a PDB.

NOTE: Till 12.1 since local undo feature was not available. So, we were not able to flashback a PDB under the same container, however 12.2 onward oracle has provided the feature of local undo and now we can flashback a PDB as well.

SQL> show pdbs  

    CON_ID|CON_NAME                                    |OPEN MODE |RESTRICTED

----------|--------------------------------------|----------|----------

             2|PDB$SEED                                       |READ ONLY |NO

             3|PDB1                                                |READ WRITE|NO  à Target PDB

             4|PDB2                                                |READ WRITE|NO

SQL> select con_id,property_name,property_value from cdb_properties where property_name='LOCAL_UNDO_ENABLED';

CON_ID|PROPERTY_NAME            |PROPERTY_VALUE

------|------------------------------|--------------------

     1|LOCAL_UNDO_ENABLED       |TRUE

     3|LOCAL_UNDO_ENABLED       |TRUE 

     4|LOCAL_UNDO_ENABLED       |TRUE

Step 2nd: Create user and insert some data only for testing

NOTE: In a real time, environment, step 2 is not necessary because all the time application team approaches DBA team to flashback the database.

SQL> alter session set container=PDB1;

Session altered.

SQL> conn test@PDB1/*******

Connected.

SQL> show user

USER is "TEST"

SQL> select count(*) from user_objects;

  COUNT(*)

----------

      0

SQL> alter session set container=PDB1;

SQL> show con_name

CON_NAME

------------------------------

PDB1

SQL> create restore point PDB_FLSHBK_TEST guarantee flashback database;

Restore point created.

SQL> set lines 300 colsep '|'

SQL> col name for a30

SQL> col time for a40

SQL> col preserved for a15

SQL> col guarantee_flashback_database for a30

SQL> col con_id for 999999

SQL> select con_id,name,time,preserved,guarantee_flashback_Database from v$restore_point;

 CON_ID|NAME                        |TIME                          |PRESERVED      |GUARANTEE_FLASHBACK_DATABASE

-------|------------------------------|----------------------------------------|---------------|--------------------

      3|PDB_FLSHBK_TEST             |01-JAN-24 04.22.23.000000000 PM             |YES        |YES

SQL> set verify off

SQL> insert into test values (&order_id,'&order_name','&order_date');

Enter value for order_id: 100

Enter value for order_name: SHOES

Enter value for order_date: 12-DEC-2022

1 row created.

SQL> /

Enter value for order_id: 200

Enter value for order_name: SHIRT

Enter value for order_date: 14-MAY-2011

1 row created.

SQL> commit;

Commit complete.

SQL> select count(*) from user_objects;

  COUNT(*)

----------

      1

Step 3rd: close the PDB to perform flashback

NOTE: By default, the closing state of PDB is mount

SQL> alter pluggable database PDB1 close immediate;

Pluggable database altered.

In Case Of RAC please use below command to close PDB across cluster

SQL> alter pluggable database PDB1 close immediate instances=all;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

      2 PDB$SEED                  READ ONLY  NO

      3 PDB1                      MOUNTED

      4 PDB2                      READ WRITE NO

Step 4th: Flashback the PDB

SQL> flashback pluggable database PDB1 to restore point PDB_FLSHBK_TEST;

Flashback complete.

NOTE: We can also flashback pluggable database using the restore point created at root container level on the contrary we can't flashback the CDB/root container using the restore point created at PDB level.

PDB Flashback info in alter log

flashback pluggable database PDB1 to restore point PDB_FLSHBK_TEST

2024-01-01T16:35:01.765892+05:30

Flashback Restore Start

Restore Flashback Pluggable Database PDB1 (3) until change 2490725

Flashback Restore Complete

Flashback Media Recovery Start

Incomplete Recovery applied until change 2495767 time 01/01/2024 16:22:23

Flashback Media Recovery Complete

Flashback Pluggable Database PDB1 (3) recovered until change 2495767

Completed: flashback pluggable database PDB1 to restore point PDB_FLSHBK_TEST

Step 5th: Start PDB with resetlogs option

SQL> alter pluggable database PDB1 open resetlogs;

Pluggable database altered.

NOTE: If PDB also has a standby database then when we bounce the CDB and start the MRP again then Standby PDB will also flashback automatically

Step 6th: Start all the required services and check remote connectivity as well

Step 7th: Release the PDB to application team , so that they can validate their data

SQL> alter session set container=PDB1;

Session altered.

SQL> show con_name

CON_NAME

------------------------------

PDB1

SQL> conn test@PDB1/******

Connected.

SQL> show user

USER is "TEST"

SQL> select count(*) from user_objects;

  COUNT(*)

----------

      0

Step 8th: Remove the blackout from the database.







Post a Comment

Previous Post Next Post