MySQL Replication · 4 min read · Nov 20, 2025

Installazione di un cluster Web, Email e MySQL su Debian 8.4 Jessie con ISPConfig 3.1 - Pagina 2

5. Replicazione MySQL Master-Master

5.1 Preparare Server1

Accedi a MySQL e crea un account specifico per la replicazione in MySQL. Utilizzo un utente separato per la replicazione per ridurre al minimo la possibilità di compromissione di altri account (nome utente e password sono memorizzati in testo chiaro nel file o nella tabella del repository delle informazioni master):

CREATE USER 'slaveuser2'@'server2.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'192.168.0.106' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'2001:db8::2' IDENTIFIED BY 'slave_user_password';

e concedi il privilegio REPLICATION SLAVE:

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'server2.example.tld';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'192.168.0.106';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'2001:db8::2';  
QUIT;

Apporta alcune modifiche per la replicazione alla tua MySQL-Config:

vi /etc/mysql/my.cnf

Cerca la sezione che inizia con [mysqld], e inserisci le seguenti opzioni (commentando tutte le opzioni in conflitto esistenti):

[...]  
[mysqld]  
server-id                = 1  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 1  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.index  
slave_skip_errors        = 1007,1008,1050, 1396  
bind-address             = ::

e riavvia MySQL successivamente:

service mysql restart

Semplicemente ignoro alcuni errori slave. Ho spiegato questo nel mio blog:

  • 1007 = Impossibile creare il database ‘%s’; il database esiste
  • 1008 = Impossibile eliminare il database ‘%s’; il database non esiste
  • 1050 = La tabella ‘%s’ esiste già
  • 1396 = Operazione %s non riuscita per %s - Impossibile creare l’utente

puoi trovare l’elenco dei codici di errore MySQL qui: Codici e Messaggi di Errore del Server

5.2 Preparare Server2

Apporta alcune modifiche per la replicazione alla tua MySQL-Config:

vi /etc/mysql/my.cnf

Cerca la sezione che inizia con [mysqld], e inserisci le seguenti opzioni (commentando tutte le opzioni in conflitto esistenti):

[...]  
[mysqld]  
server-id                = 2  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
slave_skip_errors        = 1007,1008,1050, 1396

5.3 Creare un’istantanea dei database esistenti su server1

Esegui il dump dei database su server1 e inserisci la password di root di MySQL:

mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

Copia il dump su server2:

scp /root/mysqldump.sql [email protected]:/root

5.4 Importare il dump su server2

mysql -u root -p < /root/mysqldump.sql

Arresta mysql su server2:

service mysql stop

Copia il file di default per MySQL da server1 a server2. Passa a server1 e esegui

scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

Avvia MySQL su server2:

service mysql start

e accedi a MySQL per impostare il master-server con:

CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";

Avvia lo slave:

START SLAVE;

e controlla lo stato dello slave con

SHOW SLAVE STATUS \G

Il risultato sarà qualcosa del genere

************************* 1. row ***********************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: server1.example.tld  
                  Master_User: slaveuser2  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysql-bin.000001  
          Read_Master_Log_Pos: 109989  
               Relay_Log_File: mysqld-relay-bin.000002  
                Relay_Log_Pos: 110276  
        Relay_Master_Log_File: mysql-bin.000001  
             Slave_IO_Running: Yes  
            Slave_SQL_Running: Yes  
              Replicate_Do_DB:  
          Replicate_Ignore_DB:  
           Replicate_Do_Table:  
       Replicate_Ignore_Table:  
      Replicate_Wild_Do_Table:  
  Replicate_Wild_Ignore_Table:  
                   Last_Errno: 0  
                   Last_Error:  
                   Skip_Counter: 0  
          Exec_Master_Log_Pos: 109989  
              Relay_Log_Space: 110574  
              Until_Condition: None  
               Until_Log_File:  
                Until_Log_Pos: 0  
           Master_SSL_Allowed: No  
           Master_SSL_CA_File:  
           Master_SSL_CA_Path:  
              Master_SSL_Cert:  
            Master_SSL_Cipher:  
               Master_SSL_Key:  
        Seconds_Behind_Master: 0  
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0  
                Last_IO_Error:  
               Last_SQL_Errno: 0  
               Last_SQL_Error:  
  Replicate_Ignore_Server_Ids:  
             Master_Server_Id: 1  
               Master_SSL_Crl:  
           Master_SSL_Crlpath:  
                   Using_Gtid: No  
                  Gtid_IO_Pos:

Se “Seconds Behind Master” non è 0, attendi finché lo Slave non ha letto tutti i dati dal master (ripeti semplicemente il comando per ottenere il valore attuale). Assicurati che server2 utilizzi il giusto master-log e la posizione del log.

Su server1 esegui in MySQL:

SHOW MASTER STATUS \G
*********************** 1. row *************************  
            File: mysql-bin.000991  
        Position: 69185362  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

E confronta le coordinate del log binario del master della replicazione.

Stiamo eseguendo una replicazione MySQL Master-Slave dove server1 è il master e server2 lo slave.

5.5 Replicazione MySQL Master-Master

Crea l’utente MySQL per la replicazione e concedi il privilegio in MySQL:

CREATE USER 'slaveuser1'@'server1.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'192.168.0.105' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'2001:db8::1' IDENTIFIED BY 'slave_user_password';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'server1.example.tld';   
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'192.168.0.105';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'2001:db8::1';  
QUIT;

Apporta alcune modifiche per la replicazione alla tua MySQL-Config su server2:

vi /etc/mysql/my.cnf

Cerca la sezione che inizia con [mysqld], e inserisci le seguenti opzioni (commentando tutte le opzioni in conflitto esistenti):

[...]  
[mysqld]  
[...]  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 2  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.inde

e riavvia MySQL:

service mysql restart

Accedi a MySQL e ottieni le coordinate del log binario del master:

SHOW MASTER STATUS \G
************************* 1. row *************************  
            File: mysql-bin.000002  
        Position: 326  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

Accedi a MySQL su server1 e imposta il master-server con

CHANGE MASTER TO MASTER_HOST="server2.example.tld", MASTER_USER="slaveuser1", MASTER_PASSWORD="slave_user_password", MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=326;

Avvia lo slave:

START SLAVE;

e controlla lo stato dello slave con

SHOW SLAVE STATUS \G

Controlla che lo slave stia funzionando:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Se la tua replicazione smette di funzionare, potresti trovare ulteriori informazioni qui:

  • Come saltare determinati errori nella replicazione MySQL
  • riavviare la replicazione master-master mysql
  • mysql-replication – Impossibile analizzare l’evento di log relay
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.