Database · 6 min read · Jan 31, 2026
Replica MySQL sulla stessa macchina
Questo Come Fare spiega la replica in MySQL sulla stessa macchina.
Hai grandi colpi, con un sito basato su database e prestazioni, ridondanza, sicurezza ora vengono in mente. Il DBA è ora coinvolto da molte mani per cercare una buona soluzione per rendere felici le persone. Quindi ecco che arrivano parole come Cluster, Replica, Backup, Fail Over e altre. Quindi, cosa sono? Attualmente discutiamo della Replica in termini di un sito basato su database per grandi colpi.
Cos’è la Replica e perché?
La replica consente al DBA di clonare il database del master su un altro server database con lo stesso database. Ciò include le identità master e slave. Lo slave si crea una copia esatta del server database master e/o dei suoi database. Potrebbe esserci una relazione uno-a-uno, uno-a-molti, molti-a-uno tra master(e) e slave(i). Lo slave legge continuamente il log binario del master (il binlog memorizza le query scritte sul server database master) e ottiene input per il suo server database slave.
Cosa non è la Replica:
considera la soluzione per backup, prestazioni, sicurezza e ridondanza. Ci sono altre tecniche per questo.
Attualmente vediamo la Replica del server MySQL sulla stessa macchina, cioè master e slave in esecuzione sulla stessa macchina. Discuteremo anche di alcuni problemi con la replica.
Requisiti:
Server MySQL 4.1.12 o superiore in formato sorgente. Scaricalo da http://mysql.com in formato sorgente. Puoi per comodità, scaricare il client mysql da http://mysql.com o mettere mysql nella variabile ambientale. Altrimenti, mysql dovrebbe essere chiamato dalle rispettive directory master/slave. alcune distribuzioni Linux. (Ho usato Fedora Core 2). rimuovere le dipendenze per il server mysql
Installazione e Configurazione del Master MySQL:
Scarica mysql-4.1.12 Source nella cartella /misc
tar xzvf mysql-4.1.12.tar.gzcd /misc/mysql-4.1.12./configure --prefix=/usr/local/mysql-mastermakemake installcd /usr/local/mysql-master/bin./mysql_install_db(questo creerà una cartella var)
cd ../varcp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -R mysql .[mysqld]
port = 3306
socket = /usr/local/mysql-master/mysql.sock
#skip-networking // dobbiamo saltare questo nel nostro caso poiché stiamo facendo sia master che slave sulla stessa macchina.
# Replica Master Server (predefinito)
# la registrazione binaria è necessaria per la replica
log-bin
# id unico richiesto tra 1 e 2^32 - 1
# predefinito a 1 se master-host non è impostato
# ma non funzionerà come master se omesso
server-id = 1
configura altre impostazioni secondo le tue esigenze o rimani lo stesso, funzionerà!! :)
Ora avvia il server mysql con:
cd /usr/local/mysql-master/bin./mysqld_safe --defaults-file=/usr/local/mysql-master/var/my.cnf &;Slave MySQL:
Ora estrai mysql-4.1.12.tar.gz in una directory diversa,
cd /opt/mysql-4.1.12./configure --prefix=/usr/local/mysql-slavemakemake installcd /usr/local/mysql-slavecd bin./mysql_install_db(questo creerà una cartella var)
cd ../varcp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -R mysql .Modifica my.cnf nella cartella var
[mysqld]
port = 3307
socket = /usr/local/mysql-slave/var/mysql.sock
#skip-networking
server-id = 2
# Il master di replica per questo slave - richiesto
master-host = localhost
master-user = slavedb
master-password = q1w2e3r4t5
master-port = 3306
Ora avvia il server mysql con:
cd /usr/local/mysql-slave/bin./mysqld_safe --defaults-file=/usr/local/mysql-slave/var/my.cnf &Configura la Replica:
connettiti al master mysql con:
mysql --sock=/usr/local/mysql-master/mysql.sockCrea un account al master per lo slave:
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slavedb@"192.168.1.27/255.255.255.0" identified by 'q1w2e3r4t5'; Query OK, 0 righe interessate (0.28 sec)connettiti allo slave mysql con:
mysql --sock=/usr/local/mysql-slave/mysql.sockmysql> slave start;Query OK, 0 righe interessate, 1 avviso (0.04 sec)
Test:
mysql connettiti al master:
mysql> show master status\G;************************* 1. riga ***********************
File: adam-bin.000001
Posizione: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 riga impostata (0.01 sec)
ERRORE:
Nessuna query specificata
connettiti a mysql allo slave
mysql> show slave status\G;*********************** 1. riga ************************* Slave_IO_State: Connessione al master Master_Host: localhost Master_User: slavedb Master_Port: 3306 Connect_Retry: 60
Master_Log_File: adam-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001Slave_IO_Running: Sì
Slave_SQL_Running: Sì
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: 4
Relay_Log_Space: 4
Until_Condition: Nessuno
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: NULL
1 riga impostata (0.00 sec)
ERRORE:
Nessuna query specificata
il file binlog al master e la sua posizione devono essere gli stessi nello slave mysql con show slave status\G;
Se tutto è a posto, stai eseguendo una copia funzionante di una relazione uno-a-uno master e slave sulla stessa macchina.
Alcuni Problemi:
La replica potrebbe fallire a causa di un numero di problemi. Condivido alcune delle mie esperienze con la replica.
problema: replica fallita, master è andato giù.
Il master potrebbe essere giù per molte ragioni. Controlla i LIMITI DEI FILE NEL DATABASE, LE QUERY SQL E L’USO DEL DISCO. Se una delle ragioni mostra, risolvila, riavvia mysqld e controlla lo stato del master:
mysql> show master status\G;* 1. riga *
adam-bin.000003
Posizione: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 riga impostata (0.01 sec)
ora controlla lo slave: con show slave status:
mysql> show slave status\G;* 1. riga *
Slave_IO_State: Connessione al master
Master_Host: localhost
Master_User: slavedb
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: Sì
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: 4
Relay_Log_Space: 4
Until_Condition: Nessuno
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: NULL
1 riga impostata (0.00 sec)
come mostrano i valori sopra che il master è incrementato al 3° binlog mentre lo slave è ancora puntato al binlog1. quindi cambia questo valore collegandoti allo slave mysql
mysql>; stop slave;mysql> change master to master_log_file='adam-bin.000003', master_log_pos=227;mysql> start slave;Ora controlla con show slave status\G; sta funzionando bene.
Problema 2: Se appare l’errore chiave duplicata negli Slave
cioè
Al slave
Mysql> show slave status\G;* 1. riga *
Slave_IO_State: In attesa che il master invii l’evento
Master_Host: 10.0.0.152
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000048
Read_Master_Log_Pos: 317714810
Relay_Log_File: db4-relay-bin.000001
Relay_Log_Pos: 290512385
Relay_Master_Log_File: adam-bin.000048
Slave_IO_Running: Sì
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Errore ‘Voce duplicata ‘dekq5g820avnfdmar5qi9dkhv3’ per chiave 1’ sulla query. Database predefinito:’session_sql’. Query: ‘INSERT INTO sessi ons5 VALUES (‘dekq5g820avnfdmar5qi9dkhv3’, UNIX_TIMESTAMP(NOW()) + 18000, ‘redir ect|i:1;’)’
Skip_Counter:0
Exec_Master_Log_Pos: 290512419
Relay_Log_Space: 317714776
Until_Condition: Nessuno
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: NULL
1 riga impostata (0.00 sec)
Ciò significa che a causa dell’indisponibilità del master, lo slave è stato letto, o a causa dell’indisponibilità dello slave, il master è stato aggiornato, quindi una query ha trovato due chiavi primarie per un’entrata, il che è un pasticcio.
Quindi risolverlo è: Al slave:
Mysql> set global sql_slave_skip_counter=1;Mysql> start slave;Mysql> show slave status\G;Questo mostrerà il valore sincronizzato con il master. Risolto.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.