By Mouhamadou Diaw

In a previous blog , I talked about refreshable PDB technology which can be used to refresh a target PDB.

We have seen here how the target refreshable PDB can be used as a master to provide PDB snapshots.

In this blog we are going to continue in the same topic and talk about PDB Snapshot Carousel which is a library of PDB snaphots. It consists to automatically or manually generate a certain number of snapshots for a given PDB. The source PDB can be a normal PDB or a refreshable one.

As specified in documentation , a PDB snaphot carousel can be useful to maintain a library of recent PDB copies for PITR and cloning.

This feature is only available for following editions ( documentation )

EE-ES Oracle Database Enterprise Edition on Engineered Systems
DBCS EE Oracle Database Cloud Service Enterprise Edition
DBCS EE-HP Oracle Database Cloud Service Enterprise Edition – High Performance
DBCS EE-EP Oracle Database Cloud Service Enterprise Edition – Extreme Performance
ExaCS Oracle Database Exadata Cloud Service
ExaCC Oracle Database Exadata Cloud@Customer

However if you do not have such environment, you can set following parameter “_exadata_feature_on” to TRUE for testing.

Let’s consider PDB1FRES as the source for the snapshots. When configured PDB snapshot carousel can automatically generate a snapshot for each defined interval. The maximum snapshots that can be created is defined by the MAX_PDB_SNAPSHOTS in the CDB_PROPERTIES.

The default value is 8 and is the maximum.

1
2
3
4
5
6
7
8
9
10
SQL> col PROPERTY_NAME for a40
SQL> col PROPERTY_VALUE for a40
SQL> set lines 150
SQL> select PROPERTY_NAME,PROPERTY_VALUE from cdb_properties where property_name='MAX_PDB_SNAPSHOTS';
PROPERTY_NAME                            PROPERTY_VALUE
---------------------------------------- ----------------------------------------
MAX_PDB_SNAPSHOTS                        8
SQL>

The MAX_PDB_SNAPSHOTS can be configured using for exemple

1
ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS = 5

In this test the maximum is set to the default value. To configure PDB1FRES to generate snapshot every 2 minutes, let’s just run following

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB1FRES                       READ ONLY  NO
SQL> alter session set container=PDB1FRES;
Session altered.
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         4 PDB1FRES                       READ ONLY  NO
SQL> ALTER PLUGGABLE DATABASE PDB1FRES SNAPSHOT MODE EVERY 2  MINUTES;
Pluggable database altered.
SQL>
SQL> SELECT SNAPSHOT_MODE, SNAPSHOT_INTERVAL FROM   DBA_PDBS;
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
AUTO                   2

Not that we can also create a new PDB that will take snapshots every 2 minutes using the command CREATE PLUGGABLE DATABASE. The SNAPSHOT MODE can also be MANUAL or NONE

If we query the DBA_PDB_SNAPSHOTS later, we can see that snapshots are automatically being generated

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> SELECT  CON_NAME, SNAPSHOT_NAME, scn_to_timestamp(snapshot_scn) as snaptime , SNAPSHOT_SCN  FROM  DBA_PDB_SNAPSHOTS ORDER BY SNAPSHOT_SCN;
CON_NAME  SNAPSHOT_NAME             SNAPTIME                            SNAPSHOT_SCN
--------- ------------------------- ----------------------------------- ------------
PDB1FRES  SNAP_745266373_1097421048 23-FEB-22 03.10.53.000000000 PM         45436486
PDB1FRES  SNAP_745266373_1097421168 23-FEB-22 03.12.51.000000000 PM         45436585
PDB1FRES  SNAP_745266373_1097421287 23-FEB-22 03.14.50.000000000 PM         45436668
PDB1FRES  SNAP_745266373_1097421407 23-FEB-22 03.16.50.000000000 PM         45436751
PDB1FRES  SNAP_745266373_1097421527 23-FEB-22 03.18.49.000000000 PM         45436830
PDB1FRES  SNAP_745266373_1097421647 23-FEB-22 03.20.50.000000000 PM         45436905
PDB1FRES  SNAP_745266373_1097421767 23-FEB-22 03.22.50.000000000 PM         45437166
PDB1FRES  SNAP_745266373_1097421887 23-FEB-22 03.24.50.000000000 PM         45437249
8 rows selected.
SQL>

What happen when the maximum number of snapshots (8) is reached. The database will remove the oldest snaphot and so on

1
2
3
4
5
6
7
8
9
10
11
12
SQL> SELECT  CON_NAME, SNAPSHOT_NAME, scn_to_timestamp(snapshot_scn) as snaptime , SNAPSHOT_SCN  FROM  DBA_PDB_SNAPSHOTS ORDER BY SNAPSHOT_SCN;
CON_NAME  SNAPSHOT_NAME             SNAPTIME                            SNAPSHOT_SCN
--------- ------------------------- ----------------------------------- ------------
PDB1FRES  SNAP_745266373_1097421168 23-FEB-22 03.12.51.000000000 PM         45436585
PDB1FRES  SNAP_745266373_1097421287 23-FEB-22 03.14.50.000000000 PM         45436668
PDB1FRES  SNAP_745266373_1097421407 23-FEB-22 03.16.50.000000000 PM         45436751
PDB1FRES  SNAP_745266373_1097421527 23-FEB-22 03.18.49.000000000 PM         45436830
PDB1FRES  SNAP_745266373_1097421647 23-FEB-22 03.20.50.000000000 PM         45436905
PDB1FRES  SNAP_745266373_1097421767 23-FEB-22 03.22.50.000000000 PM         45437166
PDB1FRES  SNAP_745266373_1097421887 23-FEB-22 03.24.50.000000000 PM         45437249
PDB1FRES  SNAP_745266373_1097422007 23-FEB-22 03.26.50.000000000 PM         45437336

Not that you will not see snapshots PDB carousel with the SHOW PDBS command

1
2
3
4
5
6
7
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB1FRES                       READ ONLY  NO
SQL>

Now that we have our snapshots, we can for example create a new PDB using one snapshot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> create pluggable database MYPDB from PDB1FRES using snapshot SNAP_745266373_1097421767;
Pluggable database created.
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MYPDB                          MOUNTED
         4 PDB1FRES                       READ ONLY  NO
SQL> alter pluggable database MYPDB open;
Pluggable database altered.
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MYPDB                          READ WRITE NO
         4 PDB1FRES                       READ ONLY  NO
SQL>

To drop a snapshot, just use the command

1
SQL> alter pluggable database drop snapshot SNAP_745266373_1097422487;

To drop all snapshots we can find following lines in the documentation

To drop all snapshots in a PDB snapshot carousel, set the MAX_PDB_SNAPSHOTS database property to 0 (zero), as shown in the following statement:
ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS=0;
This technique is faster than executing ALTER PLUGGABLE DATABASE … DROP SNAPSHOT snapshot_name for every snapshot.

To disable the snapshot mode

1
2
3
4
5
6
7
8
9
10
11
SQL> ALTER PLUGGABLE DATABASE PDB1FRES SNAPSHOT mode none;
Pluggable database altered.
SQL> SELECT SNAPSHOT_MODE, SNAPSHOT_INTERVAL FROM   DBA_PDBS;
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
NONE
SQL>

Conclusion

Hope this help.
Thanks to Tim for his useful blog