jueves, 1 de agosto de 2013

OEM Grid Control

Apuntes Oracle Enterprise Manager Grid Control:

1) Para obtener trazas a distintos niveles (info, warm, debug, ...) de la ejecución de la paquetería interna de OEM Grid Control (esquema SYSMAN del repositorio central del Grid), se puede utilizar la tabla:

EMDW_TRACE_CONFIG

Donde tenemos la posibilidad de activación de trazas a distintos niveles:

CONTEXT_TYPE_ID CONTEXT_TYPE                   TRACE_LEVEL
--------------- ------------------------------ -----------
              9 COMPLIANCE_EVALUATION                    0
              1 DEFAULT                                  0
              2 TRACER                                   0
              3 LOADER                                   0
              4 NOTIFICATION                             0
              5 REPOCOLLECTION                           0
              6 EM.JOBS                                  0
              7 EM.BLACKOUT                              0
              8 SVCTESTAVAIL                             0

Cambiando el "Trace_level" manualmente o a través de la llamada de algún paquete (revisar metalink para extender la información).

En caso de querer la traza de todo a nivel de debug:

update sysman.emdw_trace_config set trace_level=4;

2) Para cambiar el HOSTNAME que utiliza la instalación de un agente del grid, en vez de tener que cambiar el hostname de la máquina, se puede utilizar la variable ORACLE_HOSTNAME a la hora de ejecutar el "runInstaller" y posterior agentca -f:

./oui/bin/runInstaller -clone -forceClone ORACLE_HOME=... ORACLE_HOME_NAME=... -noconfig -silent ORACLE_HOSTNAME=....

./bin/agentca -f

viernes, 24 de mayo de 2013

Script - Bloqueos_Espera

Nos muestra los objetos por los que está esperando una session (si está esperando por un segmento), se le pasa como parámetro el sid de la sessión a monitorizar.


(recodificado para 11g)

select vw.* ,vw.event,segment_name, segment_type 
from 
dba_extents,
(select vw.*, rownum rown from v$session_wait vw where vw.sid=&&1 order by rown) vw
where 
file_id(+) = vw.p1 
and
vw.p2 between block_id and block_id+blocks;

miércoles, 22 de mayo de 2013

Script - Foreign keys sin Indexar

Consulta para localizar FKs sin indexar en nuestra bbdd, utiliza la función transponer (http://www.soportedba.com/2011/01/script-trasponerfilasacolumnasql.html), (se debe modificar para incluir la directiva "with authid current_user").

Con la columna "INDICE_A_CREAR" obtenemos la propuesta del índice a crear (que habrá que revisar para incluir opciones de almacenamiento u otras características).

COLUMN INDICE_A_CREAR FORMAT A200

SELECT DISTINCT FK.OWNER,FK.TABLE_NAME, FK.CONSTRAINT_NAME, 'CREATE INDEX '||FK.OWNER||'.'||FK.TABLE_NAME||'_'||ROWNUM||'_I ON '||FK.OWNER||'.'||FK.TABLE_NAME||'('||TRANSPONER('SELECT COLUMN_NAME FROM DBA_CONS_COLUMNS WHERE OWNER='||CHR(39)||FK.OWNER||CHR(39)||' AND CONSTRAINT_NAME='||CHR(39)||FK.CONSTRAINT_NAME||CHR(39)||' ORDER BY POSITION',',')||')' INDICE_A_CREAR
FROM
    (select DC.OWNER, DC.TABLE_NAME, DC.constraint_name, DCC.COLUMN_NAME, DCC.POSITION
    FROM
        DBA_CONSTRAINTS DC,
        DBA_CONS_COLUMNS DCC
    WHERE
        DC.CONSTRAINT_NAME=DCC.CONSTRAINT_NAME AND
        DC.OWNER=DCC.OWNER AND
        DC.CONSTRAINT_TYPE='R') FK,
    (SELECT DI.OWNER, DI.TABLE_NAME, DI.INDEX_NAME, DIC.COLUMN_NAME, DIC.COLUMN_POSITION   
    FROM
        DBA_INDEXES DI,
        DBA_IND_COLUMNS DIC
    WHERE
        DI.INDEX_NAME=DIC.INDEX_NAME AND
        DI.OWNER=DIC.INDEX_OWNER ) IND
WHERE
    FK.COLUMN_NAME=IND.COLUMN_NAME(+) AND
    FK.POSITION=IND.COLUMN_POSITION(+) AND
    FK.OWNER=IND.OWNER(+) AND
    FK.TABLE_NAME=IND.TABLE_NAME(+) AND
    IND.TABLE_NAME IS NULL AND
    FK.OWNER NOT IN ('SYS','SYSTEM','ORACLE_OCM','DIP','TSMSYS','SYSMAN','DBSNMP','WMSYS','EXFSYS')
ORDER BY 1,2,3
/


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