Script Perl para coletar dados de Wait Events em Arquivo Texto

Este é um script Perl que fiz para coletar dados de Wait Events de um banco de dados Oracle, em um arquivo texto, com os campos separados por ponto e vírgula.

Uma vez que os dados estejam em um arquivo texto como estes, fica muito mais fácil analisar, importando no Excel ou Openoffice, e até fazer gráficos, comos e fosse no Enterprise Manager, mas com uma granularidade menor.

Ele fica em execução contínua, até que seja pressionado Ctrl+C.

 

Deixarei este script compactado também na seção Downloads.

 

use strict;

use warnings;

use DBD::Oracle qw(:ora_session_modes);

 

open(LOG, ‘>>OBA.LOG’);

 

print “########################################”;

print “n### OBA – Oracle Bottleneck Analyser ###n”;

print “########################################nn”;

print “Versao 0.01.nDeveloped by por Ricardo Portilho Proni, working at Solvo S/A – ricardo.proni@solvo.com.brnn”;

print “Anyone can use, copy and distribute copies of this software under the terms of the Artistic License 2.0n”;

print “Artistic License 2.0: http://www.opensource.org/licenses/artistic-license-2.0.php”;

 

print “nnnWhat database should I analyze?nn”;

print “Hostname or IP Address: “;

my $oracle_hostname = <>; chomp $oracle_hostname;

print “Oracle SID: “;

my $oracle_database = <>; chomp $oracle_database;

print “Username: “;

my $oracle_username = <>; chomp $oracle_username;

print “Password: “;

my $oracle_password = <>; chomp $oracle_password;

print “nn”;

print “Collecting data to OBA.LOG (press Ctrl+c to stop)…n”;

 

my $oracle_dbh = DBI->connect(“dbi:Oracle:host=$oracle_hostname;sid=$oracle_database”, $oracle_username, $oracle_password, {RaiseError => 1, AutoCommit => 0});

$oracle_dbh->{LongReadLen} = 4000;

$oracle_dbh->{LongTruncOk} = 1;

 

my $oracle_sql_02 = “SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’) WAIT_DATETIME, W.SID, W.EVENT, W.WAIT_CLASS, W.SECONDS_IN_WAIT, W.STATE, W.P1, W.P1TEXT, W.P2, W.P2TEXT, W.P3, W.P3TEXT, SQL.SQL_FULLTEXT FROM V$SESSION_WAIT W, V$SESSION S, V$PROCESS P, V$SQL SQL WHERE W.SID = S.SID AND S.PADDR = P.ADDR AND SQL.ADDRESS = S.SQL_ADDRESS AND SQL.HASH_VALUE = S.SQL_HASH_VALUE ORDER BY W.SECONDS_IN_WAIT DESC, W.SID”;

my $oracle_sth_02 = $oracle_dbh->prepare($oracle_sql_02) or die $DBI::errstr;

 

while (1)

{

$oracle_sth_02->execute() or die $DBI::errstr;

print “Passo 1n”;

 

while (my $oracle_ref_02 = $oracle_sth_02->fetchrow_hashref())

{

print “Passo 2n”;

my $wait_datetime = $oracle_ref_02->{WAIT_DATETIME};

my $sid = $oracle_ref_02->{SID};

my $event = $oracle_ref_02->{EVENT};

my $wait_class = $oracle_ref_02->{WAIT_CLASS};

my $seconds_in_wait = $oracle_ref_02->{SECONDS_IN_WAIT};

my $state = $oracle_ref_02->{STATE};

my $p1 = $oracle_ref_02->{P1};

my $p1text = $oracle_ref_02->{P1TEXT};

my $p2 = $oracle_ref_02->{P2};

my $p2text = $oracle_ref_02->{P2TEXT};

my $p3 = $oracle_ref_02->{P3};

my $p3text = $oracle_ref_02->{P3TEXT} || ”;

my $sql_fulltext = $oracle_ref_02->{SQL_FULLTEXT};

$sql_fulltext =~ s/n/ /gm;

$sql_fulltext =~ s/ / /gm;

print “Passo 3n”;

 

print “Passo 4n”;

print “$wait_class $event $seconds_in_waitn$sql_fulltextnn”;

print “Passo 5n”;

print LOG “$oracle_database;$wait_datetime;$sid;$event;$wait_class;$seconds_in_wait;$p1;$p1text;$p2;$p2text;$p3;$p3text;$sql_fulltextn”;

print “Passo 6n”;

}

}

 

$oracle_dbh->disconnect;

exit;

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.