Datenbank · 6 min read · Jan 31, 2026
MySQL-Replikation auf demselben Rechner
Diese Anleitung erklärt die Replikation in MySQL auf demselben Rechner.
Sie haben große Zugriffe auf eine datenbankgestützte Website, und Leistung, Redundanz, Sicherheit kommen jetzt in den Sinn. Der DBA wird von vielen Händen unterstützt, um eine gute Lösung zu finden, um glückliche Gesichter zu machen. So kommen Wörter wie Cluster, Replikation, Backup, Failover und andere ins Spiel. Was sind diese? Wir diskutieren derzeit die Replikation im Hinblick auf eine webbasierte, datenbankgestützte Website mit großen Zugriffen.
Was ist Replikation und warum?
Replikation ermöglicht es dem DBA, die Datenbank des Masters auf einen anderen Datenbankserver mit derselben Datenbank zu klonen. Dazu gehören die Identitäten von Master und Slave. Der Slave erstellt eine exakte Kopie des Master-Datenbankservers und/oder seiner Datenbanken. Es kann eine Eins-zu-eins-, Eins-zu-viele- oder viele-zu-eins-Beziehung zwischen Master(s) und Slave(s) bestehen. Der Slave liest kontinuierlich das Binärprotokoll des Masters (binlog speichert die Abfragen, die am Master-Datenbankserver geschrieben wurden) und erhält Eingaben für seinen Slave-Datenbankserver.
Wofür ist Replikation nicht:
Betrachten Sie die Lösung für Backup, Leistung, Sicherheit und Redundanz. Dafür gibt es andere Techniken.
Wir sehen uns derzeit die Replikation des MySQL-Servers auf demselben Rechner an, d.h. Master und Slave laufen auf demselben Rechner. Wir werden auch einige Probleme mit der Replikation besprechen.
Voraussetzungen:
MySQL-Server 4.1.12 oder höher im Quellformat. Laden Sie es von http://mysql.com im Quellformat herunter. Sie können zur Vereinfachung den MySQL-Client von http://mysql.com herunterladen oder MySQL in die Umgebungsvariable einfügen. Andernfalls müsste MySQL aus den jeweiligen Master-/Slave-Verzeichnissen aufgerufen werden. Einige Linux-Distributionen. (Ich habe Fedora Core 2 verwendet). Entfernen Sie Abhängigkeiten für den MySQL-Server
MySQL Master-Installation und -Konfiguration:
Laden Sie mysql-4.1.12 Quelle im /misc-Ordner herunter
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(es wird ein var-Ordner erstellt)
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 // wir haben dies in unserem Fall übersprungen, da wir sowohl Master als auch Slave auf demselben Rechner ausführen.
# Replikations-Master-Server (Standard)
# Binärprotokollierung ist für die Replikation erforderlich
log-bin
# erforderliche eindeutige ID zwischen 1 und 2^32 - 1
# standardmäßig 1, wenn master-host nicht gesetzt ist
# funktioniert jedoch nicht als Master, wenn weggelassen
server-id = 1
Konfigurieren Sie andere Einstellungen gemäß Ihren Anforderungen oder lassen Sie sie gleich, es wird funktionieren!! :)
Jetzt starten Sie den MySQL-Server mit:
cd /usr/local/mysql-master/bin./mysqld_safe --defaults-file=/usr/local/mysql-master/var/my.cnf &;MySQL Slave:
Jetzt extrahieren Sie mysql-4.1.12.tar.gz in ein anderes Verzeichnis,
cd /opt/mysql-4.1.12./configure --prefix=/usr/local/mysql-slavemakemake installcd /usr/local/mysql-slavecd bin./mysql_install_db(es wird ein var-Ordner erstellt)
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 .Bearbeiten Sie my.cnf im var-Ordner
[mysqld]
port = 3307
socket = /usr/local/mysql-slave/var/mysql.sock
#skip-networking
server-id = 2
# Der Replikationsmaster für diesen Slave - erforderlich
master-host = localhost
master-user = slavedb
master-password = q1w2e3r4t5
master-port = 3306
Jetzt starten Sie den MySQL-Server mit:
cd /usr/local/mysql-slave/bin./mysqld_safe --defaults-file=/usr/local/mysql-slave/var/my.cnf &Replikation konfigurieren:
Verbinden Sie sich mit dem MySQL-Master:
mysql --sock=/usr/local/mysql-master/mysql.sockErstellen Sie ein Konto am Master für den Slave:
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slavedb@"192.168.1.27/255.255.255.0" identified by 'q1w2e3r4t5'; Query OK, 0 rows affected (0.28 sec)Verbinden Sie sich mit dem MySQL-Slave:
mysql --sock=/usr/local/mysql-slave/mysql.sockmysql> slave start;Query OK, 0 rows affected, 1 warning (0.04 sec)
Testen:
MySQL-Verbindung am Master:
mysql> show master status\G;************************* 1. row ***********************
File: adam-bin.000001
Position: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
ERROR:
No query specified
Verbinden Sie sich mit MySQL am Slave
mysql> show slave status\G;*********************** 1. row ************************* Slave_IO_State: Connecting to 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: Ja
Slave_SQL_Running: Ja
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: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Nein
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
ERROR:
No query specified
Die Binärprotokolldatei am Master und ihre Position müssen im MySQL-Slave durch show slave status\G gleich sein;
Wenn alles in Ordnung ist, führen Sie eine funktionierende Kopie einer Eins-zu-eins-Master- und Slave-Beziehung auf demselben System aus.
Einige Probleme:
Die Replikation kann aufgrund einer Vielzahl von Problemen fehlschlagen. Ich teile einige meiner Erfahrungen mit der Replikation.
Problem: Replikation schlägt fehl, Master ist ausgefallen.
Der Master könnte aus vielen Gründen ausgefallen sein. Überprüfen Sie die DATEILIMITS IN DER DATENBANK, SQL-ABFRAGEN UND DISKUSAGE. Wenn einer der Gründe angezeigt wird, beheben Sie diesen, starten Sie mysqld neu und überprüfen Sie den Master-Status:
mysql> show master status\G;* 1. row *
adam-bin.000003
Position: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
jetzt Slave überprüfen: durch show slave status:
mysql> show slave status\G;* 1. row *
Slave_IO_State: Connecting to 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: Nein
Slave_SQL_Running: Ja
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: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Nein
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
wie die obigen Werte zeigen, dass der Master auf das 3. Binärprotokoll erhöht wurde, während der Slave immer noch auf binlog1 zeigt. Ändern Sie diesen Wert, indem Sie sich mit dem MySQL-Slave verbinden
mysql>; stop slave;mysql> change master to master_log_file='adam-bin.000003', master_log_pos=227;mysql> start slave;Jetzt überprüfen Sie mit show slave status\G; es funktioniert einwandfrei.
Problem 2: Wenn am Slave ein doppelter Fehlerkey erscheint
d.h. Am Slave
Mysql> show slave status\G;* 1. row *
Slave_IO_State: Waiting for master to send event
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: Ja
Slave_SQL_Running: Nein
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: Fehler ‘Doppelte Eingabe ‘dekq5g820avnfdmar5qi9dkhv3’ für Schlüssel 1’ bei Abfrage. Standarddatenbank:’session_sql’. Abfrage: ‘INSERT INTO sessions5 VALUES (‘dekq5g820avnfdmar5qi9dkhv3’, UNIX_TIMESTAMP(NOW()) + 18000, ‘redir ect|i:1;’)’
Skip_Counter:0
Exec_Master_Log_Pos: 290512419
Relay_Log_Space: 317714776
Until_Condition: None
Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed: Nein
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
Das bedeutet, dass durch die Unverfügbarkeit des Masters der Slave gelesen wurde oder durch die Unverfügbarkeit des Slaves der Master aktualisiert wurde, sodass eine Abfrage zwei Primärschlüssel für einen Eintrag gefunden hat, was ein Durcheinander ist.
Das Beheben erfolgt durch: Am Slave:
Mysql> set global sql_slave_skip_counter=1;Mysql> start slave;Mysql> show slave status\G;Dies zeigt den synchronisierten Wert mit dem Master. Behoben.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.