Guest User

Untitled

a guest
Oct 7th, 2018
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Getopt::Long;
  5. use DBI;
  6.  
  7. my $options = { 'master' => 'master.host', 'slave' => 'slave.host', 'crit' => 100000, 'warn' => 10000 , 'dbuser' => 'root', 'dbpass' => 'bla', "masterport" => "", 'slaveport' => ''};
  8. GetOptions($options, "master=s", "slave=s", "dbuser=s", "dbpass=s", "crit=i", "warn=i", "help");
  9. my $max_binlog;
  10.  
  11. if (defined $options->{'help'}) {
  12. print <<FOO;
  13. $0: check replication between mysql databases
  14.  
  15. check_replication.pl [ --master <host> ] [ --slave <host> ]
  16. [ --crit <positions> ] [ --warn <positions> ] [ --dbuser <user> ]
  17. [ --dbpass <pass> ]
  18.  
  19. --master <host> - MySQL instance running as a master server
  20. --slave <host> - MySQL instance running as a slave server
  21. --masterport <port> - port number MySQL master is listening on
  22. --slaveport <port> - port number MySQL slave is listening on
  23. --crit <positions> - Number of binlog positions for critical state
  24. --warn <positions> - Number of binlog positions for warning state
  25. --dbuser <user> - Username with File and Process privs to check status
  26. --dbpass <pass> - Password for above user
  27. --help - This help page
  28.  
  29. The user that is testing must be the same on all instances, eg:
  30. GRANT File, Process on *.* TO repl_test\@192.168.0.% IDENTIFIED BY <pass>
  31.  
  32. Note: Any mysqldump tables (for backups) may lock large tables for a long
  33. time. If you dump from your slave for this, then your master will gallop
  34. away from your slave, and the difference will become large. The trick is to
  35. set crit above this differnce and warn below.
  36.  
  37. (c) 2004 Fotango. James Bromberger <jbromberger\@fotango.com>.
  38. (c) 2006 Some changes by Robert Klikics <robert\@klikics.de>.
  39. (c) 2012 Small changes by Maxime Augier <max\@xolus.net>.
  40.  
  41. FOO
  42. exit;
  43. }
  44.  
  45. sub get_status {
  46. my $host = shift;
  47. my $port = shift;
  48. my $role = shift;
  49. require Carp;
  50. Carp::cluck "host" if !defined $host;
  51. Carp::cluck "port" if !defined $port;
  52. Carp::cluck "dbuser" if !defined $options->{'dbuser'};
  53. Carp::cluck "dbpass" if !defined $options->{'dbpass'};
  54. my $dbh = DBI->connect("DBI:mysql:host=$host;port=$port", $options->{'dbuser'}, $options->{'dbpass'});
  55. if (not $dbh) {
  56. print "UNKNOWN: cannot connect to $host";
  57. exit 3;
  58. }
  59.  
  60. if (lc ($role) eq 'master') {
  61. my $sql1 = "show variables like 'max_binlog_size'";
  62. my $sth1 = $dbh->prepare($sql1);
  63. my $res1 = $sth1->execute;
  64. my $ref1 = $sth1->fetchrow_hashref;
  65. $max_binlog = $ref1->{'Value'};
  66. }
  67. my $sql = sprintf "SHOW %s STATUS", $role;
  68. my $sth = $dbh->prepare($sql);
  69. my $res = $sth->execute;
  70. if (not $res) {
  71. die "No results";
  72. }
  73. my $ref = $sth->fetchrow_hashref;
  74. $sth->finish;
  75. #print "$host:\n";
  76. #print join (', ', map { sprintf " %s: %s", $_, $ref->{$_} } keys %{$ref}) . "\n";
  77. $dbh->disconnect;
  78. return $ref;
  79. }
  80.  
  81. sub compare_status {
  82. my ($a, $b) = @_;
  83. my ($master, $slave);
  84. if (defined($a->{'File'})) {
  85. $master = $a;
  86. $slave = $b;
  87. } elsif (defined($b->{'File'})) {
  88. $master = $b;
  89. $slave = $a;
  90. }
  91. $master->{'File_No'} = $1 if ($master->{'File'} =~ /(\d+)$/);
  92. $slave->{'File_No'} = $1 if ($slave->{'Relay_Master_Log_File'} =~ /(\d+)$/);
  93.  
  94.  
  95. my $diff = ($master->{'File_No'} - $slave->{'File_No'}) * $max_binlog;
  96. #printf "Master: %d Slave: %d\n", $master->{'Position'}, $slave->{'Exec_Master_Log_Pos'};
  97. $diff+= $master->{'Position'} - $slave->{'Exec_master_log_pos'};
  98. my $state = sprintf "Master: %d/%d Slave: %d/%d Diff: %d/%d\n", $master->{'File_No'}, $master->{'Position'}, $slave->{'File_No'}, $slave->{'Exec_master_log_pos'}, ($diff/$max_binlog), ($diff % $max_binlog);
  99. if ($diff >= $options->{'crit'}) {
  100. print "CRITICAL: $state";
  101. exit 2;
  102. } elsif ($diff >= $options->{'warn'}) {
  103. print "WARN: $state";
  104. exit 1;
  105. }
  106. print "OK: $state";
  107. exit 0;
  108. }
  109.  
  110. compare_status(get_status($options->{'slave'}, $options->{'slaveport'}, 'slave'), get_status($options->{'master'}, $options->{'masterport'}, 'master'));
Add Comment
Please, Sign In to add comment