Mysql cluster slave server的自动检测与修复
上一篇 / 下一篇 2005-01-05 17:52:36 / 个人分类:其他
需要DBIX及Mail等perl模块
注意,虽然能够自动修复,但是可能造成slave的数据条目少于master的条目!使用的时候自己注意些好了
本脚本是修改版,原作者是Jeremy Zawodny
代码:
[code]
#!/usr/local/bin/perl -w
# chunshengsterATgmail.com
# fix mysql replication if it encounters a problem
# Useage:perl fix_repl.pl ip1 ip2 ip3
$&line;=1; # unbuffer stdout
use strict;
use DBIx::DWIW;
use Mail::Mailer;
my $ip;
foreach $ip (@ARGV) &leftsign;
&fixdb($ip);
&rightsign;
exit;
sub fixdb()
&leftsign;
my $host = shift &line;&line; \'localhost\';
my $conn = DBIx::DWIW->Connect(
DB => \"test\",
User => \"sqlmon\",
Pass => \'!@#$%^&*()\',
Host => $host,
Port => 3306) or die \"Couldn\'t connect to database!\";
print \"checking $host ... \\n\";
my $info = $conn->Hash(\"SHOW SLAVE STATUS\") or die $@;
my @version = $conn->Array(\"SHOW VARIABLES LIKE \'Version\'\");
my $fix_cmd;
my $start_cmd;
# slave not start
if ($info->&leftsign;Slave_IO_Running&rightsign; eq \'No\' and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START\";
&rightsign;
# 4.0.0 - 4.0.2
elsif ($version[1] =~ /^4\\.0\\.[012]/ and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START SQL_THREAD\";
&rightsign;
# 4.0.3 - 4.0.xx, 4.1.xx. Don\'t know what 5.0 will be like.
elsif ($version[1] =~ /^4\\.[01]\\./ and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START SQL_THREAD\";
&rightsign;
# things are okay or unknown version?
else
&leftsign;
print \"GOOD\\n\";
&rightsign;
if ($info->&leftsign;Slave_IO_Running&rightsign; eq \'No\' or $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\' )&leftsign;
&mailtoadmin($info,$host);
print \"FIXING ... \";
$conn->Execute($fix_cmd);
$conn->Execute($start_cmd);
print \"DONE\\n\";
&rightsign;
&rightsign;
sub mailtoadmin()&leftsign;
my $body=shift;
my $host = shift;
my @MailTo=(\"xxxx\\@yyyy.com\");
my $subject = \"Mysql Self fix replication on $host \";
my $mailer = Mail::Mailer->new() or die $@;
$mailer->open(&leftsign; From => $host,
To => \\@MailTo,
Subject => $subject,
&rightsign;)or die \"Can\'t open: $!\\n\";
# while ( my ($key, $value) = each(%$body) ) &leftsign;
# print $mailer \"$key => $value\\n\";
# &rightsign;
print $mailer <<MAILCONTENT;
*************************** show slave status***************************
Master_Host => $body->&leftsign;\'Master_Host\'&rightsign;
Master_User => $body->&leftsign;\'Master_User\'&rightsign;
Master_Port => $body->&leftsign;\'Master_Port\'&rightsign;
Connect_retry => $body->&leftsign;\'Connect_retry\'&rightsign;
Master_Log_File => $body->&leftsign;\'Master_Log_File\'&rightsign;
Read_Master_Log_Pos =>$body->&leftsign;\'Read_Master_Log_Pos\'&rightsign;
Relay_Log_File => $body->&leftsign;\'Relay_Log_File\'&rightsign;
Relay_Log_Pos => $body->&leftsign;\'Relay_Log_Pos\'&rightsign;
Relay_Master_Log_File =>$body->&leftsign;\'Relay_Master_Log_File\'&rightsign;
Slave_IO_Running =>$body->&leftsign;\'Slave_IO_Running\'&rightsign;
Slave_SQL_Running =>$body->&leftsign;\'Slave_SQL_Running\'&rightsign;
Replicate_do_db => $body->&leftsign;\'Replicate_do_db\'&rightsign;
Replicate_ignore_db =>$body->&leftsign;\'Replicate_ignore_db\'&rightsign;
Last_errno => $body->&leftsign;\'Last_errno\'&rightsign;
Last_error => $body->&leftsign;\'Last_error\'&rightsign;
Skip_counter => $body->&leftsign;\'Skip_counter\'&rightsign;
Exec_master_log_pos => $body->&leftsign;\'Exec_master_log_pos\'&rightsign;
Relay_log_space => $body->&leftsign;\'Relay_log_space\'&rightsign;
MAILCONTENT
$mailer->close();
&rightsign;[/code]<θθθ>192|
注意,虽然能够自动修复,但是可能造成slave的数据条目少于master的条目!使用的时候自己注意些好了
本脚本是修改版,原作者是Jeremy Zawodny
代码:
[code]
#!/usr/local/bin/perl -w
# chunshengsterATgmail.com
# fix mysql replication if it encounters a problem
# Useage:perl fix_repl.pl ip1 ip2 ip3
$&line;=1; # unbuffer stdout
use strict;
use DBIx::DWIW;
use Mail::Mailer;
my $ip;
foreach $ip (@ARGV) &leftsign;
&fixdb($ip);
&rightsign;
exit;
sub fixdb()
&leftsign;
my $host = shift &line;&line; \'localhost\';
my $conn = DBIx::DWIW->Connect(
DB => \"test\",
User => \"sqlmon\",
Pass => \'!@#$%^&*()\',
Host => $host,
Port => 3306) or die \"Couldn\'t connect to database!\";
print \"checking $host ... \\n\";
my $info = $conn->Hash(\"SHOW SLAVE STATUS\") or die $@;
my @version = $conn->Array(\"SHOW VARIABLES LIKE \'Version\'\");
my $fix_cmd;
my $start_cmd;
# slave not start
if ($info->&leftsign;Slave_IO_Running&rightsign; eq \'No\' and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START\";
&rightsign;
# 4.0.0 - 4.0.2
elsif ($version[1] =~ /^4\\.0\\.[012]/ and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START SQL_THREAD\";
&rightsign;
# 4.0.3 - 4.0.xx, 4.1.xx. Don\'t know what 5.0 will be like.
elsif ($version[1] =~ /^4\\.[01]\\./ and $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\')
&leftsign;
$fix_cmd = \"SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1\";
$start_cmd = \"SLAVE START SQL_THREAD\";
&rightsign;
# things are okay or unknown version?
else
&leftsign;
print \"GOOD\\n\";
&rightsign;
if ($info->&leftsign;Slave_IO_Running&rightsign; eq \'No\' or $info->&leftsign;Slave_SQL_Running&rightsign; eq \'No\' )&leftsign;
&mailtoadmin($info,$host);
print \"FIXING ... \";
$conn->Execute($fix_cmd);
$conn->Execute($start_cmd);
print \"DONE\\n\";
&rightsign;
&rightsign;
sub mailtoadmin()&leftsign;
my $body=shift;
my $host = shift;
my @MailTo=(\"xxxx\\@yyyy.com\");
my $subject = \"Mysql Self fix replication on $host \";
my $mailer = Mail::Mailer->new() or die $@;
$mailer->open(&leftsign; From => $host,
To => \\@MailTo,
Subject => $subject,
&rightsign;)or die \"Can\'t open: $!\\n\";
# while ( my ($key, $value) = each(%$body) ) &leftsign;
# print $mailer \"$key => $value\\n\";
# &rightsign;
print $mailer <<MAILCONTENT;
*************************** show slave status***************************
Master_Host => $body->&leftsign;\'Master_Host\'&rightsign;
Master_User => $body->&leftsign;\'Master_User\'&rightsign;
Master_Port => $body->&leftsign;\'Master_Port\'&rightsign;
Connect_retry => $body->&leftsign;\'Connect_retry\'&rightsign;
Master_Log_File => $body->&leftsign;\'Master_Log_File\'&rightsign;
Read_Master_Log_Pos =>$body->&leftsign;\'Read_Master_Log_Pos\'&rightsign;
Relay_Log_File => $body->&leftsign;\'Relay_Log_File\'&rightsign;
Relay_Log_Pos => $body->&leftsign;\'Relay_Log_Pos\'&rightsign;
Relay_Master_Log_File =>$body->&leftsign;\'Relay_Master_Log_File\'&rightsign;
Slave_IO_Running =>$body->&leftsign;\'Slave_IO_Running\'&rightsign;
Slave_SQL_Running =>$body->&leftsign;\'Slave_SQL_Running\'&rightsign;
Replicate_do_db => $body->&leftsign;\'Replicate_do_db\'&rightsign;
Replicate_ignore_db =>$body->&leftsign;\'Replicate_ignore_db\'&rightsign;
Last_errno => $body->&leftsign;\'Last_errno\'&rightsign;
Last_error => $body->&leftsign;\'Last_error\'&rightsign;
Skip_counter => $body->&leftsign;\'Skip_counter\'&rightsign;
Exec_master_log_pos => $body->&leftsign;\'Exec_master_log_pos\'&rightsign;
Relay_log_space => $body->&leftsign;\'Relay_log_space\'&rightsign;
MAILCONTENT
$mailer->close();
&rightsign;[/code]<θθθ>192|
TAG:
