Come replicare un database MySQL tra 2 server

Può capitare, come è successo a me recentemente, di dover replicare un database MySQL tra due server, escludendo però tra gli schema quelli utilizzati internamente dal servizio, cioè i due che si chiamano ‘mysql’ e ‘information_schema’, oltre che al tipico ‘test’, nel caso in cui le versioni del servizio non fossero equivalenti o per evitare di sovrascrivere informazioni già presenti sul database di destinazione. Vediamo una semplice procedura per eseguire la replica.

Condizioni necessarie per poter eseguire questa operazione sono:

  • poter accedere ad entrambi i server dal pc su cui verrà lanciata la procedura (potrebbe essere anche uno dei due server stessi, se sono visibili tra di loro);
    se si accede direttamente dal  proprio pc, assicurarsi di poter utilizzare i binari mysql, mysqladmin e mysqldump;
  • avere accesso ai servizi MySQL con un utente con permessi sufficienti.

Nella mia situazione si trattava di due macchine presenti in ufficio, di cui avevo accesso completo come utente root, quindi è stato tutto molto più facile. Ecco lo script da lanciare (i valori relativi a user, password e host sono chiaramente da adattare al vostro caso) per ambiente linux, ma facilmente replicabile per un windows:

#!/bin/bash# mysql source server
MSUSER=”user”
MSPASS=”pwd”
MSHOST=”SRC_SERVER_IP”# mysql destination server
MDUSER=”user”
MDPASS=”pwd”
MDHOST=”DEST_SERVER_IP”# get all database listing except mysql and information_schema
DBS=”$(mysql -u $MSUSER -p$MSPASS -h $MSHOST -Bse ‘show databases’ | GREP -v mysql | GREP -v information_schema | GREP -v test)”# start to dump database one by one
for db in $DBS
doecho Creating new database $db…
mysqladmin -u $MDUSER -p$MDPASS -h $MDHOST create $db
echo Transfering database $db…
mysqldump –complete-insert -u $MSUSER -p$MSPASS -h $MSHOST $db | mysql -u $MDUSER -p$MDPASS -h $MDHOST $dbdone
 

La prima operazione eseguita sul database sorgente consente di ricavare il nome di tutti gli schema presenti, escludendo come detto mysql, information_schema e test. Si itera poi sulla lista cosi ottenuta per eseguire in serie le operazioni di creazione del nuovo schema sul server destinazione, dump del database sorgente ed esecuzione dei comandi sql del dump sul database destinatario. Un paio di osservazioni sul risultato della copia:

  • l’esclusione dello schema mysql implica anche l’esclusione della copia degli utenti e dei permessi associati, che vanno quindi ripristinati successivamente sul database destinatario;
  • i nuovi database creati hanno charset e collation di default, che potrebbero non rispecchiare quelli sorgenti, ed anche in questo caso potrebbe essere necessaria una conversione successiva.

Vi segnalo anche che il progetto MySQL Workbench prevede alcuni script da riga di comando (per ambienti Windows, Linux e Mac) molto interessanti per interagire con server remoti che potrebbero essere utilizzati allo scopo (vedere ad esempio mysqldbcopy).

Lascia un commento