Corrupcion de bloques no detectados por validate

Hoy vamos a ver una entada que nos puede traer un poco de cabeza.

Supongamos tenemos la tipica consulta que nos devuelve un error de corrupcion de bloque ORA-01578: ORACLE data block corrupted

SQL> select something from sometable  where file_name='whatever';
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 377, block # 2818432)
ORA-01110: data file 377:
'+DATA/TESTDB/DATAFILE/TESTDB.20221119.110001.377.dbf' 

Ante este error, nuestros pasos suelen ser claros.

  • Buscamos los bloques corruptos con rman validate o en su defecto dbverify dbv
  • Comprobamos la vista V$DATABASE_BLOCK_CORRUPTION;
  • Recuperamos de backup datafile & block recover datafile 377block 2818432;

Pero , que ocurre si tras ejecutar el validate o el dbv ?

Si miramos el alert.log durane la validacion, veremos lineas con el contenido

TESTDB(3):Completely zero block found during validation

Esto nos indica que es un error en un bloque que contiene solo ceros.
Oracle por diseño no escribe bloques con todo ceros, por lo que este error es heredado del sistema operativo o el sistema de almacenamiento.

Para solucionar este problema deberemos de recuperar ese datafile desde un backup con cualquiera de los metodos soportados

Mas informacion como siempre en Oracle Support

  • Physical Corrupted Blocks consisting of all Zeroes indicate a problem with OS, HW or Storage (Doc ID 1545366.1)

Bucle sleep en codigo PL-SQL

Vamos a ver una entrada rapidisima y sencillisima para dummies.

Como introducimos una espera en codigo PL-SQL

La respuesta es sencillisima, con la funcion DBMS_LOCK.SLEEP
Veamos por ejemplo como forzar dos esperas de 1 minuto para obtener un hang analyzer

$ORACLE_HOME/bin/sqlplus -s "/as sysdba" << EOF
oradebug setmypid;
oradebug unlimit;
oradebug hanganalyze 3;
exec dbms_lock.sleep(60);
-- Wait upto 1 minute before getting the second hanganalyze
oradebug hanganalyze 3;
-- Wait upto 1 minute before getting the second hanganalyze
exec dbms_lock.sleep(60);
oradebug hanganalyze 3;
oradebug tracefile_name;
EOF

Formatear el prompt del SQLplus

Hoy vamos a ver una entrada muuy sencilla de como formatear el prompt de SQLPLUS
Bajo nuestro oracle home tenemos un fichero llamado glogin.sql donde podemos definir las variables del sqlplus, entre ellas el prompt.
Supongaamos que queremos saber cual es el usuario con el que nos conectamos, seria tan sencillo como aniadir la linea

dbserver01:vi /u01/app/oracle/product/19c/dbhome_1/sqlplus/admin/glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--
-- DESCRIPTION
--   SQL*Plus global login "site profile" file
--
--   Add any SQL*Plus commands here that are to be executed when a
--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
--   This script is automatically run
--
def _editor=vi
set timing on
set feedback on
set sqlprompt "_user  _connect_identifier > "

Ms informacion, en:

  • https://www.youtube.com/watch?v=Ax4s39KfcZ8
  • https://www.oreilly.com/library/view/oracle-sqlplus-the/0596007469/re95.html

Correlar discos de ASM con sistema

Hoy vamos a ver un pequenio y sendillo script para correlar los discos del sistema operativo y el ASM

#!/bin/bash
for i in `ls /dev/oracleasm/disks/ `; do
ASMDEVICE=/dev/oracleasm/disks/$i
#echo "Looking for $ASMDEVICE"
MINOR=`ls -l ${ASMDEVICE} |awk '{ print $5}'`
MAYOR=`ls -l ${ASMDEVICE} |awk '{ print $6}'`
DISKDEV=`ls -l /dev |grep -w $MAYOR | grep -w $MINOR|awk '{ print $10}'`
echo " The ASM device $ASMDEVICE is $DISKDEV"
#echo "The device $ASMDEVICE has a mayor=$MAYOR and minor=$MINOR"
#ls -l /dev/$DISKDEV
#ls -l ${ASMDEVICE}
#echo "====================================="
done

Uso de variables de entorno en script sde rman

Hoy vamos a ver una entrada muy rapida para dummies.

Muchas veces queremos hacer que el log de rman tenga una variable de entorno ( usualmente a fecha),haciendo algo similar a

#!/bin/bash
HORA=`date +%Y%m%d_%H:%M:%S`
rman  cmdfile restore_${ORACLE_SID}.cmd  log logs/${HORA}_restore_${ORACLE_SID}.log

Pero cuando vamos al subdirecorio de logs nos encontramos con que nos ha creado un fichero llamado ${HORA}_restore_${ORACLE_SID}.log

Como solucionamos esto?

La solucion no pasa por jugar con las comillas sino con el uso del parametro MSGLOG
Simplemente tendremos que cambiar nuestro script por

#!/bin/bash
HORA=`date +%Y%m%d_%H:%M:%S`
rman  cmdfile restore_${ORACLE_SID}.cmd  MSGLOG logs/${HORA}_restore_${ORACLE_SID}.log

Y funcionara tal y como queremos