Database Replication · 8 min read · Jan 29, 2026
Replicare un database master utilizzando MariaDB 10 su Debian 8
Replicare i database crea ridondanza che può proteggere contro la perdita di dati e consentire prestazioni ottimizzate per le applicazioni. Questo tutorial coprirà le basi della replicazione di un database master esistente MariaDB 10.0 su uno o più slave. Negli esempi seguenti, il sistema operativo host è Debian 8.
Queste istruzioni possono essere applicate ad altri sistemi operativi, ma sii consapevole che diversi comandi e posizioni predefinite dei file saranno diversi. In particolare, dovresti sostituire i percorsi di /etc/mysql/my.cnf, /var/lib/mysql, il nome e il percorso predefiniti del tuo file di log binario e i comandi per avviare, fermare e riavviare mysqld in base alle specifiche del tuo sistema.
1. Verifica la connettività
Prima di procedere, assicurati che il master e lo slave possano raggiungersi a vicenda sulla rete e che ciascuno abbia una voce per l’altro nei rispettivi file /etc/hosts. Ogni host dovrebbe essere in grado di pingare l’altro e dovresti essere in grado di ssh da ciascuno all’altro come utente normale.
2. Abilita il log binario mysqld sul master
Sull’host master, controlla che il logging binario sia abilitato. Invocando mysqld con i parametri –verbose –help verranno visualizzati i valori operativi per il demone MariaDB. Come root:
mysqld --verbose --help | grep log-bin...
log-bin (Nessun valore predefinito)
...Il valore dell’entrata log-bin definisce la convenzione di denominazione dei file di log binari. Su Debian, questi file risiedono in /var/lib. Se il valore di log-bin è (Nessun valore predefinito), dovrai abilitare il logging modificando il file di configurazione my.cnf. Su Debian, my.cnf risiede nella directory /etc/mysql.
Apri /etc/mysql/my.cnf in un editor di testo e trova il gruppo [mysqld]. Se non esiste, crealo e inserisci una riga che legga semplicemente log-bin.
[mysqld]
log-binIncludere questa voce abiliterà il logging binario quando mysqld viene riavviato.
Puoi scegliere di impostare un valore per log-bin, ad esempio log-bin= filename, per definire un nome personalizzato per il file di log binario. In questo tutorial, non imposteremo un valore e verranno utilizzati i nomi di file di log predefiniti.
Riavvia mysqld:
service mysql restartVerifica che la modifica abbia avuto effetto:
mysqld --verbose --help | grep log-bin...
log-bin mysqld-bin
...Come mostrato qui, il nome predefinito del file di log binario su Debian inizia con mysqld-bin, ad esempio mysqld-bin. nnnnnn.
3. Concedi diritti a un utente di replicazione
È buona pratica far eseguire tutti i compiti di replicazione da un utente di replicazione dedicato. In questi esempi, chiameremo l’utente repluser e imposteremo la password di questo utente sulla stringa replpass.
Concedi a questo utente i privilegi globali SUPER, RELOAD e REPLICATION SLAVE. Questi consentiranno all’utente di replicazione di eseguire comandi da superutente, svuotare le cache del database e recuperare aggiornamenti dal server master.
Accedi al client MariaDB come root del database:
mysql -u root -pAl prompt di MariaDB, inserisci il comando:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';Qui, il carattere jolly dell’hostname ‘%‘ consente all’utente di replicazione di connettersi da qualsiasi host.
Verifica che i diritti siano stati concessi:
SHOW GRANTS FOR 'repluser'4. Svuota le cache del database e imposta le tabelle in sola lettura
In preparazione per creare uno snapshot dei database, svuota tutte le tabelle e impostale su READ LOCK. Questo dovrebbe essere fatto rapidamente, durante le ore di bassa affluenza o un periodo di manutenzione del sistema.
Sul master:
FLUSH TABLES WITH READ LOCK;Ora che le tabelle sono bloccate, controlla lo stato del master:
SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+Le tue informazioni saranno diverse, ma annota i valori di File e Position. Utilizzerai queste informazioni nel passo 7.
Esci dal client MariaDB:
\q5. Crea uno snapshot dei database per l’host slave
Crea un archivio del database o dei database che esistono sul master che desideri replicare. Ognuno di questi database ha la propria directory in /var/lib/mysql. In questo esempio, archivieremo un singolo database, situato nel percorso /var/lib/mysql/dbname.
Questo comando archivia un singolo database. Se stai archiviando database aggiuntivi, aggiungi i loro percorsi completi al comando, ad esempio /var/lib/mysql/dbname1 /var/lib/mysql/dbname2…
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbnameOra, come utente normale username, trasferisci questo file a un account utente normale sull’host slave:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.oppure, usando scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.Quindi, SSH nell’host slave:
ssh [username]@slavehostCome root, ferma mysqld sullo slave:
service mysql stop…e estrai l’archivio:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.6. Configura gli ID del server per master e slave
Modifica /etc/mysql/my.cnf sul master, aggiungendo l’entrata server-id= n nel gruppo [mysqld], dove n è un intero unico che identifica il server. Comunemente, n =1 per il server master, ma n può essere qualsiasi intero unico nell’intervallo [ 1, 2^32-1 ]. Imposteremo il nostro master su server-id=1 e il nostro slave su server-id=100.
(Se my.cnf non esiste sullo slave, crealo. Se esiste, cerca un’entrata esistente server-id e decommenta/modifica quella riga).
In /etc/mysql/my.cnf sull’host master:
[mysqld]
server-id=1In /etc/mysql/my.cnf sull’host slave:
[mysqld]
server-id=1007. Sblocca le tabelle e avvia/riavvia mysqld su master e slave
Sul server master, nel client MariaDB come root del database, sblocca le tabelle:
mysql -u root -pUNLOCK TABLES;\qRiavvia mysqld sul master:
service mysql restartE avvialo sullo slave:
service mysql startPuoi verificare che il nuovo valore server-id abbia avuto effetto su ciascun host. Come root:
mysqld --verbose --help | grep server-id8. Configura l’identità del master sullo slave
Sullo slave, configura l’identità del server master. Accedi al client MariaDB:
mysql -u root -pEsegui il seguente comando, sostituendo i valori di MASTER_LOG_FILE e MASTER_LOG_POS con il log binario File e Position che hai registrato nel passo 4, e i valori di MASTER_HOST, MASTER_USER e MASTER_PASSWORD con i tuoi valori.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;9. Attiva lo slave
Sullo slave, nel client MariaDB come root del database:
START SLAVE;Ora puoi controllare lo stato dello slave:
SHOW SLAVE STATUS \G;************************* 1. row *************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
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: 1330
Relay_Log_Space: 2204
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 ci sono errori nei processi di replicazione, li vedrai elencati qui.
10. Apporta modifiche sul master e verifica la replicazione sullo slave
Puoi verificare che la replicazione stia avvenendo creando un nuovo database sul master e vedendo le modifiche sullo slave.
mysql -u root -pCrea un nuovo database:
CREATE DATABASE repltest;USE repltestCrea una tabella e inserisci un valore:
CREATE TABLE test (hello VARCHAR(10));INSERT INTO test VALUES ('world');\qOra accedi al client MariaDB sullo slave:
mysql -u root -pUSE repltestSELECT * FROM test;+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)11. Ripeti il processo per ulteriori slave
Puoi ripetere questo processo per ciascun slave aggiuntivo. In particolare, esegui questi passaggi:
11 ( a) . Sul master, nel client MariaDB come root del database, svuota e blocca le tabelle:
FLUSH TABLES WITH READ LOCK;Dopo aver bloccato, mostra lo stato del master:
**SHOW MASTER STATUS;Annota i valori di File e Position.
11 ( b) . Sul master, come root:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname11 ( c) . Sul master, come utente normale:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.11 ( d) . Sullo slave, come root:
service mysql stoptar xjvf /home/[username]/mysql-master.tar.bz2 -C /.11 ( e) . In /etc/mysql/my.cnf sull’host slave, aggiungi o modifica la riga server-id= nel gruppo [mysqld], dove il valore di server-id è nuovo e unico:
[mysqld]
server-id=20011 ( f) . Sul master, nel client MariaDB come root del database, sblocca le tabelle:
UNLOCK TABLES;11 ( g) . Sul master, come root, riavvia mysqld:
service mysql restart11 ( h) . Sullo slave, come root, avvia mysqld:
**service mysql start
11 ( i) . Sullo slave, nel client MariaDB come root del database, configura l’identità del master e il nome del file di log binario e la posizione dal passo 10(a):
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;11 ( j) . Sullo slave, nel client MariaDB come root del database, attiva la replicazione:
START SLAVE;12. Risoluzione dei problemi: Slave non in grado di connettersi al master
Controlla /var/mysql/my.cnf sul master per un’entrata bind-address. Se bind-address è impostato su 127.0.0.1, il server accetterà solo connessioni da localhost. Decommenta questa riga o imposta il valore su * per consentire connessioni da tutti gli indirizzi IPv4 e IPv6. Se modifichi my.cnf, non dimenticare di riavviare mysqld.
Se le connessioni non funzionano ancora, assicurati che il tuo server stia consentendo connessioni sulla porta 3306. Sul master, elenca le tabelle del firewall del kernel:
iptables -LPuoi creare un’autorizzazione per le connessioni sulla porta 3306 con il seguente comando, sostituendo il nome del tuo dispositivo di interfaccia di rete per eth0 se necessario:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPTRicevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.