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

(es wird ein var-Ordner erstellt)

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 // 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-slave
make
make install
cd /usr/local/mysql-slave
cd bin
./mysql_install_db

(es wird ein var-Ordner erstellt)

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 .

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

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

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

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.