viernes, 24 de abril de 2009

Idiología de este blog

Este blog se normaliza bajo los principios que definen el software libre, a saber:

El software libre es una cuestión de la libertad de los usuarios de ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software. Más precisamente, se refiere a cuatro tipos de libertades para los usuarios del software:

  • La libertad de ejecutar el programa, para cualquier propósito (libertad 0).
  • La libertad de estudiar cómo trabaja el programa, y adaptarlo a sus necesidades (libertad 1). El acceso al código fuente es una condición necesaria.
  • La libertad de redistribuir copias para que pueda ayudar al prójimo (libertad 2).
  • La libertad de mejorar el programa y publicar sus mejoras, y versiones modificadas en general, para que se beneficie toda la comunidad (libertad 3).
Gracias por contribuir a crear un mundo mejor, permiso de distribucción de información no requerido.
http://www.gnu.org/copyleft/copyleft.es.html

jueves, 23 de abril de 2009

Otorgando privilegios para realizar "SELECT" sobre vistas del diccionario de la base de datos

En ocasiones es necesario dar a un usuario silvestre la posibilidad de realizar una consulta sobre una determinada vista o tabla del diccionario de la base de datos.

Si al crear el usuario en la base de datos le damos únicamente el privilegio de "CREATE SESSION", este no puede realizar consultas sobre las vistas o tablas del diccionario de la base datos.

Ejemplo:

Connectado con un usuario normal:

SQL*Plus: Release 10.2.0.1.0 - Production on Jue Abr 23 08:54:29 2009


Copyright (c) 1982, 2005, Oracle. All rights reserved.


Conectado a:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

With the Real Application Clusters option

SQL> select * from dba_role_privs;
select * from dba_role_privs
*

ERROR en línea 1:
ORA-00942: table or view does not exist

Lo que requerimos es otorgarle el privilegio de "SELECT ANY DICTIONARY", con una cuenta con role de DBA y luego sin necesidad de volverse a logear en la base de datos, volvemos a ejecutar la consulta.

-------------- Nueva ventana con usuario con role DBA --------

SQL*Plus: Release 10.2.0.1.0 - Production on Jue Abr 23 08:56:18 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Conectado a:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
With the Real Application Clusters option

SQL> grant select any dictionary to usuario;

Concesión terminada correctamente.

SQL>


-------------- De vuelta en la otra session -----------------



Con gusto a solicitud de mi amigo Johnny Chacón.

lunes, 20 de abril de 2009

Creando export de Oracle comprimido en Linux

Existe una gran cantidad de notas para ser utilizadas como referencia, para hacer un export de modo comprimido, utilizando el comando "compress" para plataformas UNIX.
En Linux podemos utilizar el comando "gzip" y los archivos "de nodos" a nivel de sistema operativo, para poder realizar esta labor.

Primero que todo en un directorio temporal, vamos a crear los archivos "PIPE", que nos ayudaran a esto.

$>cd /oracle/tmp
$>mknod pipe p
$>mknod pipe p2
$>mknod pipe p3
$>mknod pipe p4
$>mknod pipe p5
$>mknod pipe p6

Luego vamos a crear el siguente archivo de comandos SHELL.

$> more resp_pipe_orcl.sh

ORACLE_HOME=/opt/product/app/10g
ORACLE_SID=ORACLE_
TERM=xterm
PATH=${PATH}:$ORACLE_HOME/bin:/usr/bin
umask 022
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
export NLS_LANG
gzip < /oracle/tmp/pipe > /oracle/respaldo/expdiario_orcl_01_parte.dmp.gz &
gzip < /oracle/tmp/pipe2 > /oracle/respaldo/expdiario_orcl_02_parte.dmp.gz &
gzip < /oracle/tmp/pipe3 > /oracle/respaldo/expdiario_orcl_03_parte.dmp.gz &
gzip < /oracle/tmp/pipe4> /oracle/respaldo/expdiario_orcl_04_parte.dmp.gz &
gzip < /oracle/tmp/pipe5> /oracle/respaldo/expdiario_orcl_05_parte.dmp.gz &
gzip < /oracle/tmp/pipe6> /oracle/respaldo/expdiario_orcl_06_parte.dmp.gz &
exp respaldo/respaldo full=yes file=/oracle/tmp/pipe,/oracle/tmp/pipe2,/oracle/tmp/pipe3, /oracle/tmp/pipe4, /oracle/tmp/pipe5, /oracle/tmp/pipe6 filesize=2048M statistics=none log=/oracle/respaldo/exp_full_diario_orcl_full.log
$>

Lo que hacemos aquí, es crear varios archivos de un export grande, fragmentándolo en pedezos de 2GB como máximo. Cada dispositivo "pipe", lo referenciamos como un archivo independiente.
Antes de iniciar el export, concatenamos el comando gzip con un respectivo nombre final de archivo y lo dejamos corriendo en background, para dejarlos de una vez comprimidos los archivos desde el mismo momento cuando se realiza el export.

Puntos positivos:
  • Ahorramos espacio de almacenamiento
  • Fácil administración de archivos
  • Tamaño total de exports se reduce entre un 60% a un 70%

Desventajas:

  • Mayor tiempo de duración del export
  • Mayor consumo de memoria y cpu durante la ejecución

Recomendaciones

  • Ejecutar durante períodos de bajo nivel de operación del servidor
  • Se puede poner las opciones del export en un "parfile", para mejor administración.

viernes, 3 de abril de 2009

Lectura Interesante: Cuál es el valor de un DBA ?

http://www.dba-oracle.com/t_value_professional_dba.htm

Haciendo Ping a un grupo de Ip's en la red

Deseas hacer ping a un grupo de Ip's y no hacerlo de uno en uno?

Puedes hacerlo de la siguiente forma
for i in {30..35}; do ping -c1 172.20.100.$i; done
[root@admin ~]# for i in {30..35}; do ping -c1 172.20.100.$i;done
PING 172.20.100.30 (172.20.100.30) 56(84) bytes of data.
64 bytes from 172.20.100.30: icmp_seq=0 ttl=62 time=1.91 ms

--- 172.20.100.30 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.913/1.913/1.913/0.000 ms, pipe 2
PING 172.20.100.31 (172.20.100.31) 56(84) bytes of data.
64 bytes from 172.20.100.31: icmp_seq=0 ttl=62 time=1.59 ms

--- 172.20.100.31 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.596/1.596/1.596/0.000 ms, pipe 2
PING 172.20.100.32 (172.20.100.32) 56(84) bytes of data.
64 bytes from 172.20.100.32: icmp_seq=0 ttl=62 time=2.46 ms

--- 172.20.100.32 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.467/2.467/2.467/0.000 ms, pipe 2
PING 172.20.100.33 (172.20.100.33) 56(84) bytes of data.
64 bytes from 172.20.100.33: icmp_seq=0 ttl=62 time=2.10 ms

--- 172.20.100.33 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.100/2.100/2.100/0.000 ms, pipe 2
PING 172.20.100.34 (172.20.100.34) 56(84) bytes of data.
64 bytes from 172.20.100.34: icmp_seq=0 ttl=62 time=1.41 ms

--- 172.20.100.34 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.415/1.415/1.415/0.000 ms, pipe 2
PING 172.20.100.35 (172.20.100.35) 56(84) bytes of data.
From 10.8.0.2 icmp_seq=0 Destination Host Unreachable

sábado, 28 de marzo de 2009

Desktop de Linux ó Solaris en mi PC Windows

Siempre andamos buscando la mejor forma de administrar nuestros sistemas Linux ó Unix.
La comodidad que brinda el sistema gráfico de un sistema operativo, lo hace estar más al alcance de todos los usuarios, que no son de la vieja escuela de línea de comandos, además, existen varios programas que requieren el ambiente gráfico para poderse instalar, tal es el caso de las herramientas de Oracle, RDBMS, Clusterware, Application Server, etc.

En muchos servidores X en el mercado, pero la mayoría aportan más de lo que necesitamos al comienzo y su precio puede ser excesivo.

Nx ha sido el mejor server X que he visto en los últimos 2 años.
Dentro de sus características podemos encontrar:
  1. Fácil instalación
  2. Conexión por medio de SSH ( Secure Shell )
  3. Puede utilizarse además para conectarse a máquinas con Windows con SSH Server instalado
  4. Lo he probado con Red Hat 3/4/5, Centos 4/5, Oracle Enterprise Linux, Suse y ahora tiene una versión para Solaris.!!!
  5. Es completamente gratis.
Para su implementación en Linux, requieres instalar los siguiente paquetes en orden, con el usuario root:
  1. NxClient
  2. NxServer
  3. NxNode
En tu máquina windows, sólo requieres instalar el client para Windows.
Puedes obtener los "rpm" del sitio: http://www.nomachine.com

lunes, 23 de marzo de 2009

Comó reasignar el password a root en LINUX en caso de olvido

Cuando el arranque es: GRUB

Siga los siguiente pasos para proceder a reasignar el password del usuario root en un servidor LINUX, utilizando el GRUB a la hora de arranque:

1. Eliga la versión de kernel que corresponde a su instalación
2. Presione la tecla " e " para editar la entrada de arranque del sistema.
3. Seleccione la linea que inicia con la palabra kernel, generalmente la segunda línea
4. Presione la tecla e para editar la entrada
5. Agregue la letra " S " o la palabra " Single " al final de la línea
6. Presione la tacla ENTER
7. Ahora presione la tecla b para arrancar el kernel de Linux e ingresar en modo monousuario
8. Realice las siguiente acciones:

  • Monte la siguientes particiones:
  • # mount -t proc proc /proc
  • # mount -o remount,rw /
  • Cambie el password el usuario root:
  • # passwd
  • Reinicie el sistema:
  • # sync
  • # reboot

Cuando el arranque es: LILO

Cuando el arranque de LILO aparezca agregue la palabra "single" y presione la tecla [ENTER]:
Boot: linux single

Cuando aparezca el prompt de sistema operativo " # ", digite el comando " password " y proceda a restablecer el password del usuario root:
  • # passwd
Finalmente reinicie el servidor o la máquina y listo:
  • # sync
  • # reboot

viernes, 20 de marzo de 2009

Creando usuario común en 10g para generar un export

Para que no tengas problemas a la hora de generar un export convencional o un expdump en la base de datos 10g sigue las siguientes instrucciones.

  • create user respaldo identified by respaldo;
  • grant create session to respaldo;
  • grant exp_full_database to respaldo;
  • grant imp_full_database to respaldo;
  • grant execute on sys.dbms_defer_import_internal to respaldo;
  • grant execute on sys.dbms_export_extension to respaldo;
Ahora sí ya puedes generar el export sin "warnings" !!.

jueves, 5 de marzo de 2009

Problemas al instalar el Jdev 9.0.4 ( 10gR1 ) y 10.1.3.4 Jdev 10g en Linux 128 MB RAM requerido

A la hora de instalar el Oracle Collaboration Suite o el JDeveloper en una máquina Linux, puede ser que tengan problemas en el inicio de verificación de dependencias en el OUI ( Oracle Universal Installer ), indicándoles que deben tener al menos 128M de RAM para realizar la instalación. Si revisan con el utilitario "vmstat" o con el popular "top", puede que si tengan más de la cantidad de memoria disponible, pero aún asi no les deja hacer la instalación.

Aquí les va el tip:
"Todo se debe a un bug documentado en el DOC id. 294586.1 del 16 de Feb 2007. Si hacen la instalación con "runInstaller -ignorePreReq" no funciona.

Deben bajar el patch 3656396 y deben copiar el archivo MemorySizeQuery.jar al directorio en donde se desempacó el archivo ".zip", /Disk1/stage/Queries/MemorySizeQuery/
, donde este el archivo con el mismo nombre.
Vuelven a correr el "runInstaller" y asunto resuelto.


Crear un script dinámico que recorra todos los dblink definidos en la base de datos

En ocasiones se hace necesario ejecutar un script en varias instancias de base de datos.
Este ejemplo, te permite hacerlo.
Debes tener privilegios de "select" sobre la tabla del diccionario "ALL_DB_LINKS" en el esquema que deseas utilizar. Las líneas "PUT_LINE", es un parche, para evitar error de "overflow", ya que le máximo disponible para despliegue son 255 caracteres por línea.


declare
cursor liga is
select '@'||db_link from all_db_links;
enlace varchar2(30);
cmd varchar2(1000);

begin

open liga;
loop
fetch liga into enlace;
exit when liga%NOTFOUND;
DBMS_OUTPUT.ENABLE (100000);
cmd := 'update pvcreditos
set saldo=0, tstamp=sysdate
where no_transa_credito in ( select no_transa_credito
from pvforma_pago'||enlace|| ' where no_transa_credito in ( select a.no_transa_credito from pvhcreditos a, pvcreditos b where a.no_fisico=b.no_fisico and a.no_transa_credito=b.no_transa_credito and a.saldo <> b.saldo and a.fecha <='||'''31-DEC-04'''||' and a.descripcion=b.descripcion and a.cajero=b.cajero))';

DBMS_OUTPUT.PUT_LINE(substr(cmd,1,255));
DBMS_OUTPUT.PUT_LINE(substr(cmd,256,400));
execute immediate cmd;
end loop;
close liga;
end;
/

lunes, 2 de marzo de 2009

Diferencia en el uso de la función count(*) y count(nombre_columna)



En muchas ocasiones, no tenemos claro, como trabaja algunas de las más comunes funciones de Oracle SQL*Plus.

Uno de esos casos específicos, es cuando utilizamos la función “count”. Esta función trabaja de manera distinta cuando se aplica usando el comodín “*” o el nombre de la columna a ser sumada.

Veamos el siguiente ejemplo práctico.

Tenemos la tabla t1 con los siguiente registros. Observe que en la cuarta tupla, “Raul Ballestero” no tiene profesión asignada en la columna respectiva.

SQL> select * from t1;



Ejemplos de aplicación:

SQL> select count(*) from t1;

COUNT(*)
----------
4

SQL> select count(profesion) from t1;

COUNT(PROFESION)
----------------
3

SQL> select count(rowid) from t1;

COUNT(ROWID)
------------
4

Hasta aquí no hemos visto nada nuevo. Pero que sucede si incluimos un registro con valores nulos?.

SQL> insert into t1 values('&nombre','&profesion');
Enter value for nombre:
Enter value for profesion:
old 1: insert into t1 values('&nombre','&profesion')
new 1: insert into t1 values('','')

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t1;



SQL> select count(*) from t1;

COUNT(*)
----------
5

SQL> select count(rowid) from t1;

COUNT(ROWID)
------------
5

SQL> select count(nombre) from t1;

COUNT(NOMBRE)
-------------
4

Como pueden observar hacer el conteo utilizando el asterisco o la seudo-columna “rowid” en conjunto con la función “count”, toma en consideración el registro nulo incluido. Si lo hacemos haciendo referencia con el nombre de la columna, no lo toma en cuenta.

viernes, 27 de febrero de 2009

Habilitando el I/O Asincrónico para Oracle 9iR2 en Red Hat 3/4

Habilitando el soporte asincrónico de I/O

El I/O asincrónico permite que Oracle pueda continuar procesando después de haber iniciado un llamado de I/O, aumentando así el rendimiento.

Red Hat, permite que Oracle solicite simultáneamente varias solicitudes de I/O en una sólo llamada del sistema. Esto reduce la carga de cambios de contexto y permite que el kernel sea optimizado en la actividad de disco.

Para habilitar el I/O en una base de datos Oracle, es necesario realizar un relink del motor de base de datos en Oracle9iR2.

Importante aclarar que la versión Oracle10gR2, ya trae el soporte de I/O habilitado, por tanto no es necesario realizar cambio alguno.


Recreación del kernel de Oracle9i R2 para habilitar el soporte I/O asincrónico.

Para realizar este proceso es necesario que la versión 9iR2, tenga aplicado cuando mínimo el patchset 9.2.0.4 ó superior.

Metalink Nota:279069.1.

Ejecute las siguientes instrucciones

Bajar la base de datos
SQL> shutdown
su - oracle
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk async_on
$ make -f ins_rdbms.mk ioracle

En el último punto, se va a crear un nuevo ejecutable para Oracle y el anterior va a ser renombrado a “$ORACLE_HOME/bin/oracleO”.

Si requiere revertir el proceso debe hacer lo siguiente:

Bajar la base de datos. 

SQL> shutdown
su - oracle
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk async_off

$ make -f ins_rdbms.mk ioracle

Habilitando el I/O asincrónico en Oracle 9iR2

Para habilitar el I/O asincrónico en Oracle, el parámetro disk_asynch_io necesita estar configurado al valor TRUE.

disk_asynch_io=true

En sqlplus:

alter system set disk_asynch_io=true scope=spfile;

El valor de facto en Oracle9i es TRUE.

Para permitir el I/O asincrónico en los sistemas de archivos se debe cambiar el valor de facto para el parámetro FILESYSTEMIO_OPTIONS.

El valor de facto es: NONE.

Las opciones disponibles para Oracle9iR2 son:

  • asynch: Habilita asincrónico I/O en los archivos del filesystem.
  • directio: Habilita I/O en forma directa en los archivos del filesystem.
  • setall: Habilita el I/O asincrónico y directo.
  • none: Des-habilita esta característica.

El valor recomendado para RHEL 3/4, es configurar filesystemio_options a "setall".



Creando una salida de formato html desde SQL*Plus 9i o superior


column MACHINE format a30
column IP_ADDRESS format a15
set linesize 200
SET markup HTML on
spool d:\tmp\test1.html;
select sid, serial#, username, process, machine, sys_context('userenv','ip_address') IP_ADDRESS
from v$session
where machine='MORFEO\T1_RVARGAS';
spool off;
SET markup HTML off



jueves, 26 de febrero de 2009

Desempacando archivos de instalación de software Oracle

Puede ser que hayas bajado software desde el sitio de OTN y no sabes como desempacarlo para instalarlo, sobre todo en plataformas UNIX ó Linux y el formato es de tipo "cpio.gz".

Si es así puedes hacer:

Opción 1.
  1. gunzip archivo.cpio.gz
  2. cpio -idmv < archivo.cpio
Opción 2.
  1. gunzip archivo.cpio.gz
  2. cat archivo.cpio | cpio -ivcd
Esto por lo general te va a crear un jerarquía de directorios bajo el directorio Disk1 a partir de la ubicación en donde estes corriendo el comando.

miércoles, 25 de febrero de 2009

Dónde estan los ejecutables de la instalación de Oracle XE

Si haz instalado la version gratis de Oracle XE 10g en algún servidor de sabor LINUX, los archivos ejecutables se encuentran ubicados en:
  • /usr/lib/oracle/xe/app/oracle/product/10.2.0

Obtener IP de la máquina conectada a la base de datos

SQL> column USER format a12
SQL> column IP_ADDRESS format a15
SQL> column HOST format a20
SQL> SELECT user, sys_context('userenv','ip_address') IP_ADDRESS, sys_context('userenv','host') HOST from dual;



martes, 24 de febrero de 2009

Administración de ARCHIVES para bases de datos Standby Manuales

En muchas ocasiones tenemos configurado una StandBy en modo manual y requerimos enviar los archive log de la base de producción a la base de datos de contingencia.
Esta es una manera práctica de como realizar ese proceso. Para ello necesitas agregar en el archivo /etc/hosts, la dirección IP y alias del servidor a donde quieres transferir los datos.
En este ejemplo utilizo el comando “rcp” de linux, pero pueden utilizar el utilitario de su preferencia, nada más hacen los ajustes en el script respectivo.

Como a la hora de realizar el respaldo, podría estarse llenando el último archive, vamos a generar una lista dinámica de los archives existentes en el directorio definido para la generación de los mismos y vamos a extraer los nombres de los archivos, tomando en cuenta para ello un ordenamiento basado en la hora y fecha de creación.
Así, si aplicamos el concepto del conteo de archivos ordenados por fecha y hora de creación menos uno, vamos a eliminar de la lista de archivos a transferir al último.
En el script “MORFEO” es el alias del servidor a donde vamos a copiar los archivos de origen.

copy_archives.sh
#!/bin/ksh
# Autor: Ronald Vargas Quesada
# Fecha: 2005 – 2009
# ronald.vargas.quesada@gmail.com
ARCH_DIR=MORFEO:/oracle/archive/MORFEO
COUNTER=`rsh MORFEO ls -la /oracle/archive/MORFEOR/*.arc wc -l`
MENOS=1
COUNT=`expr $COUNTER - $MENOS`
echo "Cantidad de archivos existentes en el directorio $ARCH_DIR files:$COUNTER"
echo "Archivos por copiar $COUNT"
if [ "$COUNT" > 1 ]; then
rsh MORFEO ls -lt /oracle/archive/MORFEO/*.arc tail -$COUNT awk '{print $9}' >copies_archive.lst
fi
/home/oracle/scripts/ejecutar_copia.sh

En este archivo se crea en forma dinámica el archivo de “comando.sh” que al final es quién copia los archivos al servidor de destino.

También definidos el comando “empacar.sh”, para dejar comprimidos los archivos hasta que sean reutilizados y así poder contar con mayor espacio en el servidor de destino.

ejecutar_copia.sh
# Autor: Ronald Vargas Quesada
# Fecha: 2005 – 2009
# ronald.vargas.quesada@gmail.com
FILES="/home/oracle/scripts/copies_archive.lst"
for lista in $FILES
do
cat $FILES awk '{ print "rcp MORFEO:" $1 " /oracle/archive/MORFEO" }' > /home/oracle/scripts/comando.sh
done
chmod 700 /home/oracle/scripts/comando.sh
/home/oracle/scripts/comando.sh
rm /home/oracle/scripts/comando.sh
cat $FILES awk '{ print "rsh morfeo gzip " $1}' > /home/oracle/scripts/empacar.sh
chmod 700 /home/oracle/scripts/empacar.sh
/home/oracle/scripts/empacar.sh
rm /home/oracle/scripts/empacar.sh

Analizando y estableciendo los índices que deben ser recreados


REM
REM rebuild_indx.sql
REM
REM Copyright (c) Oracle Software, 1998 - 2000
REM
REM Author : Jurgen Schelfhout
REM MODIFICIACION: Ronald Vargas Quesada 2006-2009
REM
REM This script will analyze all the indexes for a given schema
REM or for a subset of schema's. After this the dynamic view
REM index_stats is consulted to see if an index is a good
REM candidate for a rebuild or for a bitmap index.
REM
REM Database Version : 9iR1, 9iR2,10g
REM
REM =============================================================
prompt
ACCEPT spoolfile CHAR prompt 'Output-file : ';
ACCEPT schema CHAR prompt 'Schema name (% allowed) : ';
prompt
prompt
prompt Rebuild the index when :
prompt - deleted entries represent 20% or more of the current entries
prompt - the index depth is more then 4 levels.
prompt Possible candidate for bitmap index :
prompt - when distinctiveness is more than 99%
prompt
set linesize 1000
set serveroutput on
set verify off
declare
c_name INTEGER;
ignore INTEGER;
height index_stats.height%TYPE := 0;
lf_rows index_stats.lf_rows%TYPE := 0;
del_lf_rows index_stats.del_lf_rows%TYPE := 0;
distinct_keys index_stats.distinct_keys%TYPE := 0;
cursor c_indx is
select owner, table_name, index_name
from dba_indexes
where owner like upper('&schema');
begin
dbms_output.enable (1000000);
dbms_output.put_line ('Owner Index Name % Deleted Entries Blevel Distinctiveness');
dbms_output.put_line ('--------------- --------------------------------------- ----------------- ------
---------------');
c_name := DBMS_SQL.OPEN_CURSOR;
for r_indx in c_indx loop
DBMS_SQL.PARSE(c_name,'analyze index ' r_indx.owner '.'
r_indx.index_name ' validate structure',DBMS_SQL.NATIVE);
ignore := DBMS_SQL.EXECUTE(c_name);
select HEIGHT, decode (LF_ROWS,0,1,LF_ROWS), DEL_LF_ROWS,
decode (DISTINCT_KEYS,0,1,DISTINCT_KEYS)
into height, lf_rows, del_lf_rows, distinct_keys
from index_stats;
--
-- Index is considered as candidate for rebuild when :
-- - when deleted entries represent 20% or more of the current entries
-- - when the index depth is more then 4 levels.(height starts counting from 1 so > 5)
-- Index is (possible) candidate for a bitmap index when :
-- - distinctiveness is more than 99%
--
if ( height > 5 ) OR ( (del_lf_rows/lf_rows) > 0.2 ) then
dbms_output.put_line (rpad(r_indx.owner,16,' ') rpad(r_indx.index_name,40,' ')
lpad(round((del_lf_rows/lf_rows)*100,3),17,' ')
lpad(height-1,7,' ') lpad(round((lf_rows-distinct_keys)*100/lf_rows,3),16,' '));
end if;
end loop;
DBMS_SQL.CLOSE_CURSOR(c_name);
end;
/
set verify on

Menú aplicativo shell linux para tareas administrativas

El siguiente script-shell, puede ser utilizado para automatizar tareas a nivel de usuarios operadores en servidores LINUX ó Unix.

# Menu administrativo para labores de base de datos Oracle
# Diciembre 2009, Ronald Vargas, LINUX SHELL SCRIPT
# Version 2.0_2009
 
#VARIABLES DE AMBIENTE DE ORACLE
ORACLE_BASE=/oracle
ORACLE_HOME=$ORACLE_BASE/product/9.2.0
PATH=$ORACLE_HOME/bin:$PATH
 
opcion_no_disponible () {
echo "Opcion no disponible"
}
menu_miscelaneo() {
menu_misc=
until [ "$op" = "0" ]; do
clear
echo " "
echo "======================================================================"
echo -e "\033[1m MORFEO INTERNACIONAL S.A.- Fecha: $(date) \033[0m"
tput sgr0
echo "======================================================================"
echo -e '\E[47;31m'
echo " MENU APLICATIVO VENTAS "
echo -e '\E[37;44m'
echo " a - Salir del menu "
echo " b - Actualizar Tipo de Cambio "
echo " c - Actualizar Ofertas "
echo " d - Actualizar Existencias "
echo -e " f - Actualizar Traslados \033[0m"
tput sgr0
echo "======================================================================"
echo -n " Opcion: "
read op
echo " "
case $op in
a ) echo "Saliendo del Menu de Ventas"; break;;
a ) lsnrctl status; pausa;;
b ) lsnrctl status; pausa;;
c ) lsnrctl status; pausa;;
d ) lsnrctl status; pausa;;
esac
done
}
clear
pausa() {
echo "Presione ENTER para continuar"
read a
}
menu_principal() {
selection=
until [ "$selection" = "0" ]; do
clear
echo " "
echo "======================================================================"
echo -e "\033[1m MORFEO INTERNACIONAL S.A.- Fecha: $(date) \033[0m"
tput sgr0
echo "======================================================================"
echo -e '\E[47;31m'
echo " MENU APLICATIVO V1.0_2007 "
echo -e '\E[37;44m'
echo " 0 - Salir del menu "
echo " 1 - Ver_estado_LISTENER "
echo " 2 - Ver_Bases_de_Datos_Levantadas "
echo " 3 - Subir_LISTENER "
echo " 4 - Bajar_LISTENER "
echo " 5 - Bajar_BD "
echo " 6 - SuBir_BD "
echo " 7 - Generar_EXPORT "
echo " 8 - VER_espacio_disco "
echo " 9 - MONITOREAR_equipo "
echo "10 - VER_Crontab_Oracle "
echo -e " a - Miscelaneos \033[0m"
tput sgr0
echo "======================================================================"
echo -n " Opcion: "
read selection
echo " "
case $selection in
1 ) lsnrctl status; pausa;;
2 ) $HOME/scripts/Menu/db_monitor.sh; pausa;;
3 ) lsnrctl start; pausa;;
4 ) lsnrctl stop; pausa;;
5 ) $HOME/scripts/Menu/bajar_bd; pausa;;
6 ) $HOME/scripts/Menu/subir_bd; pausa;;
7 ) opcion_no_disponible; pausa;;
8 ) df -h; pausa;;
9 ) top; pausa;;
10 ) crontab -l; pausa;;
a ) menu_miscelaneo; pausa;;
* ) clear; echo "Derechos Ronald Vargas Q., 2009"; break ;;
esac
done
}
menu_principal


Presentación visual

Todos los Sábados a las 8:00PM