jueves, 31 de julio de 2008

ORACLE: Dos pequeños scripts para verificar y corregir la integridad de los datafiles

El primer script (chkdbf.sh) verifica la integridad de los datafiles ubicados en un directorio determinado, si todo está en orden, el resultado debería visualizar todos los valores en cero.

Caso contrario entraría en acción el segundo script (rcvdbf.sh), que intentará reparar los daños en el datafile y bloque correspondiente.

#!/bin/bash -x
# chkdbf.sh

function chkdbf {
for f in `find /u01/oradata/orcl10g/ -name "*.dbf"`; do
echo `basename $f`|tr [:lower:] [:upper:];
$ORACLE_HOME/bin/dbv file=$f blocksize=8192;
done
}

chkdbf > chkdbf.out 2>&1
grep Failing chkdbf.out

#!/bin/bash -x
# rcvdbf.sh

function Error {
echo "rcvdbf.sh <file number> <block number>"
}

function ChkDigit {
case $1 in
[0-9]*$) return 0;;
*) return 1;;
esac
}

if [ ${#} -lt 2 ]; then
Error
exit 1
fi

if ChkDigit ${1}; then
Error
exit 2
fi

if ChkDigit ${2}; then
Error
exit 3
fi

$ORACLE_HOME/bin/rman target / <<!
blockrecover datafile ${1} block ${2}
exit
!

ORACLE: Script para iniciar y detener la instancia de base de datos

Este script se sitúa en el directorio /etc/init.d con el nombre "oracle".

Dentro del directorio /etc/rc.d vamos a encontrar otros directorios con el nombre rcnivel.d, donde nivel corresponde a uno de los detallados a continuación:

0: Apagado del sistema operativo.
1: Inicio en modo monousuario.
2: Multiusuario sin soporte de red.
3: Multiusuario con soporte de red.
4: No utilizado.
5: Inicio gráfico.
6: Reinicio del sistema operativo.

Cada uno de estos directorios, contiene un conjunto de scripts para detener e iniciar diferentes servicios requeridos, según el nivel de inicio que se solicite. Este conjunto de scripts se dividen en dos grupos, y son ejecutados secuencialmente en orden alfabético. Primero se ejecutan los K##* (Kill scripts) deteniendo los servicios que no corresponden al nivel de inicio seleccionado, y posteriormente se ejecutan los S##* (Start scripts), que inician los servicios requeridos por el nivel solicitado. Aclaro que ## es un número de secuencia que va desde el 00 al 99, y el * sería el nombre del servicio.

Luego de esta breve introducción a la estructura de scripts de inicialización del sistema, volvemos a nuestro objetivo, iniciar y detener la instancia de base de datos Oracle.

Cuando instalamos el motor de base de datos, se generan dos script en $ORACLE_HOME/bin, denominados dbstart y dbshut, revisar que en su interior localicen correctamente el archivo oratab, si no es así, corregir dicha situación.

En todos los niveles de inicio, generar un enlace simbólico al script /etc/init.d/oracle, con el nombre K00oracle. Con esto nos aseguramos que cada vez que se cambie a un nivel de inicio diferente, se baje la instancia de base de datos si se encuentra activa.

En mi caso, solo quiero que se levante la base de datos en el nivel 3
de inicio, y para ello genero un enlace simbólico a /etc/init.d/oracle con el nombre S98oracle.

Un pequeño secreto: cuando se ejecuta el script S98oracle, se genera el archivo /var/lock/subsys/oracle, de no existir este archivo, cuando se ejecute el script K00oracle no hará nada, porque pensará que nunca se inició la instancia de base de datos.

Para más detalles de cómo se ejecutan los diferentes script de inicio, se puede ver el script /etc/rc.d/rc

A continuación, les dejo el fuente del script oracle, que también se encarga de iniciar el listener para conexiones remotas por TNS.

#!/bin/bash -x
################################################################################
#
# ORACLE: Start database and listener.
#
################################################################################

function dbstart {

if su - oracle -c "/u00/oracle/product/10.1.0.3/bin/dbstart"; then
if ps -fu oracle|grep -v grep|grep -q ora_smon; then
if su - oracle -c "/u00/oracle/product/10.1.0.3/bin/lsnrctl start"; then
return 0
else
return 2
fi
fi
else
return 1
fi

return 0
}

################################################################################
#
# ORACLE: Shutdown listener and database.
#
################################################################################

function dbshut {

if ps -fu oracle|grep -v grep|grep -q tnslsnr; then
su - oracle -c "/u00/oracle/product/10.1.0.3/bin/lsnrctl stop"
fi

if su - oracle -c "/u00/oracle/product/10.1.0.3/bin/dbshut"; then
return 0
else
return 1
fi

return 0
}

################################################################################
#
# ORACLE: Startup / Shutdown listener and database.
#
################################################################################

case ${1} in
start) if dbstart; then
touch /var/lock/subsys/oracle
fi;;
stop) if dbshut; then
rm -f /var/lock/subsys/oracle 2>/dev/null
fi;;
reload|restart) if dbshut && dbstart; then
rm -f /var/lock/subsys/oracle 2>/dev/null
touch /var/lock/subsys/oracle
fi;;
*) exit 1
esac
exit 0

LINUX: Con un poco de sudo, el usuario oracle ejecuta los scripts de inicio

La idea es que el usuario oracle (propietario del software de base de datos), pueda iniciar y detener la instancia de base de datos, con los propios scripts de inicio (rc.d / init.d) del sistema operativo, aprovechando esta configuración de permisos, el mismo usuario podrá reiniciar (shutdown) el sistema operativo, y todas estas tareas sin requerirle la contraseña.

Modificar con el usuario root el archivo /etc/sudoers, este archivo se puede editar con el comando visudo. Deberá contener las siguientes líneas:

Defaults:oracle !authenticate
oracle rh90o10g=(root)/etc/init.d/oracle *,(root)/sbin/shutdown *

La línea roja le indica a sudo que no le solicite la contraseña al usuario oracle.
La línea azul le indica a sudo que el usuario oracle puede ejecutar los comandos oracle y shutdown, ambos con cualquier lista de argumentos, adquiriendo el perfil de root, sobre el equipo rh90o10g.

Configuración del hardware donde compruebo mis experiencias

Procesador: Intel Pentium Dual Core E2140
Memoria: 2 Gb
Disco: 160 Gb
Sistema Operativo (anfitrión): Windows XP Pro SP2
X-Server para Windows: cygwin
Manejador de máquinas virtuales: Sun Virtual Box 1.6.0
Sistema Operativo (huesped): Red Hat Linux 9 (Shrike)
Kernel: 2.4.20-8
Base de datos: Oracle 10g para Linux x86 release 10.1.0.3
Memoria asignada a la MV: 768 Mb

ORACLE: Cálculo rápido de memoria.

Cuando estamos generando una nueva instancia de base de datos con el asistente de Oracle (dbca), podemos corregir los valores de los parámetros de memoria, más adecuados a nuestro hardware disponible, evitando utilizar los valores por defecto.

oracle = RAM * 0.55
PGA = (RAM * 0.8 - oracle) * 0.2
SGA = (RAM * 0.8 - oracle) * 0.8

Buffer Cache = Aprox. 80% de la SGA
Shared Pool = Aprox. 12% de la SGA
Fixed Size = Aprox.1% de la SGA
Redo Log Buffer = Aprox. 0.1% de la SGA

Para más detalles, estos datos los obtuve del siguiente blog: http://oracle-now.blogspot.com

miércoles, 30 de julio de 2008

VIRTUALBOX: Brindar servicios desde una máquina virtual con Linux

Antes de iniciar nuestra máquina virtual con Linux, debemos agregar una interfaz de red desde el administrador de máquinas virtuales.

Esta interfaz de red, deberá ser configurada como Interfaz Anfitrión, en consecuencia deberemos generar una nueva interfaz de red, en la parte inferior de esta misma pantalla, que luego seleccionaremos en el combo del dato Nombre de la Interfaz.

Concluido este paso, si nos fijamos en la ventana de conexiones de red de windows, nos encontraremos con que existe un nuevo dispositivo de red. A continuación le asignamos una dirección de red estática.

Ahora nos encontramos en condiciones de iniciar nuestra máquina virtual, con las nuevas versiones de linux es probable que autodetecte el nuevo dispositivo de red, con lo que nos preguntará los datos para configurar, caso contrario lo agregamos manualmente con el asistente en X-Window, donde también le asignamos una dirección de red estática.

Si contamos con servicio de telnet activado en Linux, desde Windows podríamos acceder sin problemas.

Ejecutar aplicaciones X en Linux desde Windows con X server de Cygwin

Iniciar el X-Window del Cygwin, ejecutando el siguiente batch:

C:\cygwin\usr\X11R6\bin\startxwin.bat

Este batch arranca el X server y abre una terminal visual (xterm), desde donde se ejecuta el siguiente comando para habilitar la ejecución de aplicaciones visuales remotas:

xhost +mylinux

Abrir una terminal remota, por ejemplo telnet, hacia el linux y configurar la variable de ambiente DISPLAY para indicar que las aplicaciones X se visualicen en el X server del cygwin.

DISPLAY=mywin:0.0; export DISPLAY

Y ya nos encontraríamos en condiciones de lanzar una aplicación X en el Linux y visualizarla en el Windows, por ejemplo ejecutando la aplicación "xeyes &" sin las comillas dobles.

Automatizar el inicio de una máquina virtual con Virtual Box

Habiendo instalado Virtual Box en mi Windows XP, se me ocurrió automatizar el inicio de la máquina virtual con Linux, en el propio inicio de Windows.

Esto lo hice generando un acceso directo a VBoxManage.exe, donde le agregué a la línea de comando startvm + el nombre de mi máquina virtual.

Por ejemplo:
"C:\Program Files\Sun\xVM VirtualBox\VBoxManage.exe" startvm MyLinux

Este acceso directo lo almacené en la carpeta startup del menú start de mi sesión Windows.