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.cnfCerca 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 restartSemplicemente 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.cnfCerca 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, 13965.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.sqlCopia il dump su server2:
scp /root/mysqldump.sql [email protected]:/root5.4 Importare il dump su server2
mysql -u root -p < /root/mysqldump.sqlArresta mysql su server2:
service mysql stopCopia 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.cnfAvvia MySQL su server2:
service mysql starte 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.cnfCerca 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.indee riavvia MySQL:
service mysql restartAccedi 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
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.