Script Perl para coletar dados de Wait Events em MySQL

Esta é a versão do script que coleta dados de Wait Events de um banco de dados Oracle, mas que em vez de armazenar em um arquivo texto, guardará as informações diretamente em um banco de dados MySQL, o que torna a análise de grandes volumes de dados mais simples.

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

 

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

 

use strict;

use warnings;

use DBD::Oracle qw(:ora_session_modes);

 

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 “Oracle Hostname or IP Address: “;

my $oracle_hostname = <>; chomp $oracle_hostname;

print “Oracle SID: “;

my $oracle_database = <>; chomp $oracle_database;

print “Oracle Username: “;

my $oracle_username = <>; chomp $oracle_username;

print “Oracle Password: “;

my $oracle_password = <>; chomp $oracle_password;

print “nn”;

print “MySQL Hostname or IP Address: “;

my $mysql_hostname = <>; chomp $mysql_hostname;

print “MySQL Database: “;

my $mysql_database = <>; chomp $mysql_database;

print “MySQL Username: “;

my $mysql_username = <>; chomp $mysql_username;

print “MySQL Password: “;

my $mysql_password = <>; chomp $mysql_password;

print “nn”;

 

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 $mysql_dbh = DBI->connect(“dbi:mysql:host=$mysql_hostname;database=$mysql_database”, $mysql_username, $mysql_password, {RaiseError => 1, AutoCommit => 1});

 

print “Collecting data to MySQL Database (press Ctrl+c to stop)…n”;

 

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

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, SQL.SQL_TEXT FROM V$SESSION_WAIT W, V$SESSION S, V$PROCESS P, V$SQLTEXT 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 AND SQL.PIECE = 0 ORDER BY W.SECONDS_IN_WAIT DESC, W.SID”;

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

my $mysql_sql_01 = “INSERT INTO waits (oracle_database, wait_datetime, sid, event, wait_class, seconds_in_wait, sql_fulltext) VALUES (?, ?, ?, ?, ?, ?, ?)”;

my $mysql_sth_01 = $mysql_dbh->prepare($mysql_sql_01) or die $DBI::errstr;

 

while (1)

{

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

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

{

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 $sql_fulltext = $oracle_ref_02->{SQL_TEXT};

$sql_fulltext =~ s/n/ /gm;

$sql_fulltext =~ s/t/ /gm;

$sql_fulltext =~ s/ / /gm;

$mysql_sth_01->execute($oracle_database, $wait_datetime, $sid, $event, $wait_class, $seconds_in_wait, $sql_fulltext) or die $DBI::errstr;

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

print LOG “$oracle_database;$wait_datetime;$sid;$event;$wait_class;$seconds_in_wait;$sql_fulltextn”;

}

}

 

$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.