Difference between revisions of "RMAN"

From dbawiki
Jump to: navigation, search
m (duplicate4standby.cmd file)
(Copy RMAN backup files)
Line 134: Line 134:
 
* using scp
 
* using scp
 
* using rsync
 
* using rsync
* using zpool
+
* using zfs disk (Solaris)
 +
On source server unmount the disk and comment the appropriate line in /etc/vfstab
 
<pre>
 
<pre>
 +
umount /CLONEDISK
 +
vxdg deport clonedg
 +
vi /etc/vfstab
 +
 +
# /dev/vx/dsk/clonedg/lv_clonedg_jdbeop1clone    /dev/vx/rdsk/clonedg/lv_clonedg_jdbeop1clone    /CLONEDISK  vxfs    3      yes    -
 +
 +
</pre>
 +
On destination server uncomment the appropriate line in /etc/vfstab and mount the disk
 +
<pre>
 +
vi /etc/vfstab
 +
 +
/dev/vx/dsk/clonedg/lv_clonedg_jdbeop1clone    /dev/vx/rdsk/clonedg/lv_clonedg_jdbeop1clone    /CLONEDISK  vxfs    3      yes    -
 +
 +
vxdg import clonedg
 +
mount /CLONEDISK
 
</pre>
 
</pre>
  

Revision as of 15:41, 12 September 2014

list - tells you what has already been done
report - tells you what needs to be done

Contents

Change date and time format to get better reporting

Set this at unix prompt before starting RMAN

export NLS_DATE_FORMAT="dd-mon-yyyy hh24:mi:ss"

Crosscheck the archivelogs

change archivelog all crosscheck;

Delete archivelogs that have been backed up

delete noprompt archivelog all backed up 2 times to sbt_tape;
delete noprompt archivelog until time 'sysdate-2' backed up 1 times to device type 'sbt_tape';
delete noprompt archivelog until time 'sysdate-(1*6/24)' backed up 1 times to device type 'sbt_tape';

Backup archivelogs that have not yet been backed up then delete any older than 72 hours

run {
    allocate channel type 'sbt_tape' format 'LOG_d%d_t%t_s%s_u%u' parms 'env=(tdpo_optfile=/oracle/JDBEOP1/admin/tdpo.opt)';
    backup archivelog all not backed up 1 times tag=bu20140808t170528p5685;
    delete noprompt archivelog until time 'sysdate-(1 * 72 / 24)'  backed up 1 times to device type 'sbt_tape';
}

Backup archivelogs between a range of sequence numbers

run {
    allocate channel t1 device type 'sbt_tape' format 'ARC_d%d_t%t_s%s_u%u' parms 'env=(tdpo_optfile=c:\home\ibmtools\scripts\rman\tdpo_golfp1.opt)';
    backup archivelog from logseq 224801  until logseq 224890;
}

Backup the archivelogs to tape then delete the ones on disk

In a space emergency, backup all the archivelogs to the configured tape and immediately delete them from disk

backup device type sbt_tape archivelog all delete all input;

or ensure the correct device...

run {
    allocate channel c1 type sbt_tape parms 'ENV=(TDPO_OPTFILE=/oracle/${ORACLE_SID}/admin/tdpo.opt)';
    backup device type sbt_tape archivelog all delete all input;
}

Restore archivelogs

    restore archivelog from logseq=38400 until logseq=38499;
    restore archivelog logseq=25444;

Recover datafile blocks using RMAN

connect target /

backup validate datafile 00091;

run {
    set maxcorrupt for datafile 91 to 32;
    backup validate datafile 00091;
}

blockrecover datafile 91 block 889664;

Quick check that the tdpo configuration is correct

Channel test

run {
    allocate channel c1 type sbt_tape parms 'ENV=(TDPO_OPTFILE=/oracle/${ORACLE_SID}/admin/tdpo.opt)';
}

Quick backup to tape via tdpo

rman nocatalog target /
run {
    allocate channel c1 type sbt_tape parms 'ENV=(TDPO_OPTFILE=/oracle/${ORACLE_SID}/admin/tdpo.opt)';
    backup database;
}

Create a physical standby from an RMAN backup

Backup primary database to disk

#!/bin/ksh
#
# Inspired by the book RMAN Recipes for Oracle database 11g

export ORACLE_SID=JDBEOP1


echo `date`
HOSTNAME=`hostname`
TODAY=`date +%Y%m%d_%H%M`

ORAENV_ASK=NO
. oraenv

export nls_date_format="dd-mon-yyyy hh24:mi:ss"

rman target / nocatalog msglog rman_database_${ORACLE_SID}_${TODAY}.log<<EORMAN
run {
    allocate channel d1 type disk;
    allocate channel d2 type disk;
    allocate channel d3 type disk;
    allocate channel d4 type disk;
    allocate channel d5 type disk;
    allocate channel d6 type disk;
    backup format '/JDBEOP1-CLONE/rman_db_t%t_s%s_p%p' database;
    sql 'alter system archive log current';
    backup format '/JDBEOP1-CLONE/rman_al_t%t_s%s_p%p' archivelog all;
    backup current controlfile for standby format '/JDBEOP1-CLONE/rman_ctl_t%t_s%s_p%p';
    release channel d1;
    release channel d2;
    release channel d3;
    release channel d4;
    release channel d5;
    release channel d6;
}
EORMAN

echo `date`

Copy RMAN backup files

Copy over the backup files from source to destination server

  • using scp
  • using rsync
  • using zfs disk (Solaris)

On source server unmount the disk and comment the appropriate line in /etc/vfstab

umount /CLONEDISK
vxdg deport clonedg
vi /etc/vfstab

# /dev/vx/dsk/clonedg/lv_clonedg_jdbeop1clone     /dev/vx/rdsk/clonedg/lv_clonedg_jdbeop1clone    /CLONEDISK  vxfs    3       yes     -

On destination server uncomment the appropriate line in /etc/vfstab and mount the disk

vi /etc/vfstab

/dev/vx/dsk/clonedg/lv_clonedg_jdbeop1clone     /dev/vx/rdsk/clonedg/lv_clonedg_jdbeop1clone    /CLONEDISK  vxfs    3       yes     -

vxdg import clonedg
mount /CLONEDISK

Restore the database on the destination server

#!/usr/bin/ksh

HOSTNAME=`hostname`
TODAY=`date +%Y%m%d_%H%M`; export TODAY

export ORACLE_SID=JDBEOP1
ORAENV_ASK=NO
. oraenv

echo $ORACLE_SID
echo $ORACLE_HOME

sqlplus / as sysdba <<EOSQL
shutdown abort
EOSQL

sqlplus / as sysdba <<EOSQL
startup nomount pfile='/oracle/JDBEOP1/admin/change/init_clone.ora'
EOSQL

echo `date`
export NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS'
rman nocatalog cmdfile=duplicate4standby.cmd msglog=duplicate_${HOSTNAME}_${ORACLE_SID}_${TODAY}.log
echo `date`

exit

init_clone.ora file

Used for the initial start of the standby database in the above script

DB_NAME=JDBEOP1
DB_UNIQUE_NAME=JDBEOP1_DR

duplicate4standby.cmd file

RMAN command file used in the above script

connect target sys/&syspasswordonprimary@JDBEOP1
connect auxiliary /
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate auxiliary channel a1 device type disk;
allocate auxiliary channel a2 device type disk;
set newname for tempfile 1 to '/oracle/JDBEOP1/oradata1/temp01.dbf';
set newname for tempfile 2 to '/oracle/JDBEOP1/oradata2/temp03.dbf';
set newname for datafile 518 to '/oracle/JDBEOP1/arcdata/ARCENG_05.dbf';
set newname for datafile 555 to '/oracle/JDBEOP1/arcdata/PRODARCT_09.dbf';
set newname for datafile 550 to '/oracle/JDBEOP1/arcdata/PRODARCI_08.dbf';
duplicate target database for standby 
nofilenamecheck
dorecover
spfile set db_unique_name          = 'JDBEOP1_DR'
       set sga_max_size            = '124748364800'
       set sga_target              = '124748364800'
       set db_cache_size           = '100000000000'
       set fal_server              = 'JDBEOP1'
       set fal_client              = 'JDBEOP1_DR' 
       set db_block_checksum       = 'FULL'
       set db_lost_write_protect   = 'TYPICAL'
       set db_recovery_file_dest   = '/oracle/JDBEOP1/recovery_area'
       set log_archive_dest_1      = 'LOCATION="USE_DB_RECOVERY_FILE_DEST"'
       set standby_archive_dest    = 'LOCATION="USE_DB_RECOVERY_FILE_DEST"'
;
}

Backup the control file

backup current controlfile;

Check the status of currently running backups

SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
   ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"
FROM V$SESSION_LONGOPS
WHERE 
  OPNAME LIKE 'RMAN%'
--AND OPNAME NOT LIKE '%aggregate%'
  AND TOTALWORK != 0
  AND SOFAR <> TOTALWORK
/

Check the status of the database backups for the past 7 days

Run this one from sys on the database server

set pages 100
set lines 200
col operation   for a12
col backup_type for a27
col start_time  for a17
col end_time    for a17
col status      for a12
col duration    for 90.99
col days_ago    for 90

select vrbsd.operation
,      vrbsd.command_id                              backup_type
,      to_char(vrbsd.start_time,'DD-MON-YY HH24:MI') start_time
,      to_char(vrbsd.end_time,'DD-MON-YY HH24:MI')   end_time
,      vrbsd.status                                  status
,      (vrbd.elapsed_seconds/3600)                   duration
,      trunc(sysdate)-trunc(vrbsd.start_time)        days_ago
from   v$rman_backup_job_details     vrbd
,      v$rman_backup_subjob_details  vrbsd
where  1=1
and    vrbd.session_key = vrbsd.session_key
and    vrbd.input_type='DB INCR'
and    vrbsd.start_time > sysdate -8
order  by vrbsd.start_time desc

Check the status of the database backups from the RMAN catalog

Run this one from the RMAN catalog server

select s.db_name
,      s.status
,      max(s.start_time) start_time
,      max(round(s.mbytes_processed/1024))  "processed_data(GB)"
,      max(round((end_time-start_time)*60*24)) "duration(min)"
,      trunc(sysdate)-trunc(s.start_time)   days_since_last_backup
from   rc_rman_status s 
where  1=1
and    lower(s.operation)   = 'backup'
and    lower(s.object_type) ='db full'
and    s.start_time =
       (
       select max(md.start_time)
       from   rc_rman_status md 
       where  1=1
       and    lower(md.operation)   = 'backup'
       and    lower(md.object_type) ='db full'
       and    md.db_name = s.db_name
       )
group  by s.db_name
,      s.object_type
,      s.operation
,      s.status
,      trunc(sysdate)-trunc(s.start_time)
order  by trunc(sysdate)-trunc(s.start_time) desc


Which tapes are the backups on?

Not really necessary as RMAN can work it out but if you need to know...

select media
, to_char(completion_time,'DD-MON-YYYY HH24:MI:SS') backed_up
from   rc_backup_piece
where  1=1
and    db_id           = 4053457814
and    completion_Time > sysdate - 2
order  by 2

Block change tracking

Check / Set it

select filename from v$block_change_tracking;
show parameter db_create_file_dest
alter system set db_create_file_dest='/oracle/SID/oradata1' scope=both;

Enable it

alter database enable block change tracking;
alter database enable block change tracking using file '/oracle/SID/oradata1/change_track.dbf';

Disable it

alter database disable block change tracking;

Rename / Move it

alter database disable block change tracking;
alter database enable block change tracking using file '<something different>';

To remove all rows from v$rman_status

If the status of an RMAN backup is stuck in RUNNING, the next backup will not start up. Reset the view with this...

exec sys.dbms_backup_restore.resetcfilesection(28);

Check for hanging RMAN sessions by checking wait

COLUMN EVENT FORMAT a10
COLUMN SECONDS_IN_WAIT FORMAT 999
COLUMN STATE FORMAT a20
COLUMN CLIENT_INFO FORMAT a30

SELECT p.SPID
,      EVENT
,      SECONDS_IN_WAIT SEC_WAIT
,      sw.STATE
,      CLIENT_INFO
FROM   V$SESSION_WAIT sw
,      V$SESSION s
,      V$PROCESS p
WHERE  1=1
and    (sw.EVENT LIKE 'sbt%' or sw.EVENT LIKE '%MML%')
AND    s.SID    = sw.SID
AND    s.PADDR  = p.ADDR
;

Useful RMAN commands

Create RMAN catalog schema

create tablespace rmanAGRDWHP1 datafile '/oracle/RMANV11/oradata1/rmanTDPOTEST.dbf' size 5M autoextend on;
alter database datafile '/oracle/RMANV11/oradata1/rmanTDPOTEST.dbf' autoextend on next 5M maxsize unlimited;

create user rmanTDPOTEST identified by threeguesses
       temporary tablespace temp
       default tablespace rmanTDPOTEST
       quota unlimited on rmanTDPOTEST;

grant connect, resource, recovery_catalog_owner to rmanTDPOTEST;

Connect RMAN to the database controlfile (assuming db environment is set)

rman target /

Connect RMAN to the recovery catalog (assuming db environment is set)

rman target / catalog catowner/catpass@catdb

Problem with this method is that anyone doing a 'ps -ef' will see the catalog password! Do it this way and the password will not be visible...

rman target /
Recovery Manager: Release 11.2.0.3.0 - Production on Sun Jun 8 10:49:57 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: EUDSTGP2 (DBID=1013086362)

RMAN> connect catalog catowner/catpass@catdb;

connected to recovery catalog database

Show what backups are available

list backup of database;
list backup of spfile;
list backup of controlfile;
LIST ARCHIVELOG ALL;
LIST BACKUP OF ARCHIVELOG ALL;
LIST BACKUP OF DATAFILE 1;
LIST BACKUP SUMMARY;
LIST INCARNATION;
LIST BACKUP BY FILE;
LIST BACKUP OF DATAFILE 11 SUMMARY;
LIST BACKUP OF ARCHIVELOG FROM SEQUENCE 1437;
LIST CONTROLFILECOPY "/tmp/cntrlfile.copy";
LIST BACKUPSET OF DATAFILE 1;
LIST FAILURE;
LIST FAILURE 641231 detail;

Show all the configured options

show all;

What needs backing up to satisfy retention policy (times backed up/recovery window etc)?

report need backup;

What can be deleted?

report obsolete;

Delete what is not needed

delete noprompt expired archivelog all;

delete noprompt obsolete;

Check whether the backup pieces registered in the controlfile still exist

CROSSCHECK BACKUP;
CROSSCHECK COPY;
CROSSCHECK backup of database;
CROSSCHECK backup of controlfile;
CROSSCHECK archivelog all;

Restore a database using RMAN

Reproduced from ss64.com

There are many ways to restore a database using an RMAN backup - this example assumes you are performing a Disaster-Recovery restore of all data and recovering the entire database with the same SID and the same disk/tablespace layout.

You will need the following information:

Database SID: ________

Database SYS password: ________

Disk layout and sizes: ________

Database ID (DBID): ________

There are 5 steps to recover the database:

    1) Create a new (empty) database instance
    2) Mount the instance
    3) Restore the datafiles
    4) Recover the database
    5) Reset the logs

1) Create a new (empty) database instance

    Configure the new server with same disk layout as the original database - if necessary use Symbolic Links (or in Windows use disk manager to re-assign drive letters.)

    Ensure you have enough disk space for both the backup files plus the restored database files.

    Create a new database with the database configuration assistant (DBCA) and set the SYS password and global database_name to the same as the original database.

    If the database to be restored is in archive log mode, set the LOG_ARCHIVE_FORMAT parameter to match the setting in the original database.

    The ORAPWD utility can also be used to change the SYS password.

    Set the environment variable NLS_LANG for your character set -
    NLS_LANG=American_America.WE8ISO8859P1

2)  Mount the empty instance

    SQL> Shutdown immediate;
    SQL> Startup mount;

    or specifying the pfile explicitly:

    SQL> CREATE PFILE='C:\oracle\Database\initLive.ora' FROM SPFILE;
    SQL> Shutdown immediate;
    SQL> Startup mount pfile=C:\oracle\Database\initLive.ora

3) Restore the datafiles

    In this case we have copied the RMAN backup files and archive logs to R:\Rman\

    Change the dbid to match that of the database being restored

    RMAN> SET dbid = 477771234;

    RMAN> run {
    ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT 'R:\Rman\%U';
    restore database;
    }

    At this point the datafiles and tablespaces will be re-created. For a large database it can take a long time to restore each tablespace - for better performance during a restore place the RMAN backup files on a separate disk to the Oracle datafiles to reduce disk contention.

4) Recover the database

    SQL> Recover from 'L:\oradata\live' database until cancel using backup controlfile;
    SQL> cancel

5) Reset the logs

    SQL> alter database open resetlogs;

    This will update all current datafiles and online redo logs and all subsequent archived redo logs with a new RESETLOGS SCN and time stamp.

    As soon as you have done a resetlogs run a full backup, this is important as should you suffer a second failure you will not be able to perform a second recovery because after resetting the logs the SCN numbers will no longer match any older backup files.

Notes:

The DBID can be retrieved in several places, if the database is running: Select dbid from V$DATABASE;

The RMAN client displays the dbid at startup when connecting to a database:

Copyright (c) 1995, 2003, Oracle. All rights reserved.
connected to target database: RDBMS (DBID=7776644123)

The default filename format for an RMAN controlfile autobackup is c-IIIIIIIIII-YYYYMMDD-QQ, where: IIIIIIIIII is the DBID.

Bad Hair Day

When media failure strikes, look in the alertlog for more info if you can still get to it.

Restore and recover tablespace

If some/all datafiles in one tablespace are damaged, you can recover the tablespace.

rman target /
startup mount;
restore tablespace users;
recover tablespace users;
alter database open;

or while database is open...

rman target /
sql 'alter tablespace users offline immediate';
restore tablespace users;
recover tablespace users;
sql 'alter tablespace data_ts online';

Restore and recover datafile

To get a list of datafiles and their numbers, use 'report schema' or 'select file#,name from v$datafile;' (this queries the control file)

rman target /
startup mount;
restore datafile 1;
recover datafile 1;
alter database open;

or while database is open...

rman target /
sql 'alter datafile 3 offline';
restore datafile 3;
recover datafile 3;
sql 'alter tdatafile 3 online';

Restore datafile to a different location and recover

rman target /
startup mount;
run {
set newname for datafile 2 to '/oracle/SID/users.dbf';
restore tablespace users;
switch datafile all;
recover tablespace users;
alter database open;
}

Restore database

If all else fails, restore the database to a time before the bad thing happened, then recover it by rolling forward with the archivelogs.

export ORACLE_SID=<SID>
. oraenv
rman target / catalog catusr/catpwd@catdb
startup mount;
run {
set until time "to_date('20-MAR-14 10:00:00','dd-mon-yy hh24:mi:ss')";
restore database;
}

Get scn for this timestamp

select timestamp_to_scn('20-MAR-14 10.00.00') from dual;
rman target / catalog catusr/catpwd@catdb
run {
set until scn=10328571660050;
recover database;
}

Duplicating an 11gR2 Oracle database with no connection to the target

One of the new Backup and Recovery features of Oracle 11g Release 2 (11gR2) is the ability to duplicate a database without connecting to the target database. In RMAN terminology, the “target” database is the one you wish to duplicate. In this case, the only requirement is that you provide a disk backup location where RMAN can find all the backups, data file copies, archived logs, and control file copies for database duplication. This database duplication enhancement is helpful when it is not possible to connect to the target database and the recovery catalog.

This came in handy for me recently on a customer project. They wanted me to test a disaster recovery scenario in which the production database server was completely gone and we needed to restore it from tape onto another server. This is a fairly typical DR situation, but in this case it was made more difficult because the directory structure on the test server didn’t match that of the production server. Specifically, on the production server, everything was located on the E: drive while on the Test server, the only drive that exists is C:. This means that all file locations need to be changed as part of the duplicate procedure. This can all be done in one single RMAN command.

Note: One thing that makes this process easier is to enable controlfile autobackups on the production database. This is a good practice in general and should be configured for all databases.

rman target / nocatalog
configure controlfile autobackup on;

Here are the steps that I followed:

Step1) Copy the most recent backup files and archivelog files to the test server. In this case, we restored from tape to the location c:\prod backup files. The backup files and archivelogs come from the following locations:

E:\app\flash_recovery_area\prod\ARCHIVELOG\2013_03_21
E:\app\flash_recovery_area\prod\BACKUPSET\2013_03_21
E:\app\flash_recovery_area\prod\AUTOBACKUP\2013_03_21

Step 2) Create a file called INITPROD2.ORA in %ORACLE_HOME%\database containing one line: db_name=PROD2

Step 3) At a command prompt:
set oracle_sid=prod2
oradim –new –sid prod2
sqlplus / as sysdba
startup nomount
exit
rman auxiliary / msglog=c:\restore.log

Step 4) At the RMAN prompt:

duplicate database to prod2 spfile
set control_files=’C:\app\oracle\oradata\prod2\control01.ctl’
set db_file_name_convert=’E:\app\oradata\prod’,'C:\app\oracle\oradata\prod2′,’E:\app\prod_tbs’,'C:\app\oracle\oradata\prod2′
set LOG_FILE_NAME_CONVERT=’E:\app\oradata\prod’,'C:\app\oracle\oradata\prod2′,’C:\oracle\oradata\prod’,'C:\app\oracle\oradata\prod2′
set db_recovery_file_dest=’c:\app\administrator\flash_recovery_area’
set diagnostic_dest=’c:\app\administrator\diag’
backup location “c:\prod backup files\”;

That’s all it takes! As you can see, I changed all file location parameters and converted datafile and logfile names with the _CONVERT parameters. You can set any parameters for the new database in this way. For example you may want to disable all database jobs in the duplicate database by setting job_queue_processes=0. Or, change the size of the SGA for a smaller server. RMAN will create the PROD2 database, perform as much recovery as possible given the available archive logs and open the database with the resetlogs option. This is a really nice feature of RMAN.

Update RMAN configuration parameters from Sql*Plus

If you backup the controlfile with:
alter database backup controlfile to trace as '/oracle/${OSID}/admin/${NSID}_controlfile.sql';
This example found in backup controlfile

-- Configure snapshot controlfile filename
EXECUTE SYS.DBMS_BACKUP_RESTORE.CFILESETSNAPSHOTNAME('/oracle/product/11.2.0.3/dbs/snapshot_controlfile_WM820T.ctl');
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO RECOVERY WINDOW OF 31 DAYS');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEFAULT DEVICE TYPE TO','''SBT_TAPE''');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE ''SBT_TAPE'' FORMAT   ''LOG_%d_t%T_s%s_u%U'' PARMS  ''ENV=(TDPO_OPTFILE=/oracle/WM820T/admin/tdpo.opt)''');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEVICE TYPE','''SBT_TAPE'' PARALLELISM 1 BACKUP TYPE TO BACKUPSET');
-- Configure RMAN configuration record 5
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','''SBT_TAPE'' TO ''LOG_%d_controlfile_%F.rman''');
-- Configure RMAN configuration record 6
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 7
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('SNAPSHOT CONTROLFILE NAME','TO ''snapshot_controlfile_WM820T.ctl''');

RMAN reporting by André Araujo

Reference: pythian.com
Reproduced here in case it disappears from the internets.


A lot of metadata about the RMAN backup jobs can be found in the V$RMAN_% views.
These views show past RMAN jobs as well as jobs currently running.
Once the jobs complete backup sets, metadata about the sets and pieces are also added to the control file and can be accessed through the V$BACKUP_% views.

For the queries in this post I need only four of those views:

  • V$BACKUP_SET
  • V$BACKUP_SET_DETAILS
  • V$RMAN_BACKUP_JOB_DETAILS
  • GV$RMAN_OUTPUT

Query 1 (Backup jobs' status and metadata)

set lines 220
set pages 1000
col cf         for 9,999
col df         for 9,999
col elapsed_seconds heading "ELAPSED|SECONDS"
col i0         for 9,999
col i1         for 9,999
col l          for 9,999
col input_type for a13
col start_time for a19
col end_time   for a19
col output_mbytes for 9,999,999 heading "OUTPUT|MBYTES"
col session_recid for 999999 heading "SESSION|RECID"
col session_stamp for 99999999999 heading "SESSION|STAMP"
col status for a10 trunc
col time_taken_display for a10 heading "TIME|TAKEN"
col output_instance for 9999 heading "OUT|INST" noprint
select
  j.session_recid, j.session_stamp,
  to_char(j.start_time, 'yyyy-mm-dd hh24:mi:ss') start_time,
  to_char(j.end_time, 'yyyy-mm-dd hh24:mi:ss') end_time,
  (j.output_bytes/1024/1024) output_mbytes, j.status, j.input_type,
  decode(to_char(j.start_time, 'd'), 1, 'Sunday', 2, 'Monday',
                                     3, 'Tuesday', 4, 'Wednesday',
                                     5, 'Thursday', 6, 'Friday',
                                     7, 'Saturday') dow,
  j.elapsed_seconds, j.time_taken_display,
  x.cf, x.df, x.i0, x.i1, x.l,
  ro.inst_id output_instance
from V$RMAN_BACKUP_JOB_DETAILS j
  left outer join (select
                     d.session_recid, d.session_stamp,
                     sum(case when d.controlfile_included = 'YES' then d.pieces else 0 end) CF,
                     sum(case when d.controlfile_included = 'NO'
                               and d.backup_type||d.incremental_level = 'D' then d.pieces else 0 end) DF,
                     sum(case when d.backup_type||d.incremental_level = 'D0' then d.pieces else 0 end) I0,
                     sum(case when d.backup_type||d.incremental_level = 'I1' then d.pieces else 0 end) I1,
                     sum(case when d.backup_type = 'L' then d.pieces else 0 end) L
                   from
                     V$BACKUP_SET_DETAILS d
                     join V$BACKUP_SET s on s.set_stamp = d.set_stamp and s.set_count = d.set_count
                   where s.input_file_scan_only = 'NO'
                   group by d.session_recid, d.session_stamp) x
    on x.session_recid = j.session_recid and x.session_stamp = j.session_stamp
  left outer join (select o.session_recid, o.session_stamp, min(inst_id) inst_id
                   from GV$RMAN_OUTPUT o
                   group by o.session_recid, o.session_stamp)
    ro on ro.session_recid = j.session_recid and ro.session_stamp = j.session_stamp
where j.start_time > trunc(sysdate)-&NUMBER_OF_DAYS
order by j.start_time;

Query 2 (Backup set details)

set lines 220
set pages 1000
col backup_type for a4 heading "TYPE"
col controlfile_included heading "CF?"
col incremental_level heading "INCR LVL"
col pieces for 999 heading "PCS"
col elapsed_seconds heading "ELAPSED|SECONDS"
col device_type for a10 trunc heading "DEVICE|TYPE"
col compressed for a4 heading "ZIP?"
col output_mbytes for 9,999,999 heading "OUTPUT|MBYTES"
col input_file_scan_only for a4 heading "SCAN|ONLY"
select
  d.bs_key, d.backup_type, d.controlfile_included, d.incremental_level, d.pieces,
  to_char(d.start_time, 'yyyy-mm-dd hh24:mi:ss') start_time,
  to_char(d.completion_time, 'yyyy-mm-dd hh24:mi:ss') completion_time,
  d.elapsed_seconds, d.device_type, d.compressed, (d.output_bytes/1024/1024) output_mbytes, s.input_file_scan_only
from V$BACKUP_SET_DETAILS d
  join V$BACKUP_SET s on s.set_stamp = d.set_stamp and s.set_count = d.set_count
where session_recid = &SESSION_RECID
  and session_stamp = &SESSION_STAMP
order by d.start_time;

Query 3 (Backup job output)

set lines 200
set pages 1000
select output
from GV$RMAN_OUTPUT
where session_recid = &SESSION_RECID
  and session_stamp = &SESSION_STAMP
order by recid;