Would you like to quickly provide your engineering team with a real production environment database with updated data to develop new features? Does your operational team need a copy of the production database to test a new release or a new patch? “Easy” would you say. “Let’s do a clone and duplicate the production database with RMAN!”. Yes, but would you take the same direction if your production database size makes more than a few Terra Bytes? In this article, we will see what interesting added value offers the snapshot technology and compare the solutions available for Oracle Standard Edition SE2 : PDB snapshot, dbvisit snapshot and ACFS snapshot.

What is a snapshot?

A snapshot refers to a system’s state at a specific point in time. To do so, the snapshot will need to store the previous version of a modified block. The snapshot has a list of pointers and knows the location of each block.

There are 2 well-known snapshot methods. The copy-on-write (CoW) method, mostly used, will copy the blocks that are modified. So only modified blocks will require additional storage on the disk. In the example (see following screenshot), a snapshot is created on the source file system having initially at snapshot creation A, B and C blocks. When the B block is deleted by the source, the B block will be copied in the snapshot reserved space in order to make the information still available for the snapshot. The B source block will be deleted. The same process will happen when the source will give an update on the C block. The old version will be copied in the snapshot reserved area. For new information created by the source, refer the D block, only the source will have access to it. For each modified block there will be 3 I/O : 1 read I/O and 2 writes I/O.




Another method called redirect-on-write (RoW) is also using pointers. The difference resides in the fact that for each block modification the new information is not updated in the current block but will be written in a new block and the pointer will be updated. So in case of write done by the source in the parent block, only 1 write I/O is needed. This might give an advantage to the previous CoW method. But several drawbacks will make this method more complex. The deletion of the snapshot implies the data from the snapshot storage to be reconciled back into the source volume adding some additional fragmentation problem. Also, the method will be more complicated to be handled if having several snapshots on the source data. This is described in the next example screenshot where the B block is deleted by the source but kept available for the snapshot and all updated information or new information on the parent block will be inserted in the new blocks made available to the source only.




What is a snapshot database for?

A snapshot database will be a point-in-time copy of a database. A snapshot database can be used in READ/ONLY mode and used to run any reporting application or other query execution, unloading the master production database. The snapshot database can also be opened in READ/WRITE mode. This will give the opportunity to test any new application version or patch, database upgrade or patching and providing a real copy of the database to the engineering team to create further developing. This will be possible without any impact and changes made on the production database. Finally, the snapshot could also be used to easily restore data on the source.

The snapshot database is instantaneously created and, knowing only the modified blocks are copied, will not take large amount of disk space. These two advantages, short time creation and few space requirement, make snapshot database a powerful tool. Snapshot databases are not intended to live forever. More modification on the source master database and/or on the snapshot will be done, more disk space will be required.

PDB snapshot

Multitenant architecture provides possibilities in the Enterprise Edition but also in the Standard Edition. We will be able to create and use PDB snapshots on Standard Edition SE2 in the limit of maximum 3 PDBs for Oracle 19c, including master PDB, cloned PDB and snapshot PDB. There are mainly two instance parameters we need to pay attention to.

The first one is the clonedb parameter. In case the database is deployed on a storage with specialized storage-based snapshot technology as SunZFS, NetApp or ACFS, the parameter needs to be set to false. The master PDB stays opened READ/WRITE. In case the database is deployed on simple and standard file systems, which might be most of the case, the clonedb parameter should be set with the true value. The source file system still needs to support sparseness. This would be the case for ext4 or xfs file system, but not the case for ext3 or ASM. The sparse file will contain all the changes made to the blocks when data are written to the snapshot database and will maintain a pointer to the parent file for accessing the unchanged data. Unfortunately, in this case, the source master PDB can only be opened READ/ONLY. Leaving the PDB1 opened read write for a multitenant database using a LVM xfs file system as database storage (clonedb=true) will result in an ORA-65081 error :

SQL> show pdbs

    CON_ID CON_NAME                      OPEN MODE  RESTRICTED
---------- ----------------------------- ---------- ----------
         2 PDB$SEED                      READ ONLY  NO
         3 PDB1                          READ WRITE NO
         4 PDB2                          READ WRITE NO

SQL> create pluggable database PDB1snap1 from PDB1 snapshot copy;
create pluggable database PDB1snap1 from PDB1 snapshot copy
*
ERROR at line 1:
ORA-65081: database or pluggable database is not open in read only mode


The other important parameter for PDB snapshot is the instance parameter clonedb_dir. This parameter came with Oracle R12.2 and will mention the directory where the bitmap file should be saved. By default, the bitmap file will be stored in $ORACLE_HOME/dbs. This bitmap file, also often called snapshot metadata file, will record the block pointers list.

Starting PDB1 in read only mode will make possible the creation of a PDB1snap1:

SQL> show parameter clone

NAME                TYPE        VALUE
------------------- ----------- ------------------------------
clonedb             boolean     TRUE
clonedb_dir         string      /u92/app/oracle/oradata/snap

SQL> alter pluggable database PDB1 close immediate;

Pluggable database altered.

SQL> alter pluggable database PDB1 open read only;

Pluggable database altered.

SQL> create pluggable database PDB1snap1 from PDB1 snapshot copy;

Pluggable database created.

SQL> alter pluggable database PDB1snap1 open;

Pluggable database altered.

SQL> select con_id, name, open_mode, total_size/1024/1024/1024 GB from v$pdbs;

    CON_ID NAME       OPEN_MODE          GB
---------- ---------- ---------- ----------
         2 PDB$SEED   READ ONLY  1.00292969
         3 PDB1       READ ONLY  1.05664063
         4 PDB2       READ WRITE 1.05664063
         5 PDB1SNAP1  READ WRITE 1.05664063


A bitmap file will be created :

SQL> ! ls -ltrh /u92/app/oracle/oradata/snap
total 8.0K
-rw-r-----. 1 oracle oinstall 2.1M Jul 12 09:03 CDB19CSE_3197379858_bitmap.dbf


We can see that the PDB source PDB1 have a size of 1.1 GB :

SQL> select 'du -ha /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/' || GUID || '/datafile/' from dba_pdbs where pdb_name='PDB1';

du -ha /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/BD987DE079D833A4E0537816A8C0DF5D/datafile/

SQL> !du -h /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/BD987DE079D833A4E0537816A8C0DF5D/datafile/
1.1G	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/BD987DE079D833A4E0537816A8C0DF5D/datafile/


And the snapshot PDB, PDB1snap1, will take only 2.2 MB on the disk having a parse file for each parent file :

SQL> select 'du -ha /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/' || GUID || '/datafile/' from dba_pdbs where pdb_name='PDB1SNAP1';

du -ha /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/

SQL> !du -h /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/
2.2M	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/

SQL> !du -ha /u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/
16K	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/o1_mf_users_jgqt9zf0_.dbf
676K	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/o1_mf_undotbs1_jgqt9zf0_.dbf
1.3M	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/o1_mf_system_jgqt9zdm_.dbf
220K	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/o1_mf_sysaux_jgqt9zdz_.dbf
56K	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/o1_mf_temp_jgqt9zf0_.dbf
2.2M	/u02/app/oracle/oradata/cdb19cse/CDB19CSE_SITE1/C6E8AD2215380DB2E0537816A8C04875/datafile/


Creating the PDB snapshot took 1 second in the lab for a source PDB of 1 GB. This confirms one of the real advantages of using snapshot. We can then, of course, drop the PDB snapshot :

SQL> alter pluggable database PDB1snap1 close;

Pluggable database altered.

SQL> drop pluggable database PDB1snap1 including datafiles;

Pluggable database dropped.


And we would need to follow Oracle Doc ID 2419236.1 (Unable to Open the ‘Source PDB’ in ‘READ WRITE’ Mode After Dropping its ‘Snapshot Copy PDB’. It fails with ORA-01114, ORA-01110 and ORA-27091) to reopen the source PDB, PDB1, in READ/WRITE mode. In case we would use a disaster recover solution as dbvisit, the PDB snapshot created on the primary database will induced a normal clone PDB to be created on the standby side.

We can then easily understand the pros and cons of using PDB snapshot :






dbvisit snapshot

dbvisit standby is a well-known disaster recovery solution for Oracle Standard Edition. The system is composed of a primary and at least one standby database. The changes are applied from the primary on the standby databases through the archived logs, offering possibilities for manual switchover (in case of planned maintenance operation) or failover (in case of disaster). The standby database is started in MOUNT mode and available for recovery only. We could start the standby database in READ/ONLY mode, be able to execute reporting query, but no new changes from the primary can be applied to it during that time. Here is where the new dbvisit snapshot feature, dbvisit snapshot, is going to provide much advantages. The dbvisit snapshot will be a copy of the standby database at a particular point in time, using CoW technology and based on LVM snapshots. The snapshot database can be opened READ/ONLY or READ/WRITE, and offers any reporting or application development possibility. Snapshot database can also be used to test a real failover without impacting the solution: testing a failover implies to back up the standby database first or to create it after wise (reinstate is not possible on a Standard Edition as flashback option is not available). This feature came with version dbvisit 9 as an additional option to pay and is now fully included in dbvisit 10 version. In case the standby database does not meet the requirement to create dbvisit snapshot or in order to offload the standby database, it is possible to use a cascaded standby database. The snapshot can be created from the console (GUI) or from command line (CLI), albeit dbvisit recommendation is to emphasize the console.

There are a few requirements using snapshot with dbvisit:

  • Only linux is currently supported
  • Database files needs to be located on a single LVM file system
  • The server needs to have enough RAM to support the snapshot SGA
  • Sudo needs to be configured for oracle user to have permissions to run root commands (lvcreate, lvremove, lvs and vgs)
  • Enough space in DBVISIT_BASE home directory is needed to record the snapshot metadata

dbvisit offers 2 snapshot options: reporting replicas and test/dev snapshots. With reporting replicas feature, the user feels having a logical database been regularly updated. New READ/ONLY or READ/WRITE snapshots will be automatically created, providing frequent up to date copies of the primary database. We can configure a logical container with minimum 2 and maximal 4 snapshots. This solution will be mainly used for reporting.

In our example with a container of 2 snapshots, the standby database is updated every 10 minutes with the primary database :






A new snapshot is created every 20 minutes on the standby database providing the latest transactions to the user. The newly created snapshot will be registered on the listener with a designed service name, in our example orasnap. All new connections using orasnap service name will go through the most recent snapshot. As we are using a container of 2 snapshots, the snap1 will be deleted as soon as the third snapshot will be created and made available. We will keep the 2 last more recent snapshots. The running connection using snap1 will be killed, giving here, 40 minutes for the query to run.

Following screenshot gives a real example, with a creation interval of 11 minutes and an Oracle Service Name orasnap. Pay attention of the output Total Current Snapshots. It will show a total from 3 of 2 because we are using a container of 2 snapshots and snap001 is in the process to be created.










Once it is done, snap002 will be removed. There will be then 2 snapshots left available :










It is important to know that during the time the snapshot database is created, the standby database needs be opened in READ/ONLY mode, making no apply from the primary possible during that time. The other option available is to create manual snapshots. The creation of snap002 manual snapshots on cdb19cse_SITE2 standby database has taken no more than 2 minutes and 16 seconds on the same lab :

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] cdb19cse
********* dbi services Ltd. *********
STATUS                 : MOUNTED
DB_UNIQUE_NAME         : cdb19cse_SITE2
OPEN_MODE              : MOUNTED
LOG_MODE               : ARCHIVELOG
DATABASE_ROLE          : PHYSICAL STANDBY
FLASHBACK_ON           : NO
FORCE_LOGGING          : YES
VERSION                : 19.10.0.0.0
CDB Enabled            : YES
List PDB(s)    MOUNTED : PDB$SEED, PDB1, PDB2
*************************************

oracle@dbv2:/home/oracle/ [cdb19cse (CDB$ROOT)] snap002
********* dbi services Ltd. *********
STATUS          : STOPPED
*************************************

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] cat /u01/app/dbvisit/standby/conf/cdb19cse_snap002.json
{
  "pfile" : {
    "sga_target" : "650M"
  },
  "permission" : "w",
  "ssize" : "1552M",
  "retry_sec" : 60,
  "activate" : "Y"
}

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] /u01/app/dbvisit/standby/dbvsnap -d cdb19cse -csnap -sname snap002 -j cdb19cse_snap002.json
=============================================================
Dbvisit Standby Database Technology (10.0.0_1_g9b8b5f20) (pid 21359)
Dbvisit Snapshot (pid 21359)
DBVSNAP started on dbv2: Mon Jul 12 13:54:27 2021
=============================================================

Snapshot snap002 created

=============================================================
DBVSNAP ended on dbv2: Mon Jul 12 13:55:20 2021
=============================================================

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] snap002
********* dbi services Ltd. *********
STATUS                 : OPEN
DB_UNIQUE_NAME         : snap002
OPEN_MODE              : READ WRITE
LOG_MODE               : ARCHIVELOG
DATABASE_ROLE          : PRIMARY
FLASHBACK_ON           : NO
FORCE_LOGGING          : NO
VERSION                : 19.10.0.0.0
CDB Enabled            : YES
List PDB(s)  READ ONLY : PDB$SEED
List PDB(s) READ WRITE : PDB1, PDB2
*************************************


There are a few pros and cons using dbvisit snapshot as solution :








Using PDB snapshot with dbvisit snapshot

The idea would be to overlap both dbvisit snapshot solution with PDB snapshot. For situation where the master PDB needs to be started in READ/ONLY Mode, and to avoid cloning the master PDB (when the environment is on production, master PDB needs to be started in READ/WRITE mode), we could consider using a dbvisit snapshot as master READ/ONLY. This will have the main advantage not to impact the primary production database and also use few storage on disk. All PDBs from cdb19cse_SITE1 can stay opened READ/WRITE and we will use the PDB1 from the recent created snapshot, SNAP002, as master READ/ONLY in order to create a PDB snapshot.

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] sqh

SQL> alter pluggable database PDB1 close immediate;

Pluggable database altered.

SQL> alter pluggable database PDB1 open read only;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                      OPEN MODE  RESTRICTED
---------- ----------------------------- ---------- ----------
         2 PDB$SEED                      READ ONLY  NO
         3 PDB1                          READ ONLY  NO
         4 PDB2                          READ WRITE NO

SQL> create pluggable database PDB1snap1 from PDB1 snapshot copy;

Pluggable database created.

SQL> alter pluggable database PDB1snap1 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
         4 PDB2                          READ WRITE NO
         5 PDB1SNAP1                     READ WRITE NO


If we compare the various sizing, we can see that dbvisit snapshot is only taking a few Mbytes, 1 MB :

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] du -sh /u01/app/dbvisit/standby/snap/cdb19cse/snap002/SNAP002/BD987DE079D833A4E0537816A8C0DF5D/datafile/
1.0M	/u01/app/dbvisit/standby/snap/cdb19cse/snap002/SNAP002/BD987DE079D833A4E0537816A8C0DF5D/datafile/


On its side, the PDB snapshot will only take a few Kbytes, 164 KB :

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] du -sh /u01/app/dbvisit/standby/snap/cdb19cse/snap002/SNAP002/C6ED67109F386285E0537916A8C0D80C/datafile/
164K	/u01/app/dbvisit/standby/snap/cdb19cse/snap002/SNAP002/C6ED67109F386285E0537916A8C0D80C/datafile/


When the PDB master size is 1.1 GB :

oracle@dbv2:/home/oracle/ [snap002 (CDB$ROOT)] du -sh /u01/app/dbvisit/standby/snap/cdb19cse/snap002/CDB19CSE_SITE2/BD987DE079D833A4E0537816A8C0DF5D/datafile/
1.1G	/u01/app/dbvisit/standby/snap/cdb19cse/snap002/CDB19CSE_SITE2/BD987DE079D833A4E0537816A8C0DF5D/datafile/


The pros and cons of using this overlapping solution is :






ACFS snapshot

With standard edition we can also use snapshot on ACFS File System available with Oracle Restart systems. These are online, READ/ONLY or READ/WRITE point in time copy of Oracle ACFS File System. This solution is using CoW technology. The snapshots are written in the .ACFS/snaps/ directory.

The command to create, query and delete ACFS snapshot are quite user friendly :

acfsutil snap create –r –w –p  

acfsutil snap info –t  

acfsutil snap delete  


On the other side creating a snapshot database with ACFS might be a more complex process implying to generate the spfile and the control file, to adapt them, to create the ACFS snapshot after putting the master database in begin backup, to recover the database with last archived logs before finally registering the new snapshot database in the grid infrastructure. The pros and cons of using ACFS snapshot is :