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 :
- On s'assure que B ne port plus de VIPs et ne reçoit plus de requêtes
- on stop le slave sur A et B
- sur A on reset le master
- sur A on effectue un backup via xtrabackup
- on transfert le backup de A vers B
- 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
- sur B on restore le backup et on restart mysql
- Alternative au point 7
- sur B on remet en place la réplication, on attent que B soit synchrone.
- sur B on reset le master
- sur A on remet en place la réplication.
Pas à pas :
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
on stop le slave sur A et B :
mysql> stop slave;
sur A on reset le master :
mysql A> reset master; mysql A> quit;
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
on transfert le backup de A vers B
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
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
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
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
sur B on reset le master (une fois que B est synchrone avec A) :
mysql B> reset master; mysql B> show master status\G
sur A on remet en place la replication :
mysql A> change master to .... mysql A> start slave