Replication Mysql

Prérequis :

Il faut installer le package percona-xtrabackup, il faut un espace disque disponible supérieur ou égal a l'espace disque utilisé par le contenu du répertoire /mysql.

/usr/local/bin/mysqlchk.sh

Hypothèse :

le serveur mysql A est OK ; le serveur mysql B a la réplication cassée.

Plan :

  1. On s'assure que B ne port plus de VIPs et ne reçoit plus de requêtes
  2. on stop le slave sur A et B
  3. sur A on reset le master
  4. sur A on effectue un backup via xtrabackup
  5. on transfert le backup de A vers B
  6. sur B on arrête mysql, on déplace (ou supprime) l'ancien répertoire de donnée mysql, on crée un répertoire mysql vide
  7. sur B on restore le backup et on restart mysql
  8. Alternative au point 7
  9. sur B on remet en place la réplication, on attent que B soit synchrone.
  10. sur B on reset le master
  11. sur A on remet en place la réplication.

Pas à pas :

  1. On s'assure que B ne port plus de VIPs et ne reçoit plus de requêtes (ATTENTION à HAPROXY et au script pour sortie du pool) :

    sur A :

     /usr/share/heartbeat/hb_takeover all
     /etc/init.d/mon stop

    Sur B :

     /etc/init.d/heartbeat stop
     /etc/init.d/mon stop
  2. on stop le slave sur A et B :

     mysql> stop slave;
  3. sur A on reset le master :

     mysql A> reset master;
     mysql A> quit;
  4. sur A on effectue un backup via xtrabackup :

     bash A# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/ 2>&1 |tee /path/to/logfile
    
     bash A# innobackupex --apply-log /path/to/BACKUP-DIR/TIMESTAMP_DIR/ 2>&1 | tee /path/to/logfile2

ATTENTION : Il peut arriver d'avoir cette erreur lors du lancement du backup :

InnoDB: Error number 24 means 'Too many open files'

Xtrabackup va ouvrir chaque table et on peut donc vite atteindre le ulimit généralement fixé à 1024 dans Mysql. On peut donc augmenter le ulimit pour le shell courant le temps du backup via la commande :

ulimit -n 65535
  1. on transfert le backup de A vers B

  2. sur B on arrête mysql, on déplace (ou supprime) l'ancien répertoire de donnée mysql, on crée un répertoire mysql vide :

     bash B# /etc/init.d/mysql
     bash B# mv /path/to/mysql /path/to/mysql.old
     bash B# mkdir /path/to/mysql
  3. sur B on restore le backup et on restart mysql :

     bash B#  innobackupex --copy-back /path/to/BACKUP-DIR/TIMESTAMP_DIR
     bash B# chown -R mysql:mysql /path/to/mysql
     bash B# /etc/init.d/mysql start
  4. Alternative au point 7 :

En cas de manque de place/temps, il est possible d'utiliser un autre commande à la place pour déplacer les fichiers et non les copier :

    bash B#  innobackupex --move-back /path/to/BACKUP-DIR/TIMESTAMP_DIR
    bash B# chown -R mysql:mysql /space/mysql
    bash B# /etc/init.d/mysql start

https://www.percona.com/doc/percona-xtrabackup/2.3/innobackupex/how_innobackupex_works.html#restoring-a-backup

  1. sur B on remet en place la réplication, on attend que B soit synchrone :

     bash B# cat /path/to/BACKUP-DIR/TIMESTAMP_DIR/xtrabackup_binlog_info

Cela donne les infos pour le nom du fichier log et la position

    mysql B> change master to master_host='xx.xx.xx.xx', master_user='yyyy', master_password='zzzz', master_log_file='master-log-bin.xxxxxx', master_log_pos=yyyyyy;
    mysql B> start slave;
    mysql B> show slave status\G
  1. sur B on reset le master (une fois que B est synchrone avec A) :

    mysql B> reset master; 
    mysql B> show master status\G
  2. sur A on remet en place la replication :

    mysql A> change master to ....
    mysql A> start slave
Last updated on 7th Feb 2018