清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#!/usr/bin/perl
use Getopt::Long;
use DBI;
use warnings;
use strict;
my $config_file='';
my $db_option='';
#用于保存从数据库得到的数据
my %status;
#Parameters
my $test_para='';
my $rcode='';
#Check Parameters
if(!@ARGV){
&Useage;
exit(123);
}
sub Useage{
print "Please Use for example:\n";
print "$0 --config_file=path --db_option=web007\n";
}
#sub Help{
# print "--dbname=dbname\n";
# print "--location=location\n";
# print "--port=port\n";
# print "--db_user=db_user\n";
# print "--db_pass=password\n";
#}
#Parse Parameters 解析参数的函数,其中需要指定配置文件的位置、数据库选项
$rcode = GetOptions('config_file=s' => \$config_file,
'db_option=s' => \$db_option);
if(!$db_option){
print "please chose db_option\n";
exit(44);
}
#Get MySQL refer Parameters 取MySQL相关参数
my $dbname=&Read_config_file("db_name");
my $location=&Read_config_file("location");
#print "\$location=$location\n";
my $port=&Read_config_file("port");
my $db_user=&Read_config_file("db_user");
my $db_pass=&Read_config_file("db_pass");
my $get_status=&Read_config_file("status");
#Connect MySQL Server ,Get status and push into array;Get one line everytime
#For example:
#First time @fetch_row=(Aborted_clients,4),so $fetch_row[0]=Aborted_clients,$fetch_row[1]=4
#and the Second time $fetch_row=(Aborted_connects,10),etc.
sub Connect_MySQL{
my $database="DBI:mysql:$dbname:$location:$port";
my $dbh=DBI->connect($database,$db_user,$db_pass) or die "Can not connect MySQL Server". $DBI::errstr;
my $sql="show global status";
my $sth=$dbh->prepare($sql);
$sth->execute() or die "Can not Execute SQL statement";
my @fetch_row;
my @table_name;
while (@fetch_row = $sth->fetchrow_array){
my @row=@fetch_row;
#print scalar(@row);
push(@table_name,\@row);
}
#List
foreach my $table_name (@table_name){
my($key,$value)=(@$table_name[0],@$table_name[1]);
if(($key)&&($value)){
$status{$key}=$value;
}
}
}
sub Read_config_file{
# print "Can Not Find $config_file\n" if(!$config_file);
# print "Can find $config_file\n";
open(CONFIG_FILE,"$config_file") or die "Can Not Open $config_file";
my $get_parameters=shift;
my $return_parameter='';
#print "\$get_parameters=$get_parameters\n";
my $read_format_head="\<$db_option\>";
my $read_format_end="\<\/$db_option\>";
my @read_file=(<CONFIG_FILE>);
my $array_count=@read_file;
for(my $i=0;$i<=($array_count-1);$i++){
chomp($read_file[$i]);
print "\$db_option=$db_option\n";
my $is_valid_option_qr="\<(.*)\>";
my @Refer_db_option;
if($read_file[$i] =~ $is_valid_option_qr){
push(@Refer_db_option,$1);
}
my $return_value = &is_valid_option(@Refer_db_option,$db_option);
#print "\$return_value=$return_value\n";
# foreach my $judge_db_option(@Judge_db_option){
# print "\$judge_db_option=$judge_db_option\n";
# last if($1 =~ $db_option);
# }
next if($read_file[$i] =~ /$read_format_head/);
last if($read_file[$i] =~ /$read_format_end/);
#print "$read_file[$i]\n";
#$return_parameter=$read_file[$i] if($read_file[$i] =~ /$get_parameters=(.*)/);
$return_parameter=$1 if($read_file[$i] =~ /$get_parameters=(.*)/);
#print "\$dbname=$dbname\n";
}
return $return_parameter;
}
sub is_valid_option{
my @Judge_db_option=shift;
my $get_db_option=shift;
my $Judge_db_option_count=@Judge_db_option;
print "\$Judge_db_option_count=$Judge_db_option_count\n";
print "\$get_db_option=$get_db_option\n";
#foreach my $judege_db (@Judge_db_option){
#print "\$judege_db=$judege_db\n";
#last if($judege_db =~ $get_db_option);
#}
#return 0;
}
#Get MySQL status:QPS/Insert/Update etc.
#For example
#If want to get QPS,You should call GET_MySQL_Status(Queries,$Interval_time)
sub GET_MySQL_Status{
my $MySQL_Status=shift;
print "\$MySQL_Status=$MySQL_Status\n";
if(!$MySQL_Status){
print "please Specify status value on configure file\($config_file\)\n";
}
my $Interval_time=shift;
$MySQL_Status = 'Queries' if($MySQL_Status eq 'qps');
#$MySQL_Status = "Com_$MySQL_Status" if ($MySQL_Status);
#Call function Connect_MySQL for connect MySQL Server
&Connect_MySQL;
print "\$MySQL_Status=$MySQL_Status\n";
$Interval_time=2 if (!$Interval_time);
print "\$Interval_time=$Interval_time\n";
my $GET_MySQL_Status;
my $MySQL_Status_old=$status{$MySQL_Status};
#print "\$status{$MySQL_Status}=$status{$MySQL_Status}\n";
#debug
#print "\$MySQL_Status_old=";
#print sprintf("%0.2f",$MySQL_Status_old)."\n";
my $Uptime_old=$status{'Uptime'};
sleep 2;
my $MySQL_Status_now=$status{$MySQL_Status};
#debug
#print "\$MySQL_Status_now=";
#print sprintf("%0.2f",$MySQL_Status_now)."\n";
my $Uptime_now=$status{'Uptime'};
if(($MySQL_Status_now)&&($MySQL_Status_old)&&($Uptime_old)&&($Uptime_now)){
if(($MySQL_Status_now = $MySQL_Status_old) || ($MySQL_Status_now == 0)){
print "0\n";
}else{
$GET_MySQL_Status=($MySQL_Status_now-$MySQL_Status_old)/($Uptime_now-$Uptime_old);
#print sprintf("%.2f",$GET_MySQL_Status);
print "$GET_MySQL_Status\n";
}
}
}
&GET_MySQL_Status($get_status,3);