Outils pour utilisateurs

Outils du site


linux:adminsys:check_replication_mysql

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
linux:adminsys:check_replication_mysql [10/12/2009 06:47] – aj test var vides daniellinux:adminsys:check_replication_mysql [11/02/2010 14:28] (Version actuelle) – apostrophes virées dans commentaires daniel
Ligne 2: Ligne 2:
 Ce script vérifie les positions master et slave de deux noeuds mysql en réplication maitre-maitre. Ce script vérifie les positions master et slave de deux noeuds mysql en réplication maitre-maitre.
 <code bash> <code bash>
-#!/bin/bash 
- 
 # Ce script loggue les positions sur le master local, le master distant et le slave # Ce script loggue les positions sur le master local, le master distant et le slave
 # Avec en colonnes # Avec en colonnes
 # 1 timestamp  # 1 timestamp 
-# 2 master_log_on_remote_master +# 2 remote_master_master_log_file 
-# 3 master_log-pos_on_remote_master +# 3 remote_master_master_log_pos 
-# 4 master_log_on_local_slave  +# 4 local_slave_master_log_file 
-# 5 master_log-pos_on_local_slave  +# 5 local_slave_master_log_pos 
-# 6 master_log_on_local_master        +# 6 local_master_master_log_file 
-# 7 master_log-pos_on_local_master +# 7 local_master_master_log_pos 
-# 8 master_log_on_remote_slave  +# 8 remote_slave_master_log_file 
-# 9 master_log-pos_on_remote_slave +# 9 remote_slave_master_log_pos 
 # 10 date en plus clair # 10 date en plus clair
 +# 11 local_delay
 +# 12 remote_delay
  
 +# le user mysql qui réplique doit avoir les droits REPLICATION CLIENT, REPLICATION SLAVE  et PROCESS
 + 
 LOG=/var/log/mysql/replication.log LOG=/var/log/mysql/replication.log
 ERRLOG=/var/log/mysql/replication.err ERRLOG=/var/log/mysql/replication.err
 +LOCK=/var/lib/mysql/replication_pb.lock
 TMP=/tmp/$(basename $0).tmp TMP=/tmp/$(basename $0).tmp
-DEST='mail@domaine.tld'+DEBUG=0
  
 # On regarde si on est sql1 ou sql2, à adapter suivant vos hostnames # On regarde si on est sql1 ou sql2, à adapter suivant vos hostnames
Ligne 34: Ligne 37:
 user=$(sed -ne '5p'</var/lib/mysql/master.info) user=$(sed -ne '5p'</var/lib/mysql/master.info)
 pass=$(sed -ne '6p'</var/lib/mysql/master.info) pass=$(sed -ne '6p'</var/lib/mysql/master.info)
-# marche pas si le $user n'que les droits de réplication slave, il faut client + 
-remote_master=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show master status'|awk 'END {print $1 " " $2}') +init_vars() { 
-# sinon on passe par ssh, mais root doit avoir une clé +  # marche pas si le $user a seulement les droits de réplication slave, il faut client 
-#remote_master=$(/usr/bin/ssh $remote_host '/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e "show master status"'|awk 'END {print $1 " " $2}') +  # (sinon passer par ssh mais celui qui lance ce script doit avoir une clé pour lire /etc/mysql/debian.cnf sur le remote host) 
-local_master=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show master status'|awk 'END {print $1 " " $2}') + 
-local_slave=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show slave status' |awk -F '\t' 'END {print $" " $7}') +  # on rapproche le plus possible les mesures master/slave 
-# idem +  remote_master_status=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show master status'
-remote_slave=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show slave status'|awk -F '\t' 'END {print $" " $7}') +  local_slave_status=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show slave status\G') 
-#remote_slave=$(/usr/bin/ssh $remote_host '/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e "show slave status"'|awk -F '\t' 'END {print $" " $7}')+  local_master_status=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show master status'
 +  remote_slave_status=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show slave status\G'
 + 
 +  # et on extrait les valeurs qui nous intéressent 
 +  remote_master_master_log_file=$(echo -e "$remote_master_status"|awk 'END {print $1}'
 +  remote_master_master_log_file_index=$(expr "$remote_master_master_log_file" : '[^\.]\+\.0*\([1-9]\+\)'
 +  remote_master_master_log_pos=$(echo -e "$remote_master_status"|awk 'END {print $2}') 
 +  local_slave_master_log_file=$(echo -e "$local_slave_status"|awk '/ Master_Log_File/ {print $2}') 
 +  local_slave_master_log_file_index=$(expr "local_slave_master_log_file" : '[^\.]\+\.0*\([1-9]\+\)') 
 +  local_slave_master_log_pos=$(echo -e "$local_slave_status"|awk '/Read_Master_Log_Pos{print $2}') 
 +  local_slave_delay=$(echo -e "$local_slave_status"|awk '/Seconds_Behind_Master/ {print $2}'
 +  local_slave_error=$(echo -e "$local_slave_status"|awk '/Last_Error/ {print $2}'
 + 
 +  local_master_master_log_file=$(echo -e "$local_master_status"|awk 'END {print $1}'
 +  local_master_master_log_file_index=$(expr "$local_master_master_log_file" : '[^\.]\+\.0*\([1-9]\+\)'
 +  local_master_master_log_pos=$(echo -e "$local_master_status"|awk 'END {print $2}') 
 +  remote_slave_master_log_file=$(echo -e "$remote_slave_status"|awk '/ Master_Log_File/ {print $2}'    
 +  remote_slave_master_log_file_index=$(expr "$remote_slave_master_log_file"'[^\.]\+\.0*\([1-9]\+\)'
 +  remote_slave_master_log_pos=$(echo -e "$remote_slave_status"|awk '/Read_Master_Log_Pos{print $2}')  
 +  remote_slave_delay=$(echo -e "$remote_slave_status"|awk '/Seconds_Behind_Master/ {print $2}') 
 +  remote_slave_error=$(echo -e "$remote_slave_status"|awk '/Last_Error/ {print $2}') 
 +
 if [ $DEBUG -gt 0 ]; then if [ $DEBUG -gt 0 ]; then
-  echo "remote_master $remote_master+  init_vars 
-  echo "local_master $local_master+  echo "remote_master et local_slave" 
-  echo "local_slave $local_slave+  echo -e "remote_master_master_log_file\t$remote_master_master_log_file
-  echo "remote_slave $remote_slave" +  echo -e "remote_master_master_log_pos\t$remote_master_master_log_pos
 +  echo -e "local_slave_master_log_file\t$local_slave_master_log_file
 +  echo -e "local_slave_master_log_pos\t$local_slave_master_log_pos" 
 +  echo "local_slave_delay $local_slave_delay" 
 +  echo "local_slave_error $local_slave_error" 
 +  echo -e "\nlocal_master et remote_slave
 +  echo -e "local_master_master_log_file\t$local_master_master_log_file" 
 +  echo -e "local_master_master_log_pos\t$local_master_master_log_pos" 
 +  echo -e "remote_slave_master_log_file\t$remote_slave_master_log_file" 
 +  echo -e "remote_slave_master_log_pos\t$remote_slave_master_log_pos" 
 +  echo "remote_slave_delay $remote_slave_delay" 
 +  echo "remote_slave_error $remote_slave_error"
   echo "Fin debug, on sort"   echo "Fin debug, on sort"
   exit   exit
 fi fi
  
-echo "$TS $remote_master $local_slave $local_master $remote_slave $DATE" >> $LOG +init_vars 
-  +echo "$TS $remote_master_master_log_file $remote_master_master_log_pos $local_slave_master_log_file $local_slave_master_log_pos $local_master_master_log_file $local_master_master_log_pos $remote_slave_master_log_file $remote_slave_master_log_pos $DATE $local_delay $remote_delay>> $LOG
-# check index du fichier de log +
-remote_master_log_index=$(expr "$remote_master" : '[^\.]\+\.0*\([1-9]\+\)'+
-local_slave_log_index=$(expr "$local_slave" : '[^\.]\+\.0*\([1-9]\+\)'+
-local_master_log_index=$(expr "$local_master" : '[^\.]\+\.0*\([1-9]\+\)'+
-remote_slave_log_index=$(expr "$remote_slave" : '[^\.]\+\.0*\([1-9]\+\)'+
-# check positions +
-remote_master_log_pos=$(expr "$remote_master" : '[^ ]* \(.*\)'+
-local_slave_log_pos=$(expr "$local_slave" : '[^ ]* \(.*\)'+
-local_master_log_pos=$(expr "$local_master" : '[^ ]* \(.*\)'+
-remote_slave_log_pos=$(expr "$remote_slave" : '[^ ]* \(.*\)'+
- +
 >$TMP >$TMP
  
-if [ -z "$remote_master_log_index" -o -z "$remote_master_log_pos" ]; then +# Check souci qcq 
-  echo "Problème pour se connecter au master mysql distant de $remote_host ($remote_master)" >> $TMP +if [ -z "$remote_master_master_log_file" -o -z "$remote_master_master_log_pos" ] || \ 
-elif [ -z "$local_slave_log_index" -o -z "$local_slave_log_pos" ]; then +   [ -z "$local_slave_master_log_file" -o -z "$local_slave_master_log_pos" ] || \ 
-  echo "Problème pour se connecter au slave mysql local de  $local_host ($local_slave)" >> $TMP +   [ -z "$local_master_master_log_file" -o -z "$local_master_master_log_pos" ] || \ 
-elif [ $remote_master_log_index -gt $local_slave_log_index ]; then +   [ -z "$remote_slave_master_log_file" -o -z "$remote_slave_master_log_pos" ] || \ 
-  echo "Le fichier de log est plus recent sur le master $remote_host ($remote_master) que sur le slave $local_host ($local_slave)" >> $TMP +   [ -z "$local_slave_delay" -o -z "$remote_slave_delay" ] || \ 
-  echo "On restart le slave de $local_slave" >> $TMP +   [ "$remote_master_master_log_file" != "$local_slave_master_log_file" ] || \ 
-  /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start slave;' >> $TMP +   [ "$local_master_master_log_file" != "$remote_slave_master_log_file" ] || \ 
-elif [ $remote_master_log_pos -gt $local_slave_log_pos ]; then +   [ "$remote_master_master_log_pos" -gt "$local_slave_master_log_pos" ] || [ "$local_slave_delay" -gt 1 ] || \ 
-  echo "Le slave de $local_host est en retard : +   [ "$local_master_master_log_pos" -gt "$remote_slave_master_log_pos" ] || [ "$remote_slave_delay" -gt 1 ] 
-    master $remote_host : $remote_master +then 
-    slave  $local_host : $local_slave" >> $TMP +  # 2e chance 
-  echo "On restart le slave de $local_slave" >> $TMP  +  sleep 5 
-  /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start slave;' >> $TMP+  init_vars 
 +fi 
 + 
 +# connexion distante 
 +if [ -z "$remote_master_master_log_file" -o -z "$remote_master_master_log_pos" ]; then 
 +  echo "Problème pour se connecter au master mysql distant de $remote_host" >> $TMP 
 +# connexion locale 
 +elif [ -z "$local_slave_master_log_file" -o -z "$local_slave_master_log_pos" ]; then 
 +  echo "Problème pour se connecter au slave mysql local de  $local_host" >> $TMP 
 +# fichier slave local trop vieux 
 +elif [ "$remote_master_master_log_file" != "$local_slave_master_log_file" ]; then 
 +  echo "Le fichier de log est différent sur le master $remote_host ($remote_master_master_log_file) que sur le slave $local_host ($local_slave_master_log_file)" >> $TMP 
 +  echo -e "Sur le slave de $local_host on a l'erreur :\n$local_slave_error" >> $TMP 
 +  echo "On restart le slave de $local_host" >> $TMP 
 +  /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start slave;' >> $TMP 2>&
 +# position slave local en retard 
 +elif [ "$remote_master_master_log_pos" -gt "$local_slave_master_log_pos" ] || [ "$local_slave_delay" -gt 1 ]; then 
 +  echo "Le slave de $local_host est en retard de ${local_slave_delay}s (slave $local_slave_master_log_pos vs $remote_master_master_log_pos pour le master distant) 
 +    master $remote_host : $remote_master_master_log_file $remote_master_master_log_pos 
 +    slave  $local_host : $local_slave_master_log_file $local_slave_master_log_pos" >> $TMP 
 +  echo -e "\nSur le slave de $local_host on a l'erreur :\n$local_error" >> $TMP 
 +  echo "\nOn restart le slave de $local_host" >> $TMP  
 +  /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start slave;' >> $TMP 2>&1
 fi fi
  
-if [ -z "$local_master_log_index" -o -z "$local_master_log_pos" ]; then +# on recommence avec le slave distant 
-  echo "Problème pour se connecter au master mysql local de $local_host ($local_master)" >> $TMP +if [ -z "$local_master_master_log_file" -o -z "$local_master_master_log_pos" ]; then 
-elif [ -z "$remote_slave_log_index" -o -z "$remote_slave_log_pos" ]; then +  echo "Problème pour se connecter au master mysql local de $local_host" >> $TMP 
-  echo "Problème pour se connecter au slave mysql distant de  $remote_host ($remote_slave)" >> $TMP +elif [ -z "$remote_slave_master_log_file" -o -z "$remote_slave_master_log_pos" ]; then 
-elif [ $local_master_log_index -gt $remote_slave_log_index ]; then +  echo "Problème pour se connecter au slave mysql distant de  $remote_host" >> $TMP 
-  echo "Le fichier de log est plus recent sur le master $local_host ($local_master) que sur le slave de $remote_host ($remote_slave)" >> $TMP +elif [ "$local_master_master_log_file" != "$remote_slave_master_log_file" ]; then 
-  echo "On restart le slave de $remote_slave" >> $TMP+  echo "Le fichier de log est différent sur le master $local_host ($local_master_master_log_file) que sur le slave de $remote_host ($remote_slave_master_log_file)" >> $TMP 
 +  echo -e "Sur le slave de $remote_host on a l'erreur :\n$remote_slave_error" >> $TMP 
 +  echo "On restart le slave de $remote_host" >> $TMP
   /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start slave;' >> $TMP   /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start slave;' >> $TMP
-elif [ $local_master_log_pos -gt $remote_slave_log_pos ]; then +elif [ "$local_master_master_log_pos" -gt "$remote_slave_master_log_pos" ] || [ "$remote_slave_delay" -gt 1 ]; then 
-  echo "Le slave de $remote_host est en retard : +  echo "Le slave de $remote_host est en retard de ${$remote_slave_delay}s (slave $remote_slave_master_log_pos vs $local_master_master_log_pos pour le master local) 
-    master $local_host : $local_master +    master $local_host : $local_master_master_log_file $local_master_master_log_pos 
-    slave  $remote_host : $remote_slave" >> $TMP +    slave  $remote_host : $remote_slave_master_log_file $remote_slave_master_log_pos" >> $TMP 
-  echo "On restart le slave de $remote_slave" >> $TMP+  echo -e "Sur le slave de $remote_host on a l'erreur :\n$remote_slave_error" >> $TMP 
 +  echo "On restart le slave de $remote_host" >> $TMP
   /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start slave;' >> $TMP   /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start slave;' >> $TMP
 fi fi
    
 +# et mail en cas de pb
 if [ $(wc -l <$TMP) -gt 0 ]; then if [ $(wc -l <$TMP) -gt 0 ]; then
   # on ajoute le check des Slave_running ($user doit avoir les droits PROCESS)   # on ajoute le check des Slave_running ($user doit avoir les droits PROCESS)
-  echo "Sur $local_host on a $(/usr/bin/mysqladmin -u$user -p$pass extended-status|grep Slave_running)" >> $TMP+  echo -e "\nSur $local_host on a $(/usr/bin/mysqladmin -u$user -p$pass extended-status|grep Slave_running)" >> $TMP
   echo "Sur $remote_host on a $(/usr/bin/mysqladmin -u$user -p$pass -h$remote_host extended-status|grep Slave_running)" >> $TMP   echo "Sur $remote_host on a $(/usr/bin/mysqladmin -u$user -p$pass -h$remote_host extended-status|grep Slave_running)" >> $TMP
-  echo "Fin du script de check ($DATE)" >> $TMP+  echo -e "\nFin du script de check ($DATE)" >> $TMP
   # log   # log
   cat $TMP >> $ERRLOG   cat $TMP >> $ERRLOG
   # on envoie un mail   # on envoie un mail
-  mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql cassee" $DEST < $TMP+  mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql cassee ($0 sur $HOSTNAME)" $DEST < $TMP
   # et on pose un lock   # et on pose un lock
   cat $TMP >> $LOCK   cat $TMP >> $LOCK
 else else
   [ -f $LOCK ] && \   [ -f $LOCK ] && \
-    echo -e "\nDATE : 1re constatation de la résolution du problème, synchro mysql OK" >> $LOCK && \ +    echo -e "\n$DATE : 1re constatation de la résolution du problème, synchro mysql OK" >> $LOCK && \ 
-    date|mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql OK" $DEST && \+    mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql OK ($0 sur $HOSTNAME)" $DEST < $LOCK && \
     rm -f $LOCK     rm -f $LOCK
 fi fi
 </code> </code>
linux/adminsys/check_replication_mysql.1260424054.txt.gz · Dernière modification : 10/12/2009 06:47 de daniel