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|

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

关于作者