martes, 8 de julio de 2008

Cómo obtener la fecha de ayer en Unix

Esta es una tarea sencilla en Linux. Para obtener el día anterior simplemente usamos la función date:
date --date='1 day ago'
Esta funcionalidad tiene varias formas que flexibilizan la tarea de obtener una fecha relativa del pasado o futuro. Sólo basta dar una mirada a la documentación del man.

El problema ocurre si usamos Sun Solaris: este sistema operativo no tiene una modalidad similar para date. Es frustrante para un programador casual como yo, que algo tan sencillo no esté implementado en el sistema operativo.
He visto algunos foros en la web donde se pueden encontrar diversos Shell scripts para calcular el día anterior dependiendo de si el mes tiene 30 o 31 dias, si es febrero, si es año bisiesto... y la verdad que la idea de tanta complejidad para algo tan simple no me satisface.

Una solución directa y fácil de obtener el dia anterior en Solaris es la siguiente: agendar en el programa crontab (o scheduler unix de preferencia) a las 23:59, un simple script que escriba la hora actual en un archivo:
#/bin/ksh
date > ayer.txt

Listo!
Ahora nuestros scripts pueden acceder en forma simple a la fecha de ayer.

Vea también:
Limpieza de archivos en Unix
Comandos útiles para Unix Shell
Cómo verificar archivos y directorios en Shell

miércoles, 2 de julio de 2008

Obtener la versión de la base desde PL/SQL

Si queremos obtener cual es la versión de la base de datos para hacer una u otra cosa, podemos utilizar el paquete dbms_utility y el procedimiento db_version. El mismo nos retorna un string del tipo 9.2.0.4, el cual podemos consultar para programar a conveniencia.
  dbms_utility.db_version(v_version, v_compatible);
Una observación: cuidado con utilizar comandos que no existan en otras versiones, para eso está la compilación condicional introducida en Oracle 9i R2. Esta es una simple función que nos retorna la versión de la base actual que nos puede servir por ejemplo para reconstruir nombres de archivos que dependan de la versión utilizada.

El siguiente bloque PL/SQL es un ejemplo de como puede utilizarse db_version para condicionar la programación.

DECLARE
v_version varchar2 (32);
v_compatible varchar2 (32);
BEGIN
dbms_utility.db_version(v_version, v_compatible);

if substr(v_version,1,2) = '10' then
...
elsif substr(v_version,1,1) = '9' then
...
elsif substr(v_version,1,3) = '8.1' then
...
elsif substr(v_version,1,3) = '8.0' then
...
elsif substr(v_version,1,1) = '7' then
...
end if;

...

END;
Ver también:
Compilación condicional en 9i

jueves, 12 de junio de 2008

SP2-1503 Unable to initialize Oracle call interface

SP2-1503: No es posible inicializar la interfase de llamada Oracle
SP2-0152: ORACLE tal vez no esté funcionando adecuadamente

Acabamos de instalar nuestro cliente Oracle en Windows Vista, configuramos el tnsnames.ora y al querer conectarnos a la base de datos obtenemos el error.

Una posible explicación, es que acabamos de instalar un cliente Oracle para Windows XP, y este no es compatible con Vista. Es necesario descargar e instalar el software de Oracle específico para ese sistema operativo.

Si se ejecuta PL/SQL Developer en estas condiciones, luego de pedir los datos para el login retorna un error nada explicativo: un pequeño popup con mensaje vacío y un botón OK.

Un consejo: al obtener errores de conexión con herramientas externas, testear la conexión a través de SQL*Plus, para poder ver errores directos del sistema operativo o de la base de datos. Si SQL*Plus se conecta exitosamente, entonces el problema estará en la herramienta.

miércoles, 4 de junio de 2008

Cómo saber la última fecha en que un tablespace fue alterado

El único lugar donde encontramos esta información es el alert log file. Este archivo registra todas las alertas críticas de la base de datos, incluídas las alteraciónes de tablespaces. Es solo mirar este archivo, hacer una búsqueda por el nombre del tablespace y obtendremos todos los datos de la modificación.

El alert log se localiza en la ruta: ${ORACLE_HOME}/admin/${ORACLE_SID}/bdump
y su nombre generalmente es: alert_${ORACLE_SID}.log

La restricción, es que únicamente el administrador de la base de datos tendrá acceso a este archivo.

viernes, 30 de mayo de 2008

Comandos útiles para Unix Shell

Agrego algunos comandos útiles en Unix que siempre vienen bien tenerlos a mano. Hacen parte de las tareas diarias, en la creación de nuevos scripts de respaldo o en el tratamiento de logs que generan nuestros processos.

En este caso uso Solaris y ksh, pero dependiendo de la versión de Unix/Linux que estén utilizando, pueden variar algunos parámetros. De todas formas, la idea sirve para adaptarlos en cada ambiente.


Eliminar archivos gz con mas de 3 días de antiguedad
find . -mtime +3 -name "*.gz" -exec rm {} \;

Ejecutar un shell en background e independiente de la conexión
nohup ./shell.sh &
(este script retorna un número de job, puede ser útil anotarlo)

Para traer el proceso nuevamente al foreground
fg %(num_job)
(el número de job fue el que se retornó al colocar el proceso en background)

Colocar los nombres de archivo de un listado en un array
ARQS=$(cd ${DIR_RECARGA} ; ls *.dat)

Correr un script de sqlplus en Shell
#!/bin/ksh

sqlplus -s /nolog << !EOF
@$ORACLE_HOME/scripts/mi_script.sql

exit;
!EOF

Compactar todos los archivos de un directorio
#!/usr/sbin/ksh
for arch in `ls -t /*.arch tail +5`
do
gzip $arch
done

Ver y buscar en el contenido de un archivo comprimido con gzip
gzcat - CAT para archivos gz
gzgrep - GREP para archivos gz


Ver también:
Cómo verificar archivos y directorios en Shell
Limpieza de archivos en Unix
Cómo obtener la fecha de ayer en Unix