martes, 25 de septiembre de 2012

La importancia de un DRP y unos cuantos datos al respecto

Este fin de semana pasado estuve involucrado en un plan de desastres y recuperación, DRP (Disaster Recovery Plan) por sus siglas en ingles, básicamente lo que se hace en un DRP es planear lo peor, como por ejemplo que pasaría si tu site principal se cae, y que acciones tomar en caso de que suceda.

Y aunque se puede decir que en un DRP tienes un control de lo que esta sucediendo, si te ayuda a ver que pasos te están fallando en tus procedimientos estándares de operación, y poder actualizarlos, ya que a la mejor pensabas que tu manera de tomar un respaldo era correcta, pero al ejecutar el DRP te das cuenta de que no puedes recuperar tu base de datos, estas pruebas te sirven para encontrar esos hoyos en tu plan.

Buscando un poco mas de datos acerca de la cantidad de empresas que llevan a cabo un DRP, me tope con una encuesta ejercida por el IOUG (Independent Oracle Users Group) efectuada este 2012 a mas de 350 profesionistas en donde el 51% fueron administradores de base datos, en donde resalta para mi lo siguiente :

  • El 18% de los encuestados nunca han llevado a cabo un DRP
  • El 37 % de los encuestados solamente hace un DRP parcial de sus datos.
  • El 43 % de los encuestados mencionan que el financiamiento es una de las mas fuertes restricciones para llevar a cabo un DRP.
  • El 12% de los encuestados no sabe cuanto tiempo se puede llevar en restaurar los datos en caso de un "apagón" de operaciones.

Es un poco preocupante ver números arriba del 10% en estas categorías, ya que desde mi punto de vista, como DBA, lo mas importante es tener los datos disponibles, si tus datos no están disponibles, realmente estas en una situación no deseable por ningún DBA.

A final de cuentas, si tu cliente se tarda en recibir los datos que necesita cuando lanza un Query , puede de alguna manera en vivir con ese tiempo en que se esta tardando en recibir los datos, no va a estar contento, pero va a obtener los datos que anda buscando, pero que pasa si necesita los datos y nunca los va a poder obtener?

A lo que quiero llegar es que si al día de hoy no tienes entre tus estándares un DRP en operacion, ve planeando uno, este te va servir para detectar , corregir y hasta probablemente prevenir un "apagón" de tus operaciones y/o perdida de datos. De igual manera, un DRP te va ayudar a establecer un SLA de tus tiempos en caso de un desastre,

Así que ve planeando un DRP y encuentra las debilidades en tu arquitectura para en lugar de salir como perdedor en un desastre seas el héroe y de pasada mantengas tu trabajo :) .

miércoles, 5 de septiembre de 2012

RAC : Como crear un recurso de aplicacion de usuario en CRS

Cuando manejas RAC, existe un herramienta llamada crsctl, esta herramienta es una interfase para manejar los recursos pertenecientes al clusterware. Pero al igual esta herramienta te puede ayudar para que tus aplicaciones estén disponibles cuando tu cluster esta disponible y viceversa.

Esto nos sirve a nosotros no nada mas para aplicaciones de usuario , si no también para herramientas que nos sirven para monitorear nuestros nodos, en este caso OSWbb (OS Watcher Black Box 461053.1) y aunque existe un documento para arrancar OSWbb como un servicio del sistema operativo,580513.1, aquí lo vamos a poner con crsctl

Como siempre, esto lo debes de ensayar en un ambiente de pruebas antes de moverlo a un ambiente de producciony de igual manera verificar los scripts que te estoy mencionando.

Lo primero que tienes que hacer es bajar OSWbb e instalarlo en la misma dirección en todos los nodos que le pertenece a tu granja de servidores RAC, yo lo puse en la siguiente dirección:

/mount/dba01/oracle/oswbb_51

De ahí tienes que crear un script que llame a los cuatro comandos necesarios para que funcione con crsctl (START,STOP,CHECK y CLEAN) y que de la misma manera sea visible para todos los nodos en la misma locación , en este caso el script que voy a utilizar  lleva el nombre de rac_verificar_oswbb.sh , y lo puede encontrar dándole click al nombre anterior.

Lo único que cambiar en el script que te acabo de mencionar es cambiar la variable OSWPATH a donde tu descomprimiste la ultima versión de OSWbb.

OSWPATH=/mount/dba01/oracle/oswbb_51

Asegurate que el usuario con el que vas a crear el recurso, ya sea root o grid ,tenga permisos de escritura y ejecución sobre rac_verificar_oswbb.sh  y OSWPATH

Una vez que hiciste lo anterior , con el usuario root o el usuario grid, dependiendo con que usuario vayas a crear el recurso, en mi caso use el usuario root, tienes que verificar que los siguiente cuatro comandos corran sin ningún error, si alguno no sirve o corre con error, no va a funcionar lo que estamos haciendo.

Una vez que hayas resuelto y/o verificado que no tienes ningún problema, hay que crear el recurso, asegurate que el recurso no tenga el prefijo ora.,ya que este es para los recursos manejados por Oracle, en este caso utilice un prefijo llamado usr.

root@servidor1.oracleenespanol.blogspot.com  /home/oracle
root $ crsctl add resource usr.oswbb -type ora.local_resource.type -attr "AUTO_START=always,RESTART_ATTEMPTS=2, START_TIMEOUT=100,STOP_TIMEOUT=100,CHECK_INTERVAL=60,ACTION_SCRIPT=/mount/dba01/oracle/admin/rac_verificar_oswbb.sh"

Ya creado el recurso, ya nada mas tienes que iniciarlo y verificar que esta corriendo

root@servidor1.oracleenespanol.blogspot.com  /home/oracle
root $ crsctl start resource usr.oswbb
CRS-2672: Attempting to start 'usr.oswbb' on 'servidor1'
CRS-2672: Attempting to start 'usr.oswbb' on 'servidor2'
CRS-2676: Start of 'usr.oswbb' on 'servidor1' succeeded
CRS-2676: Start of 'usr.oswbb' on 'servidor2' succeeded

root@servidor1.oracleenespanol.blogspot.com  /home/oracle
root $ crsctl status resource usr.oswbb
NAME=usr.oswbb
TYPE=ora.local_resource.type
TARGET=ONLINE                , ONLINE
STATE=ONLINE on servidor1, ONLINE on servidor2

Conclusión

Este método no nada mas sirve para OSWbb , si no para cualquier aplicación que este ligado a tu cluster, y ahora si la imaginación y lo complejo que quieres que sea es tuyo.


lunes, 3 de septiembre de 2012

RMAN : Como Verificar que tengo un respaldo consistente

El otro día me hicieron una pregunta de que como podía verificar que el respaldo que había tomado . Para esto RMAN tiene unos comandos que nos ayudan a verificar que respaldos tenemos y la integridad de ellos

Todos lo comandos que utilice no van a restaurar los respaldos, solamente lee y los valida, lo que si te debo de decir es que tengas cuidado con los comandos que vas a lanzar, ya que en varios , si la palabra VALIDATE no se encuentra presente, en lugar de validar el respaldo, empieza a restaurar el respaldo.

Aquí esta un resumen de los comandos que vamos a usar y estos son validos para un canal SBT o DISK

  • RESTORE DATABASE PREVIEW ;
  • RESTORE DATABASE VALIDATE;
  • RESTORE ARCHIVELOG FROM sequence xx UNTIL SEQUENCE yy THREAD nn VALIDATE;
  • RESTORE CONTROLFILE VALIDATE;
  • RESTORE SPFILE VALIDATE;
Lo primero que tenemos que hacer es definir el tiempo al que queremos restaurar nuestro respaldo. Una vez definido este tiempo, el primer comando que vamos a usar es RESTORE... PREVIEW, este comando identifica el respaldo necesario para llevar a cabo la operación de restaurar así como los Archived Redo logs necesarios.


RMAN> RUN
2> {
3> set until time "to_date('03-SEP-201222:20:00','dd-mm-yyyyhh24:mi:ss')";
4> allocate channel ch1 device type disk ;
5> RESTORE DATABASE PREVIEW ;
6> }   

executing command: SET until clause

allocated channel: ch1
channel ch1: SID=158 instance=TESTDB1 device type=DISK

Starting restore at 03-SEP-2012 22:54:18


List of Backup Sets
===================


BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ --------------------
6       Full    75.34M     DISK        00:00:19     03-SEP-2012 22:01:04
        BP Key: 6   Status: AVAILABLE  Compressed: YES  Tag: TESTDB_HOT_0904_2100
        Piece Name: /mount/copy01/TESTDB/oracle/TESTDB/full/TESTDB_HOT_09032012_1_6_793058445
  List of Datafiles in backup set 6
  File LV Type Ckp SCN    Ckp Time             Name
  ---- -- ---- ---------- -------------------- ----
  1       Full 224235     03-SEP-2012 22:00:46 +DATA/TESTDB/datafile/system01.dbf
  2       Full 224235     03-SEP-2012 22:00:46 +DATA/TESTDB/datafile/sysaux01.dbf
  3       Full 224235     03-SEP-2012 22:00:46 +DATA/TESTDB/datafile/undotbs1_01.dbf
  4       Full 224235     03-SEP-2012 22:00:46 +DATA/TESTDB/datafile/undotbs2_01.dbf
  5       Full 224235     03-SEP-2012 22:00:46 +DATA/TESTDB/datafile/users_01.dbf


List of Backup Sets
===================


BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ --------------------
9       482.00K    DISK        00:00:00     03-SEP-2012 22:01:39
        BP Key: 9   Status: AVAILABLE  Compressed: YES  Tag: TESTDB_ARCH_0904_2100
        Piece Name: /mount/copy01/TESTDB/oracle/TESTDB/arch/TESTDB_ARCH_09032012_1_9_793058499

  List of Archived Logs in backup set 9
  Thrd Seq     Low SCN    Low Time             Next SCN   Next Time
  ---- ------- ---------- -------------------- ---------- ---------
  1    8       222449     03-SEP-2012 21:57:53 224442     03-SEP-2012 22:01:33
  2    4       222452     03-SEP-2012 21:59:38 224448     03-SEP-2012 22:03:17
  1    9       224442     03-SEP-2012 22:01:33 224456     03-SEP-2012 22:01:36
  2    5       224448     03-SEP-2012 22:03:17 224459     03-SEP-2012 22:03:21

BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ --------------------
12      389.50K    DISK        00:00:01     03-SEP-2012 22:21:50
        BP Key: 12   Status: AVAILABLE  Compressed: YES  Tag: TESTDB_ARCH_0904_22_20
        Piece Name: /mount/copy01/TESTDB/oracle/TESTDB/full/0bnka8bt_1_1

  List of Archived Logs in backup set 12
  Thrd Seq     Low SCN    Low Time             Next SCN   Next Time
  ---- ------- ---------- -------------------- ---------- ---------
  1    10      224456     03-SEP-2012 22:01:36 225574     03-SEP-2012 22:21:01

BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ --------------------
11      25.00K     DISK        00:00:00     03-SEP-2012 22:21:50
        BP Key: 11   Status: AVAILABLE  Compressed: YES  Tag: TESTDB_ARCH_0904_22_20
        Piece Name: /mount/copy01/TESTDB/oracle/TESTDB/full/0cnka8bu_1_1

  List of Archived Logs in backup set 11
  Thrd Seq     Low SCN    Low Time             Next SCN   Next Time
  ---- ------- ---------- -------------------- ---------- ---------
  2    6       224459     03-SEP-2012 22:03:21 225577     03-SEP-2012 22:22:45
Media recovery start SCN is 224235
Recovery must be done beyond SCN 224235 to clear datafile fuzziness
Finished restore at 03-SEP-2012 22:55:15
released channel: ch1

El siguiente paso, que es RESTORE DATABASE VALIDATE, va a leer las piezas del respaldo y si llega a encontrar algún error , va a reportar este error


RMAN> RUN
2> {
3> set until time "to_date('03-SEP-201222:20:00','dd-mm-yyyyhh24:mi:ss')";
4> allocate channel ch1 device type disk ;
5> restore database validate;
6> }

executing command: SET until clause

allocated channel: ch1
channel ch1: SID=158 instance=TESTDB1 device type=DISK

Starting restore at 03-SEP-2012 22:51:44

channel ch1: starting validation of datafile backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/full/TESTDB_HOT_09032012_1_6_793058445
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/full/TESTDB_HOT_09032012_1_6_793058445 tag=TESTDB_HOT_0904_2100
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:25
Finished restore at 03-SEP-2012 22:52:38
released channel: ch1

Pero si te fijaste, esto solamente leyó el backupset del respaldo completo, así que hace falta ver si los backupsets de los archivelogs estan integros para hacer en dado caso de ser necesario restaurar tu base de datos, para esto, lo que te recomiendo yo es que del resultado del primer comando, de allí sacar los valores de la secuencias de archive logs que requieres y de una vez que tienes estos valores ,correr el comando RESTORE ARCHIVELOG. . . VALIDATE

RMAN> RUN
2> {
3> allocate channel ch1 type disk;
4> restore archivelog from sequence 8 until sequence 10 thread 1 validate;
5> restore archivelog from sequence 4 until sequence 6 thread 2 validate;
6> }

allocated channel: ch1
channel ch1: SID=158 instance=TESTDB1 device type=DISK

Starting restore at 03-SEP-2012 23:15:11

channel ch1: starting validation of archived log backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/arch/TESTDB_ARCH_09032012_1_9_793058499
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/arch/TESTDB_ARCH_09032012_1_9_793058499 tag=TESTDB_ARCH_0904_2100
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
channel ch1: starting validation of archived log backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/full/0bnka8bt_1_1
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/full/0bnka8bt_1_1 tag=TESTDB_ARCH_0904_22_20
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
Finished restore at 03-SEP-2012 23:15:15

Starting restore at 03-SEP-2012 23:15:17

channel ch1: starting validation of archived log backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/arch/TESTDB_ARCH_09032012_1_9_793058499
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/arch/TESTDB_ARCH_09032012_1_9_793058499 tag=TESTDB_ARCH_0904_2100
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
channel ch1: starting validation of archived log backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/full/0cnka8bu_1_1
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/full/0cnka8bu_1_1 tag=TESTDB_ARCH_0904_22_20
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
Finished restore at 03-SEP-2012 23:15:21
released channel: ch1

Ya por ultimo vamos a validar que podemos restaurar el controlfile y nuestro archivo de parámetros binario


RMAN> RUN
2> {
3> allocate channel ch1 type disk;
4> set until time "to_date('03-SEP-201222:20:00','dd-mm-yyyyhh24:mi:ss')";
5> restore controlfile validate;
6> restore spfile validate;
7> }

allocated channel: ch1
channel ch1: SID=158 instance=TESTDB1 device type=DISK

executing command: SET until clause

Starting restore at 03-SEP-2012 23:23:14

channel ch1: starting validation of datafile backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/control/c-3899479525-20120903-03
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/control/c-3899479525-20120903-03 tag=TAG20120903T220143
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
Finished restore at 03-SEP-2012 23:23:15

Starting restore at 03-SEP-2012 23:23:16

channel ch1: starting validation of datafile backup set
channel ch1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/control/c-3899479525-20120903-04
channel ch1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/control/c-3899479525-20120903-04 tag=TAG20120903T222152
channel ch1: restored backup piece 1
channel ch1: validation complete, elapsed time: 00:00:01
Finished restore at 03-SEP-2012 23:23:18
released channel: ch1

Conclusión

Estos comandos aunque sencillos, son muy útiles para validar tus respaldos, mi recomendación es que los corras una vez a la semana, ya que no te quieres enfrentar a una situación en donde tengas que restaurar tus respaldo y saber que tenias algún error y no poder hacerlo