Dumper d’un serveur à l’autre

Voici la marche à suivre pour copier à chaud une base de données d’un serveur (de production généralement), à un autre (de réplication, de développement, …) directement, sans passer par des fichiers intermédiaires.

Nous allons créer un fichier batch pour cela. C’est rapide et ça dépanne. Vous pourrez par la suite vous créer un script un peu plus élaboré. Les besoins du moment m’ont demandé de le faire pour Windows, mais il sera très aisé de transcrire cela en script unix.

Préparer les variables

Voici comment cela va se passer. Le serveur qui va envoyer son dump (appelons-le A) va sélectionner les lignes dans les tables, et tenter de les envoyer au serveur de destination (appelons-le B). Tant que le serveur de destination est occupé avec la connexion SQL en cours, A doit attendre. La variable net_write_timeout définit un terme à cette attente. Si ce terme est dépassé, la connexion est rejetée, et autant dire adieu à un dump non corrompu.

En règle générale, tout devrait bien se passer, mais pour des grosses tables, il faut savoir que le serveur B effectue, une fois le dump terminé, un REPAIR sur cette table, et oblige le serveur A a attendre, attendre… Dans mon cas, il se peut que l’attente soit de l’ordre de 20 minutes (table de 3Go environ). Les 60 secondes de timeout par défaut sont sont largement dépassées. Dans le cas ou vous n’auriez pas configuré un temps assez long, voici ce qui pourrait vous arriver en plein dump :

mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table...

La table énoncée est en fait celle d’après qui a posé problème dans la liste des tables à dumper. Le serveur A a attendu trop longtemps que le serveur B ait finit son REPAIR sur la table n-1.

Lancer le dump en se connectant sur un serveur A et le transférer sur le serveur B

Voici le petit script .BAT à lancer, et les explications qui suivent :

@echo off
REM pb de timeout : select-insert avec option quick se passe sans pb 
REM      (send/write rapides). Puis sur sDest effectue REPAIR TABLE. 
REM      Pdt ce temps sExp doit attendre (bloque sur writing to net)
REM i : additional information (a tester)
REM e : much faster insert syntax
REM q : quick : ne bufferise pas l'ensemble des lignes avant de les 
REM      envoyer d'un coup.Sans q les requetes peuvent durer plus de 
REM      30s. Pb de timeout sur le net_read_timeout cette fois. 
REM      (show variables like '%timeout%' )
REM F : flush : flush Logs
REM R : routines : transfère les procédures et fonctions stockées
REM C : Compresse
REM verbose : affiche les infos du traitement en cours dans stderr
echo Dump de la base 10.1.0.1 sur localhost en cours ...
REM On redéfinit la limite write_timeout (cf commentaire) (Global : 
REM      affecte pour tout le temps, mais on va créer 2 sessions 
REM      avec cette façon de faire, donc obligatoire) (!= SESSION).
echo SET GLOBAL net_write_timeout=10000 | mysql -uXXXXX -pXXXXX -hXXXXX
mysqldump -i -e -q -F -R -C --all-databases --add-drop-table \
    --verbose -hXXXXX -uXXXXX -pXXXXX | mysql -hXXXXX -uXXXXX -pXXXXX
echo Dump terminé !
pause

Vous aurez bien sûr remplacé les sections XXXX par vos identifiants/mot de passe.

@echo off
Pour ceux qui ne maitrisent pas le batch, cela permet de désactiver l’entrée standard. Sans @echo off, si vous faîtes echo coucou, vous aurez à l’écran c:>echo coucou puis coucou. Avec @echo off, vous n’avez que coucou.
echo SET GLOBAL net_write_timeout=10000 | mysql -uXXXXX -pXXXXX -hXXXXX
On envoie un script à MySQL par l’intermédiaire du tube. A droite la destination, la session MySQL authentifiée. A gauche, on redéfinit de façon globale (c’est à dire une fois pour toutes) la variable net_write_timeout à 10000 secondes.
mysqldump -i -e -q -F -R -C --all-databases --add-drop-table --verbose -hXXXXX -uXXXXX -pXXXXX | mysql -hXXXXX -uXXXXX -pXXXXX
Enfin, on lance le dump. On lance le dump sur le serveur de prod avec les options qui vont bien (expliquées en remarque dans le bat), et on envoie le tout sur le serveur de réplication/test/… par la commande d’identification via un tube (pipe, alt-gr+6)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *