jueves, 17 de septiembre de 2009

Script para relacionar Segmentos de Shared Memory con DBs de Oracle

Este script es útil para determinar que segmentos de memoria utiliza
cada DB, dado que si tenemos varias DB es complicado determinar que
segmento pertenece a cada una.

Salida:
El comando muestra la misma salida del "ipcs -m" pero añade al final
de cada segmento de memoria la DB correspondiente y completa con "*"
cuando el segmento no esta referenciado con ninguna DB, lo cual nos
facilita un segmento candidato a ser eliminado con el comando "ipcrm -
m [ID]".

Nota:
Es importante solo tener en cuenta los segmentos de los usuarios de
las DB (Ej. Oracle)

Ejemplo:

root@tango01 # showipcs
IPC status from as of Tue May 15 14:23:20 MEST 2007

T ID KEY MODE OWNER GROUP
Shared Memory:
m 84 0x6c91c3e0 --rw-r----- oracle dba
[ ****************** ]
m 74 0x83a50bf0 --rw-r----- oracle dba [ DNWTPRO ]
m 44 0xcea2dc58 --rw-r----- oracle dba [ DNEWTOUR ]
m 30 0xb60abb4c --rw-r----- oracle dba [ DPRTLEMP ]
m 7 0x438d0000 --rw-r----- oracle dba [ DVGNT ]
m 1 0xfa9d2b30 --rw-r----- oracle dba [ DGFORCE ]

En esta salida de ejemplo el segmento 84 presuntamente esta asignado
pero no pertenece a ninguna DB activa, con lo cual tendría que ser
eliminado con el comando "ipcrm -m 84"

SCRIPT:

#!/usr/bin/perl

sub ipc2db{
$p_ipc = shift;
@PMONPID=`ps -ef|grep pmon|grep -v grep|awk '{print \$2}'`;
foreach $pid (@PMONPID) {
$db="";
$ipc="";
chomp($pid);
$db=`ps -ef -o "comm,pid" |grep -i " $pid"|grep -v
grep|awk '{print \$1}'|cut -d"_" -f3`;
chomp($db);
$ipc=`pmap $pid |egrep shmid|cut -d "=" -f2|awk
'{print \$1"=d"}'`;
chomp($ipc);
$ipc=hex($ipc);
return($db) if("$p_ipc" == "$ipc");

}

}

@IPCS_M=`/usr/bin/ipcs -m`;
foreach $line (@IPCS_M){
$DB="";
chomp($line);
if($line =~ m/^m/){
($T,$ID,$KEY,$MODE,$OWNER,$GROUP) = split(/\ +/,$line,
6);
$DB = ipc2db("$ID");
$DB=($DB?$DB:"******************");
print $line." [ $DB ]\n";
}else{
print $line."\n";
}
}

##END

Gracias a MarcosG

Salu2,

Mariano

No hay comentarios: