martes, 19 de marzo de 2013

Script - Analisis básico de logs con AWR

Script básico AWR con el que queremos asociar lineas adyacentes de un fichero de log:

#!/bin/awk -f
BEGIN {
        FS="#";
        FECPREV="";
        FEC="";
}
{
        FECPREV=FEC;
        FEC=$1;
        print FECPREV "-" FEC;
}



Uso: ./awk.sh ...fichero... |grep ...


por ejemplo, el alert de una base de datos donde tenemos:

...
Stopping background process MMON
License high water mark = 1
Wed Aug 29 01:09:38 CEST 2012
ALTER DATABASE CLOSE NORMAL
...

Y queremos mostrar la fecha y hora de todas los cierres de la bbdd:


./awk.sh alertSID.log |grep "ALTER DATABASE CLOSE NORMAL"

Wed Aug 29 01:09:38 CEST 2012-ALTER DATABASE CLOSE NORMAL
ALTER DATABASE CLOSE NORMAL-Wed Aug 29 01:09:38 CEST 2012
Wed Aug 29 01:09:38 CEST 2012-Completed: ALTER DATABASE CLOSE NORMAL
Completed: ALTER DATABASE CLOSE NORMAL-Wed Aug 29 01:09:38 CEST 2012
Thu Aug 30 01:07:53 CEST 2012-ALTER DATABASE CLOSE NORMAL
ALTER DATABASE CLOSE NORMAL-Thu Aug 30 01:07:53 CEST 2012
Thu Aug 30 01:07:53 CEST 2012-Completed: ALTER DATABASE CLOSE NORMAL
Completed: ALTER DATABASE CLOSE NORMAL-Thu Aug 30 01:07:53 CEST 2012



martes, 12 de febrero de 2013

Script - Vsesstat_analisis.sql

Script para localizar sesiones problemáticas , (http://www.dba-oracle.com/oracle10g_tuning/t_sql_top_sessions.htm):

En este caso, la ordenación es por el número de "user rollbacks", para identificar conexiones de servidores de aplicación con posibles problemas de gestión de transacciones.

select * from
(select a.sid sid,
       SUBSTR(b.USERNAME,1,15) USUARIO,
       SUBSTR(b.OSUSER,1,10) OSUSER,
       SUBSTR(b.STATUS,1,10) ESTADO,
--       SUBSTR(b.module,1,20) modulo,
--     SUBSTR(b.MACHINE,1,30) MAQUINA,
   to_char(logon_time,'dd-mon-yy hh:mi:ss pm') logon_time,
   sysdate fecha_actual,
   sum(decode(c.name,'user commits',value,0)) commits,
   sum(decode(c.name,'user rollbacks',value,0)) rollbacks,
   sum(decode(c.name,'execute count',value,0)) executions,
  (sum(decode(c.name,'physical reads  ',value,0)) +
   sum(decode(c.name,'physical writes',value,0)) +
   sum(decode(c.name,'physical writes direct',value,0)) +
   sum(decode(c.name,'physical writes direct (lob)',value,0))+
   sum(decode(c.name,'physical reads  direct (lob)',value,0)) +
   sum(decode(c.name,'physical reads   direct',value,0)))
   total_physical_io,
  (sum(decode(c.name,'db block gets',value,0)) +
   sum(decode(c.name,'db block changes',value,0)) +
   sum(decode(c.name,'consistent changes',value,0)) +
   sum(decode(c.name,'consistent gets ',value,0)) )
   total_logical_io,
  (sum(decode(c.name,'session pga memory',value,0))+
   sum(decode(c.name,'session uga memory',value,0)) )
   total_memory_usage,
   sum(decode(c.name,'parse count (total)',value,0)) parses,
   sum(decode(c.name,'cpu used by this session',value,0))
   total_cpu,
   sum(decode(c.name,'parse time cpu',value,0)) parse_cpu,
   sum(decode(c.name,'recursive cpu usage',value,0))
     recursive_cpu,
   sum(decode(c.name,'cpu used by this session',value,0)) -
   sum(decode(c.name,'parse time cpu',value,0)) -
   sum(decode(c.name,'recursive cpu usage',value,0))
     other_cpu,
   sum(decode(c.name,'sorts (disk)',value,0)) disk_sorts,
   sum(decode(c.name,'sorts (memory)',value,0)) memory_sorts,
   sum(decode(c.name,'sorts (rows)',value,0)) rows_sorted
from sys.v_$sesstat  a,
     sys.v_$session b,
     sys.v_$statname c
where
a.sid=b.sid and
a.statistic#=c.statistic# and
      c.NAME in ('physical reads  ',
                 'physical writes',
                 'physical writes direct',
                 'physical reads   direct',
                 'physical writes direct (lob)',
                 'physical reads   direct (lob)',
                 'db block gets',
                 'db block changes',
                 'consistent changes',
                 'consistent gets ',
                 'session pga memory',
                 'session uga memory',
                 'parse count (total)',
                 'CPU used by this session',
                 'parse time cpu',
                 'recursive cpu usage',
                 'sorts (disk)',
                 'sorts (memory)',
                 'sorts (rows)',
                 'user commits',
                 'user rollbacks',
                 'execute count'
)
group by a.sid ,
       SUBSTR(b.USERNAME,1,15) ,
       SUBSTR(b.OSUSER,1,10) ,
       SUBSTR(b.STATUS,1,10) ,
       SUBSTR(b.SERVER,1,7) ,
       SUBSTR(b.module,1,20) ,
     SUBSTR(b.MACHINE,1,30) ,
   to_char(logon_time,'dd-mon-yy hh:mi:ss pm')
order by rollbacks desc)
where rownum < 14
/


MySql Cluster sobre infraestructura Grid de ORACLE

Uso de Oracle Grid Infraestructure 11g para dar servicio a bases de datos MySQL en modo Cluster:

MySql Cluster sobre infraestructura Grid de ORACLE

jueves, 15 de noviembre de 2012

Indices NOSEGMENT o Virtuales

Desde versiones antiguas existe la posibilidad de crear índices tipo NOSEGMENT o virtuales, que permiten "probar" nuevos índices sin afectar al rendimiento/espacio de los sistemas analizados:

CREATE INDEX TABLA_01_I ON TABLA(COLUMNA) NOSEGMENT;

ALTER SESSION SET "_use_nosegment_indexes" = true;

Ahora analizaríamos la consulta :

EXPLAIN PLAN FOR SELECT COUNT(1) FROM TABLA WHERE COLUMNA=...;

Mostrándonos o nó el uso del índice.

Hay que tener cuidado con estos índices, porque:

1) No aparecen en dba_indexes (sí en dba_objects).
2) Oracle puede mostrar que utiliza el índice en las ejecuciones de consultas, (set autotrace on).

miércoles, 14 de noviembre de 2012

Script - Purgado automatizado de Logs 11g

Para el borrado automatizado de logs en instalaciones 11g, se puede/debe hacer uso del comando adrci, que se puede automatizar con scripting:

fichero: purgado.adrci (retención de 2 meses):

SET HOMEPATH diag/rdbms/bbdd/BBDD

PURGE -age 89280

Ejecución del purgado:

adrci script=purge.adrci

martes, 28 de agosto de 2012

Parámetro INITRANS y evento "enq: TX - row lock contention"

El parámetro de configuración INITRANS se gestiona de forma automática desde hace algunas versiones Oracle, pero, en sistemas con concurrencias dispares a lo largo del tiempo quizás conviene
dejarlo en un valor fijo grande para evitar formateos de bloques con valores bajos de ese parámetro y consecuentes problemas de adquisición de bloqueos (enq: TX - row lock contention).

Para analizar uno o varioas bloques:

alter system dump datafile <file_id> block <Block_id>;
alter system dump datafile <file_id> block min <Block_id min> block max <Block id max>;

Buscamos en el udump ... el fichero de traza generado y la cadena "itc", que indicaría el número de ITL reservados realmente para el bloque analizado.

Si vemos que es insuficiente para nuestra tasa de concurrencia, cambiaríamos el INITRANS de los objetos afectados (suponiendo una concurrencia máxima de 80 sesiones):

ALTER [TABLE|INDEX] ... INITRANS 80;


lunes, 6 de agosto de 2012

Script - Migración Export Import mediante tuberías y scp

Script útil para migraciones entre distintas versiones Oracle y/o cargas de datos, basado en export/import tradicional, mediante tuberías tipo pipe y scp.

La ventaja de este script es que no utiliza espacio para los ficheros de export (va todo a través de la tuberías pipe) y que se lanza desde el servidor destino de la copia, sólo requiere acceso "scp" sin password (authorized_keys).


SID=$1
IP=$2
USRSSH=$3
SID2=$4

ssh $USRSSH@$IP ". \$HOME/.profile;. \$HOME/.bash_profile;rm /tmp/tmp_exports_$SID;mknod /tmp/tmp_exports_$SID p;sleep 5;export ORACLE_SID=$SID;exp userid=\'sys/sys AS SYSDBA\' file=/tmp/tmp_exports_$SID rows=y full=y consistent=y log=/tmp/tmp_exports_$SID.log" &
rm /tmp/tmp_exports_$SID2
mknod /tmp/tmp_exports_$SID2 p
ssh $USRSSH@$IP ". \$HOME/.profile;. \$HOME/.bash_profile;cat /tmp/tmp_exports_$SID" > /tmp/tmp_exports_$SID2 &
export ORACLE_SID=$SID2
imp userid=\'sys/sys AS SYSDBA\' file=/tmp/tmp_exports_$SID2 full=y ignore=y

-- Ejemplo:

./export_import_full.sh SID_ORIG 192.168.0.1 oracle SID_DEST

Se irá generando un export full de la instancia SID_ORIG ubicada en el servidor 192.168.0.1, al que se accede con el usuario "oracle" (usuario de instalación oracle con .profile o .bash_profile con las variables de entorno Oracle configuradas).
Este export se irá importando a través del paso por 2 tuberias pipe (ficheros tmp_exports_$SID y tmp_exports_$SID2) sobre la instancia SID_DEST ubicada en el servidor desde el que estemos lanzando el script y al que estamos conectado con el usuario de instalación oracle con las variables de entorno Oracle configuradas.