Use Recovery Manager to Perform Database Backups

1. Documentación en Tahiti -> Masters Book List -> Backup and Recovery User’s Guide -> 9 Backing Up the Database

2. Vamos a explorar las distintas posibilidades que existen a la hora de hacer Backups con RMAN. Uno de los comandos más sencillos consiste en hacer un Backup completo con los archivelogs. Para todas las pruebas que vamos a hacer usaremos la BD de OCM.

# Nos conectamos a la BD de OCM utilizando el catálogo de recuperación
rman target sys@ocm catalog rman/rman@oem

# Realizamos un Backup de todas la BD junto + ARCHIVELOGS
BACKUP DATABASE PLUS ARCHIVELOG;

Por defecto, los backups se están realizando en la FRA. Podemos consultar la ocupración de la FRA con la siguiente consulta.

SELECT * FROM V$RECOVERY_AREA_USAGE;

Siempre que lo necesitemos, por problemas de espacio en máquina, podemos borrar Backups manualmente, aunque no es aconsejable.

# Con este comando se borran todos los Backupsets
DELETE BACKUP;
# Con este otro comando borramos los Backups AS COPY
DELETE COPY OF DATABASE;

Veamos más formas de realizar Backups.

# Backup completo de la base de datos AS COPY
# Por defecto se realiza BACKUP AS BACKUPSET, a no ser que cambiemos la configuración de RMAN
# La ventaja de este tipo de Backups es que la operación de RESTORE es inmmediata
BACKUP AS COPY DATABASE PLUS ARCHIVELOG;

3. También tenemos la posibilidad de realizar Backups comprimidos. Se consume más CPU cuando se realiza es tipo de copias, pero el espacio que ahorramos puede ser enorme.

# Backup comprimido de BD + ARCHIVELOGS
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;

4. Podemos realizar Backups parciales de la BD (Tablespace, Datafile, …). Los siguientes ejercicios muestran distintos ejemplos.

# Backup de uno o varios DATAFILES
BACKUP AS COPY DATAFILE 1,2;
# Backup de un datafile especificando la ubicación
BACKUP AS COPY DATAFILE 1 FORMAT '/u01/app/oracle/fast_recovery_area/OCM/system01.dbf';

# Podemos utilizar formatos predeterminados para los backups
# El formato de los Backups se detalla en la siguiente página:
#   http://docs.oracle.com/cd/E11882_01/backup.112/e10643/rcmsubcl010.htm#RCMRF195
BACKUP ARCHIVELOG FROM SEQUENCE=1 FORMAT='/u01/app/oracle/fast_recovery_area/OCM/ar_%t_%s_%p' DELETE INPUT;

# Backup de uno o varios TABLESPACES
BACKUP TABLESPACE USERS;

5. Veamos ahora una estrategía “potente” para realizar Backups. Es importante recordar el concepto de Backup incremental. Se dice que un backup completo de la BD cuando se destina a una estrategia de Backups incrementales es de tipo 0. Los backups incrementales posteriores se llaman de nivel 1. El Backup incremental guarda únicamente los bloques que se han modificado desde el último backup de nivel 0 ó 1 (DIFFERENTIAL). Un segundo de tipo de backup incremental es aquel que copia todos los bloques desde el último backup de nivel 0 (CUMULATIVE). El backup DIFFERENTIAL se utiliza para reducir el tamaño y duración de los backups, mientras que el de tipo CUMULATIVE se utiliza principalmente para minimizar los tiempos de recuperación.

# El siguiente script, más complejo, nos ofrece una buena estrategía de Backups de la BD para el examen
#   · La 1a ejecución genera un BACKUP AS COPY de la BD completa (LEVEL 0 ya que no hay ninguno de LEVEL 1)
#   · La 2a ejecución y posteriores realiza un backup incremental (DIFFERENTIAL) de los cambios desde la última ejecución
#   · La 3a ejecución y posteriores realiza una recuperación de la COPIA de la BD antes de hacer el backup
# Este script ofrece una doble ventaja:
#   1. Backups de menor tamaño por se incrementales
#   2. Restauraciones (RESTORE) de ficheros muy rápidas al tener copias exactas de los DATAFILES (comando SWITCH)
RUN {
  RECOVER COPY OF DATABASE WITH TAG 'DAILY_BKP_POLICY';
  BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'DAILY_BKP_POLICY' DATABASE PLUS ARCHIVELOG;
}

# Podemos utilizar el mismo script para realizar BACKUPS incrementales de tipo CUMULATIVE
RUN {
  RECOVER COPY OF DATABASE WITH TAG 'DAILY_BKP_POLICY';
  BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'DAILY_BKP_POLICY' CUMULATIVE DATABASE PLUS ARCHIVELOG;
}

6. A continuación se muestran los comandos más útiles de RMAN para comprobar/listar información de los backups.

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
BACKUP VALIDATE DATABASE;           # Corrupciones físicas (Revisar V$DATABASE_BLOCK_CORRUPTION)
BACKUP CHECK LOGICAL DATABASE;      # Corrupciones Lógicos (Info. en Alert y session trace file)
RESTORE DATABASE VALIDATE;
REPORT NEED BACKUP;
REPORT OBSOLETE;
REPORT UNRECOVERABLE;
REPORT NEED BACKUP INCREMENTAL 2;   # Datafiles que requieren más de 2 INC en el Recovery
REPORT NEED BACKUP REDUNDANCY 2;
REPORT NEED BACKUP RECOVERY WINDOW OF 7 DAYS;
REPORT SCHEMA;
REPORT SCHEMA AT TIME 'SYSDATE-7';
VALIDATE DATABASE PLUS ARCHIVELOG;
VALIDATE CHECK LOGICAL TABLESPACE USERS;
VALIDATE CHECK LOGICAL DATAFILE 4;
VALIDATE CHECK LOGICAL DATAFILE 4 BLOCK 1 TO 10;
VALIDATE ARCHIVELOG ALL;
VALIDATE CHECK LOGICAL CURRENT CONTROLFILE;
VALIDATE CHECK LOGICAL BACKUPSET 6446;
RESTORE DATABASE PREVIEW;
RECOVER DATABASE PREVIEW;
LIST BACKUP OF DATABASE;
LIST BACKUP OF ARCHIVELOG FROM SCN 2953216;
LIST BACKUPPIECE '/u01/app/oracle/fast_recovery_area/OCM/autobackup/2013_06_07/o1_mf_s_817462899_8v31bmrs_.bkp';
LIST BACKUPPIECE 8222;
LIST BACKUPSET 8220;
LIST COPY OF TABLESPACE SYSTEM;
LIST COPY OF DATABASE ARCHIVELOG FROM TIME='SYSDATE-7';
LIST INCARNATION;
LIST EXPIRED BACKUP;
LIST BACKUP SUMMARY;                # TY = B/P (Backupset/Proxy copy)
                                    # LV = [01]/F/A (Incremental level X/Datafiles/Archivelogs)
                                    # S = A/U/X (Available/Unavailable/Expired)

7. También existen una serie de vistas que nos dan información acerca de las piezas de backup y otros datos.

· V$ARCHIVED_LOG
· V$COPY_CORRUPTION
· V$DATABASE_BLOCK_CORRUPTION
· V$RMAN_CONFIGURATION
· V$BACKUP_<CORRUPTION|SET|SPFILE|DATAFILE|DEVICE|FILES|PIECE|REDOLOG|SYNC_IO|ASYNC_IO>
· V$PROXY_<ARCHIVEDOG|DATAFILE>

8. Cuando una tarea dentro de una operación de Backup/Restore se prolonga más de 6 de segundos, se puede consultar el estado de esta tarea en la vista V$SESSION_LONGOPS.

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
COL OPNAME FORMAT A30
SELECT
  SID,
  SERIAL#,
  OPNAME,
  SOFAR,
  TOTALWORK,
  ROUND(SOFAR/TOTALWORK*100,2) COMPLETE,
  TO_DATE(SYSDATE+(TIME_REMAINING/(24*60*60))) "ESTTIME"
FROM
  V$SESSION_LONGOPS
WHERE
  TOTALWORK != 0
  AND SOFAR != TOTALWORK
ORDER BY 1;