Como hacer un respaldo en Oracle usando RMAN de la forma mas sencilla

junio 25, 2013
admin

respaldo en oracle usando rman

Respaldo en Oracle usando RMAN:

Para descargar este tutorial en un PDF mucho mas fácil de seguir:
RespaldoyRecuperacionRMAN

 

Escribo este artículo porque al buscar sobre respaldos de Oracle o son extensas explicaciones de cómo funciona RMAN, solo hablare de lo mínimo necesario para tener un respaldo

  • Los scripts están pensados para implementarse en Unix/linux
  • Respaldo completo de la base de datos completa respaldando todos los datafiles
    Respaldo del controlfile
  • Respaldo completo de todos los archivelogs, permitiendo la posibilidad de mover la BD a un punto en el tiempo hacia atrás (definido por el tiempo de retención)
  • Todos los archivos de respaldos ya se encuentran compresos al nivel más eficiente
  • El script configura un tiempo de retención de 7 días, modifica esto dependiendo del tamaño de la BD
  • La ubicación donde guarda los archivos de respaldo no sigue las recomendaciones OFA, los guarda en /Backup/diario por conveniencia de la SAN
  • Dominando los pasos de recuperación se puede recuperar, mover o clonar la base de datos en 15-60 min dependiendo del tamaño de la BD

El siguiente script lo guardas dentro de un archivo llamado rmandisco.rman

configure retention policy to recovery window of 7 days;
configure backup optimization on;
configure controlfile autobackup on;
configure default device type to disk;
configure device type disk parallelism 1;
backup type to compressed backupset;
configure datafile backup copies for device type disk to 1;
configure maxsetsize to unlimited;
configure snapshot controlfile name to ‘/backup/snapshot_controlfile/controlfile’;
show all;
host ‘mkdir /backup/diario/$(date+%Y-%m-%d)’;
run {
allocate channel ch1 type Disk maxpiecesize = 2600M;
backup full database noexclude
include current controlfile  format ‘/backup/diario/%Y-%M-%D/datafile_%s_%p.bak’
tag ‘datafile diario’;
}
run {
allocate channel ch1 type Disk maxpiecesize = 2600M;
backup archivelog all format ‘/backup/diario/%Y-%M-%D/archivelog_%s_%p.bak’
tag ‘archivelog diario’;
}
run {
allocate channel ch1 type Disk maxpiecesize = 1900M;
backup format ‘/backup/diario/%Y-%M-%D/controlfile_%s.bak’ current controlfile;
}
crosscheck backup;
list backup of database;
report unrecoverable;
report schema;
report need backup;
report obsolete;
#delete noprompt expired backup of database;
#delete noprompt expired backup of controlfile;
#delete noprompt expired backup of archivelog all;
#delete noprompt obsolete recovery window of 7 days;
quit
EOF

 

 

Si quieres que al final de la ejecución del script borre los Backup y archivelogs que excedan el periodo de recuperación, des comenta las últimas líneas (elimina el #)

Una vez teniendo este script hay que generar un archivo SHELL que mande llamar el RMAN

El siguiente script se encuentra dentro de un archivo llamado rmandisco.sh :

$ORACLE_HOME/bin/rman
target / @/export/home/oracle/backupscripts/rmandisco.rman

Luego cuando tengas ambos archivos rmandisco.rman y rmandisco.sh, otorga permisos de ejecución al archivo rmandisco.sh con “ chmod 776 rmandisco.sh

Listo, ya solo manda llamar el comando ./rmandisco.sh y se creara una carpeta dentro de /Backup/diario con la fecha y dentro se guardara todo lo necesario para recuperar la base de
datos de cero

Nota: estos scripts no explotan todo lo que es posible de hacer con RMAN como los respaldos incrementales, respaldos auto programados, respaldo directo a cinta, etc. Pero es lo mínimamente deseado y de la forma más eficiente

recuperar base de datos oracle

recuperar base de datos oracle

Para recuperar completamente la base de datos utilizando estos respaldos:

·
En el ejemplo estoy moviendo los archivos de respaldos a un nuevo servidor que ya
tiene Oracle Database instalado, esta versión de Oracle es la misma versión que
el origen y tiene la misma versión de Sistema Operativo.

·
En el ejemplo estoy dejando la BD con exactamente el mismo nombre y exactamente
las mismas rutas de los datafiles (para hacer el ejercicio lo mas básico y
sencillo posible) luego subiré la manera para migrarla con otro nombre de
instancia y si solo le quieres cambiar el nombre busca en otro de los
tutoriales de la pagina

·
En el ejemplo estoy realizando todos los movimientos de archivos con el usuario de
sistema operativo “oracle” recomiendo no moverlo con root para evitar problemas

·
Para ejemplificar el servidor origen tiene la IP 192.168.1.2 y el servidor destino
tiene 192.168.1.3

·
Obviamente todas las rutas de Linux asi como las fechas que pongo son únicamente para
ejemplificar, probablemente las rutas de los backups asi como del HOME de
Oracle deben de ser diferente en tu sistema, cambia lo que sea necesario

 

 Mueve los archivos del servidor origen al servidor destino, para esto puedes usar el comando scp (secure copy) que sirve para enviar archivos entre servidores Linux a través del puerto SSH

Oracle@192.168.1.2>
scp –r /backup/diario/31-12-2013 oracle@192.168.1.3:/backup/diario/

Después de esto confirmas con la tecla Y, y espera que la copia sea completada

Luego copia el archivo de parámetros del servidor origen al servidor destino, también con SCP

Oracle@192.168.1.2> scp /app/Oracle/product/11.2.0/home1/dbs/initBD1.ora
oracle@192.168.1.2: /app/Oracle/product/11.2.0/home1/dbs/

 Cierra la sesión de terminal del servidor origen para evitar accidentes

En el servidor destino exporta la variable ORACLE_SID al nombre de la BD que vas a
respaldar

Oracle@192.168.1.3> export ORACLE_SID=BD1

Luego entra al sqlplus e inicia la base de datos en estado “nomount”

SQL>
startup nomount;

Luego recupera el controlfile del Backup

run
{allocate channel c1 device type disk;
restore controlfile from ‘/backup/diario/2013-12-31/controlfile_2346.bak’;
}

después de escribir esto te despliega algo como:

using target database control file instead of
recovery catalog

allocated channel: c1

channel c1: SID=753 device type=DISK

Starting restore at 23-JUN-13

channel c1: restoring control file
channel c1: restore complete, elapsed time:

00:00:03

output file name=/u01/oradata/BD1/control01.ctl
output file name=/u02/oradata/BD1/control02.ctl
output file name=/u03/oradata/BD1/control03.ctl
Finished restore at 23-JUN-13
released channel: c1


Luego que te muestre eso, montas la base de datos escribiendo

RMAN> alter database mount;

Te muestra:

database mounted

Hasta aquí vamos bien

Luego tienes que decirle al RMAN donde se encuentran los respaldos que quieres recuperar,
para esto agregas la carpeta de los respaldos al catalogo interno, para esto es
con el comando:

RMAN> catalog start with ‘/backup/diario/2013-12-31/’;

Te muestra algo como:

searching for all files that match the pattern /backup/diario/2013-12-31/

 List of Files Unknown to the Database

=====================================

File Name:
/backup/diario/2013-12-31/archivelog_2343_1.bak
File Name:
/backup/diario/2013-12-31/datafile_2337_1.bak
File Name: /backup/diario/2013-12-31/datafile_2338_1.bak
File Name:/backup/diario/2013-12-31/datafile_2341_1.bak
File Name:/backup/diario/2013-12-31/datafile_2339_1.bak
File Name:/backup/diario/2013-12-31/datafile_2340_1.bak

File Name:/backup/diario/2013-12-31/controlfile_2346.bak
File Name:/backup/diario/2013-12-31/archivelog_2344_1.bak

Do you really want to catalog the above files
(enter YES or NO)? yes

cataloging files…

cataloging done

 List of Cataloged Files

=======================

File Name: /backup/diario/2013-12-31/archivelog_2343_1.bak

File Name:
/backup/diario/2013-12-31/datafile_2337_1.bak

File Name:
/backup/diario/2013-12-31/datafile_2338_1.bak

File Name:
/backup/diario/2013-12-31/datafile_2341_1.bak

File Name:
/backup/diario/2013-12-31/datafile_2339_1.bak

File Name: /backup/diario/2013-12-31/datafile_2340_1.bak

File Name:
/backup/diario/2013-12-31/controlfile_2346.bak

File Name:
/backup/diario/2013-12-31/archivelog_2344_1.bak

 

Hasta aqui vamos excelente, ya solo el paso final, (va todo asi como esta escrito el
script se ejecuta solo al recibir } )

RMAN> run
{
allocate channel c1 device type disk;
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}

Este punto va a tardar un rato, esta recreando todos los datafiles

Al final debe de salir un mensaje de error como este:

unable to find archived log

archived log thread=1 sequence=15915

released channel: c1

RMAN-00571:
===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of recover command at
06/23/2013 12:27:01

RMAN-06054: media recovery requesting unknown
archived log for thread 1 with sequence 15915 and starting SCN of 13028136591

Este mensaje es “normal”

Lo que sigue por hacer es, sal de RMAN y entra al SQLPLUS y escribe:

SQL> recover database using backup controlfile
until cancel;

Luego te va a salir una advertencia con ORA-00289 y ORA-00280, cuando esto salga tienes que
escribir textualmente

CANCEL

Luego te indicara : Media recovery cancelled.

Por ultimo paso escribe

SQL> alter database open resetlogs;

Este paso también tomara un tiempo, ten paciencia

Cuando salga Database altered. Ya la Base de datos está funcionando y arriba,
de aquí solo procede configurar los tnsnames y reiniciar el listener y ya.

 

Si te sale el error al darle recovery o restore:

RMAN-06026: some targets not found – aborting restore
RMAN-06023: no backup or copy of datafile 4 found to restore

Significa que la carpeta de archivelogs NO esta vacía, entra al archivo de parámetros y modifica la ruta de archive_log_dest y pon otra ruta diferente o borra los archivelogs anteriores.

No comments

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *