Replicare un database MySQL

n questa breve guida vediamo come creare una replica di un database MySQL su un server.

Dopo che si è creata la replica, gli aggiornamenti effettuati sul server Master saranno replicati sul server Slave.

Una replica non è un sistema di backup, si tratta però di una configurazione che può essere utile nel caso il server Master smetta di funzionare.
In una situazione del genere, basta infatti connettere l’aplicazione al server slave su cui sono presenti gli stessi dati.

Il presupposto della guida è che MySQL sia già installato sui due server.

Il funzionamento è piuttosto semplice, tutte le query eseguite sul server Master sono archiviate in un file di log.
Il server Slave legge questo file di log e ripete le query che modificano i dati sul proprio database.

Configurare il server Master
Sul server Master creiamo un utente user_slave che sarà utilizzato dal server Slave per connettersi.
mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘user_slave’@’%’ IDENTIFIED BY ‘password_slave’;
mysql>FLUSH PRIVILEGES;

A questo punto creiamo una cartella in cui saranno archiviati i log
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql

L’operazione successiva consiste nel modificare il file my.cnf in modo da specificare che il server è un server Master e quale database deve scrivere i log.
In questo esempio il database che viene replicato è test_db
vim /etc/my.cnf

[mysqld]
[ . . . .]
log-bin = /var/log/mysql/text_db-bin.log
binlog-do-db = test_db
server-id = 1
[ . . . .]

A questo punto è possibile riavviare il server mysql
service mysqld restart

L’operazione successiva consiste nell’inserire un READ LOCK nel database in modo che questo non possa essere modificato mentre viene eseguito il backup.
mysql> USE test_db
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

+——————–+———-+———————-+——————+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+——————–+———-+———————-+——————+| test_db-bin.000001 | 106 | test_db | |+——————–+———-+———————-+——————+

Il comando FLUSH TABLES WITH READ LOCK chiude tutte le tabelle fino a quando queste non vengono aperte eseguendo il comando UNLOCK TABLES.

Si può quindi eseguire il backup senza chiudere la shell Mysql precedente in modo che non venga eliminato il lock.
mysqldump -u root -p test_db > test_db.sql

e copiare il file sul server Slave
scp text_db.sql root@slave-server:

A questo punto è possibile eliminare il lock e chiudere la shell MySql
mysql> UNLOCK TABLES;
mysql> QUIT;

Configurare il server Slave
Come prima cosa modifichiamo il file my.cnf in modo da specificare che il server è Slave.

[mysqld]
[ . . . ]
server-id = 2
master-host = 10.42.43.1
master-user = user_slave
master-password = password_slave
replicate-do-db = test_db
master-connect-retry = 60

e poi riavviamo il server
service mysqld restart

A questo punto creiamo il database e importiamo il backup eseguito sul master.
mysql> STOP SLAVE;
mysql> CREATE DATABASE test_db;
mysql> quit;
[slave-server]$ mysql -u root -p test_db < test_db.sql

Per configurare il server come slave del master su cui abbiamo operato in precedenza è necessario eseguire il seguente comando.
mysql> CHANGE MASTER TO MASTER_HOST=’10.42.43.1′, MASTER_USER=’user_slave’, MASTER_PASSWORD=’password_slave’, MASTER_LOG_FILE=’test_db-bin.000001′, MASTER_LOG_POS=106;

i valori di MASTER_LOG_FILE e MASTER_LOG_POS sono quelli che abbiamo visto in precedenza configurando il server Master.

A questo punto è possibile avviare il server Slave
mysql> START SLAVE;

La configurazione è terminata e eseguendo il comando
mysql> SHOW SLAVE STATUS
dovrebbe essere possibile visualizzare i vari dettagli della configurazione.