viernes, 8 de marzo de 2013

Verificar datafiles corruptos


Estimados tecnólogos Oracle reciban un cordial saludo nuevamente desde Guatemala, como ustedes saben, un DBA se enfrenta diariamente a diferentes problemas con las bases de datos que administra, problemas de performance, de IO, de red, storage, CPU, etc., para poder encontrar  la solución a estos problemas, el DBA debe ir delimitando la causa, y es por eso que en esta ocasión veremos una manera fácil de verificar si una base de datos posee corrupciones.

Oracle provee desde la versión 7.3.2, una herramienta llamada DBVERIFY la cual es usada para lo siguiente:

  • Validar corrupciones en  la cabecera de un datafile
  • Cada Bloque de dato dentro de un Datafile tiene un "wrapper" en el cual se encuentra metadata de  dicho bloque, este wrapper también es validado en busca de corrupciones.
  • Validar Consistencia en tablas e índices dentro de los datafiles.
  • Desde la versión 8.1.6 también se validan todos los demás tipos de bloques, por ejemplo  bloques de segmentos rollback.


Una de las ventajas de esta herramientas es que puede ser ejecutada cuando la base de datos está abierta, esto en ambiente de producción es muy importante pues se evita downtime.
La herramienta es muy sencilla de utilizar y provee los siguientes parámetros de entrada:

FILE:               nombre del datafile que se verificará.
START:           Bloque inicial
END:               Bloque Final
BLOCKSIZE: Tamaño del Bloque
LOGFILE:       Una archivo de log en el que se escribirá el feedback de la operación.
FEEDBACK:   Muestra detalladamente el avance del proceso.
PARFILE:        Archivo de parámetro
USERID:         Usuario/Constraseña

Entre las limitantes que tiene esta herramienta  están las siguientes:

  • No valida errores entre tablas e sus indices.
  • Solo puede ser utilizada con datafiles, no redologs, ni controlfiles.
  • dbverify puede ser usada para bases de datos en ASM, sin embargo, la base de datos debe estar abierta y el parámetro USERID debe necesariamente ser especificado.
  • Los datafiles necesitan tener una extensión.
  • No se pueden validar datafiles mayores a 2GB  en 8.1.6 por los bugs: 710888 y 1372172.


El uso de la herramienta es muy fácil, a continuación describo la manera de validar una base de datos completa:

Primero obtenemos el tamaño del bloque que se está utilizando en la base de datos mediante la siguiente consulta:

SQL> SELECT value  FROM v$parameter WHERE name = 'db_block_size';
VALUE
-----------------------------------------------------------------
8192

Ahora continuamos realizando un script con las sentencias necesarias para validar todos nuestros datafiles:

SET ECHO OFF
set heading off
set feedback off

spool validardb.sql

select 'dbv file=' ||file_name|| ' logfile=archivo_'||rownum||'.log  blocksize=8192' from dba_data_files;

spool off
exit

Verificamos que el archivo haya sido generado correctamente:

[oracle@soa1 ~]$ ls -ltr
-rw-r--r-- 1 oracle oinstall      5092 Mar  8 01:25 validardb.sql

El archivo debería quedar de la siguiente manera:


Le damos permisos de ejecución al script creado:

[oracle@soa1 ~]$ chmod 777 validardb.sql

Ejecutamos el script:
[oracle@soa1 ~]$ ./validardb.sql

DBVERIFY: Release 11.2.0.1.0 - Production on Fri Mar 8 02:33:01 2013

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

Verificamos la salida del archivo:

[oracle@soa1 ~]$ ls -ltr
-rwxrwxrwx 1 oracle oinstall      1718 Mar  8 02:32 validardb.sql
-rw-r--r-- 1 oracle oinstall       729 Mar  8 02:33 archivo_2.log
-rw-r--r-- 1 oracle oinstall       726 Mar  8 02:33 archivo_1.log
-rw-r--r-- 1 oracle oinstall       809 Mar  8 02:33 archivo_3.log
-rw-r--r-- 1 oracle oinstall       739 Mar  8 02:33 archivo_4.log
-rw-r--r-- 1 oracle oinstall       736 Mar  8 02:33 archivo_5.log
-rw-r--r-- 1 oracle oinstall       738 Mar  8 02:33 archivo_6.log
-rw-r--r-- 1 oracle oinstall       734 Mar  8 02:33 archivo_7.log
-rw-r--r-- 1 oracle oinstall       740 Mar  8 02:33 archivo_8.log
-rw-r--r-- 1 oracle oinstall       735 Mar  8 02:33 archivo_9.log
-rw-r--r-- 1 oracle oinstall       729 Mar  8 02:33 archivo_10.log
-rw-r--r-- 1 oracle oinstall       733 Mar  8 02:33 archivo_11.log
-rw-r--r-- 1 oracle oinstall       726 Mar  8 02:33 archivo_12.log
-rw-r--r-- 1 oracle oinstall       732 Mar  8 02:33 archivo_13.log
-rw-r--r-- 1 oracle oinstall       728 Mar  8 02:33 archivo_14.log
-rw-r--r-- 1 oracle oinstall       738 Mar  8 02:33 archivo_17.log
-rw-r--r-- 1 oracle oinstall       729 Mar  8 02:33 archivo_16.log
-rw-r--r-- 1 oracle oinstall       732 Mar  8 02:33 archivo_15.log

Escaneamos los archivos con extensión .log en busca de corrupción:

[oracle@soa1 ~]$ grep Failing  archivo*.log
[oracle@soa1 ~]$ grep Corrupt archivo*.log
[oracle@soa1 ~]$ grep Influx archivo*.log

La salida sería parecida a lo siguiente, en mi caso, la base de datos que estoy usando para realizar este articulo no contiene corrupciones:

[oracle@soa1 ~]$ grep Failing  archivo*.log
archivo_10.log:Total Pages Failing   (Data) : 0
archivo_10.log:Total Pages Failing   (Index): 0
archivo_10.log:Total Pages Failing   (Seg)  : 0
archivo_11.log:Total Pages Failing   (Data) : 0
archivo_11.log:Total Pages Failing   (Index): 0
archivo_11.log:Total Pages Failing   (Seg)  : 0
archivo_12.log:Total Pages Failing   (Data) : 0
archivo_12.log:Total Pages Failing   (Index): 0
archivo_12.log:Total Pages Failing   (Seg)  : 0
archivo_13.log:Total Pages Failing   (Data) : 0
archivo_13.log:Total Pages Failing   (Index): 0
archivo_13.log:Total Pages Failing   (Seg)  : 0
archivo_14.log:Total Pages Failing   (Data) : 0
archivo_14.log:Total Pages Failing   (Index): 0
archivo_14.log:Total Pages Failing   (Seg)  : 0
archivo_15.log:Total Pages Failing   (Data) : 0
archivo_15.log:Total Pages Failing   (Index): 0
archivo_15.log:Total Pages Failing   (Seg)  : 0
archivo_16.log:Total Pages Failing   (Data) : 0
archivo_16.log:Total Pages Failing   (Index): 0
archivo_16.log:Total Pages Failing   (Seg)  : 0
archivo_17.log:Total Pages Failing   (Data) : 0
archivo_17.log:Total Pages Failing   (Index): 0
archivo_17.log:Total Pages Failing   (Seg)  : 0
archivo_1.log:Total Pages Failing   (Data) : 0
archivo_1.log:Total Pages Failing   (Index): 0
archivo_1.log:Total Pages Failing   (Seg)  : 0
archivo_2.log:Total Pages Failing   (Data) : 0
archivo_2.log:Total Pages Failing   (Index): 0
archivo_2.log:Total Pages Failing   (Seg)  : 0
archivo_3.log:Total Pages Failing   (Data) : 0
archivo_3.log:Total Pages Failing   (Index): 0
archivo_3.log:Total Pages Failing   (Lob)  : 0
archivo_3.log:Total Pages Failing   (Seg)  : 0
archivo_4.log:Total Pages Failing   (Data) : 0
archivo_4.log:Total Pages Failing   (Index): 0
archivo_4.log:Total Pages Failing   (Seg)  : 0
archivo_5.log:Total Pages Failing   (Data) : 0
archivo_5.log:Total Pages Failing   (Index): 0
archivo_5.log:Total Pages Failing   (Seg)  : 0
archivo_6.log:Total Pages Failing   (Data) : 0
archivo_6.log:Total Pages Failing   (Index): 0
archivo_6.log:Total Pages Failing   (Seg)  : 0
archivo_7.log:Total Pages Failing   (Data) : 0
archivo_7.log:Total Pages Failing   (Index): 0
archivo_7.log:Total Pages Failing   (Seg)  : 0
archivo_8.log:Total Pages Failing   (Data) : 0
archivo_8.log:Total Pages Failing   (Index): 0
archivo_8.log:Total Pages Failing   (Seg)  : 0
archivo_9.log:Total Pages Failing   (Data) : 0
archivo_9.log:Total Pages Failing   (Index): 0
archivo_9.log:Total Pages Failing   (Seg)  : 0
[oracle@soa1 ~]$ grep Corrupt archivo*.log
archivo_10.log:Total Pages Marked Corrupt   : 0
archivo_11.log:Total Pages Marked Corrupt   : 0
archivo_12.log:Total Pages Marked Corrupt   : 0
archivo_13.log:Total Pages Marked Corrupt   : 0
archivo_14.log:Total Pages Marked Corrupt   : 0
archivo_15.log:Total Pages Marked Corrupt   : 0
archivo_16.log:Total Pages Marked Corrupt   : 0
archivo_17.log:Total Pages Marked Corrupt   : 0
archivo_1.log:Total Pages Marked Corrupt   : 0
archivo_2.log:Total Pages Marked Corrupt   : 0
archivo_3.log:Total Pages Marked Corrupt   : 0
archivo_4.log:Total Pages Marked Corrupt   : 0
archivo_5.log:Total Pages Marked Corrupt   : 0
archivo_6.log:Total Pages Marked Corrupt   : 0
archivo_7.log:Total Pages Marked Corrupt   : 0
archivo_8.log:Total Pages Marked Corrupt   : 0
archivo_9.log:Total Pages Marked Corrupt   : 0
[oracle@soa1 ~]$ grep Influx archivo*.log
archivo_10.log:Total Pages Influx           : 0
archivo_11.log:Total Pages Influx           : 0
archivo_12.log:Total Pages Influx           : 0
archivo_13.log:Total Pages Influx           : 0
archivo_14.log:Total Pages Influx           : 0
archivo_15.log:Total Pages Influx           : 0
archivo_16.log:Total Pages Influx           : 0
archivo_17.log:Total Pages Influx           : 0
archivo_1.log:Total Pages Influx           : 0
archivo_2.log:Total Pages Influx           : 0
archivo_3.log:Total Pages Influx           : 0
archivo_4.log:Total Pages Influx           : 0
archivo_5.log:Total Pages Influx           : 0
archivo_6.log:Total Pages Influx           : 0
archivo_7.log:Total Pages Influx           : 0
archivo_8.log:Total Pages Influx           : 0
archivo_9.log:Total Pages Influx           : 0


No hay comentarios:

Publicar un comentario

Oracle ACE Director Award - Deiby Gómez

Thanks #OracleACE Program for this awesome certificate recognizing the work I have done in the community for the last year. Looking forwa...