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.gz
cd /misc/mysql-4.1.12
./configure --prefix=/usr/local/mysql-master
make
make install
cd /usr/local/mysql-master/bin
./mysql_install_db

(questo creerà una cartella var)

cd ../var
cp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -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-slave
make
make install
cd /usr/local/mysql-slave
cd bin
./mysql_install_db

(questo creerà una cartella var)

cd ../var
cp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -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.sock

Crea 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.sock
mysql> 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.000001

Slave_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.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.