Datenbank · 3 min read · Nov 02, 2025
Wie man MySQL-Replikation repariert

Wenn Sie MySQL-Replikation eingerichtet haben, kennen Sie wahrscheinlich dieses Problem: Manchmal gibt es ungültige MySQL-Abfragen, die dazu führen, dass die Replikation nicht mehr funktioniert. In diesem kurzen Leitfaden erkläre ich, wie Sie die Replikation auf dem MySQL-Slave reparieren können, ohne sie von Grund auf neu einrichten zu müssen. Dieser Leitfaden gilt für MySQL und MariaDB.
1 Identifizierung des Problems
Um herauszufinden, ob die Replikation funktioniert oder nicht und was sie gestoppt hat, können Sie sich die Protokolle ansehen. Auf Debian protokolliert MySQL beispielsweise in /var/log/syslog:
grep mysql /var/log/syslogserver1:/home/admin# grep mysql /var/log/syslog
MAR 19 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Slave: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'. Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
MAR 19 09:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views
MAR 19 09:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146
MAR 19 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.001079' position 203015142
server1:/home/admin#Sie können sehen, welche Abfrage den Fehler verursacht hat und an welcher Protokollposition die Replikation gestoppt wurde.
Um zu überprüfen, ob die Replikation wirklich nicht funktioniert, melden Sie sich bei MySQL an:
mysql -u root -pFühren Sie in der MySQL-Shell aus:
mysql> SHOW SLAVE STATUS \GWenn einer von Slave_IO_Running oder Slave_SQL_Running auf Nein gesetzt ist, dann ist die Replikation defekt:
mysql> SHOW SLAVE STATUS \G
************************* 1. row ***********************
Slave_IO_State: Waiting for master to send event
Master_Host: 1.2.3.4
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.001079
Read_Master_Log_Pos: 269214454
Relay_Log_File: slave-relay.000130
Relay_Log_Pos: 100125935
Relay_Master_Log_File: mysql-bin.001079
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: mydb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1146
Last_Error: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'.
Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
SET thread.views = thread.views + aggregate.views
WHERE thread.threadid = aggregate.threadid'
Skip_Counter: 0
Exec_Master_Log_Pos: 203015142
Relay_Log_Space: 166325247
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: NULL
1 row in set (0.00 sec)
mysql>2 Reparatur der MySQL-Replikation
Um sicherzugehen, stoppen wir den Slave:
mysql> STOP SLAVE;Das Problem zu beheben ist eigentlich ganz einfach. Wir sagen dem Slave, dass er einfach die ungültige SQL-Abfrage überspringen soll:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;Dies sagt dem Slave, dass er eine Abfrage (die ungültige, die die Replikation gestoppt hat) überspringen soll. Wenn Sie zwei Abfragen überspringen möchten, verwenden Sie stattdessen SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; und so weiter.
Das war’s schon. Jetzt können wir den Slave wieder starten…
mysql> START SLAVE;… und überprüfen, ob die Replikation wieder funktioniert:
mysql> SHOW SLAVE STATUS \Gmysql> SHOW SLAVE STATUS \G*********************** 1. row ************************* Slave_IO_State: Waiting for master to send event Master_Host: 1.2.3.4 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.001079 Read_Master_Log_Pos: 447560366 Relay_Log_File: slave-relay.000130 Relay_Log_Pos: 225644062 Relay_Master_Log_File: mysql-bin.001079 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: mydb 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: 447560366 Relay_Log_Space: 225644062 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 1 row in set (0.00 sec) mysql>
Wie Sie sehen, sind jetzt sowohl Slave_IO_Running als auch Slave_SQL_Running auf Ja gesetzt.
Jetzt verlassen Sie die MySQL-Shell…
mysql> quit;… und überprüfen Sie das Protokoll erneut:
grep mysql /var/log/syslogserver1:/home/admin# grep mysql /var/log/syslog
MAR 19 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Slave: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'. Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
MAR 19 09:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views
MAR 19 09:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146
MAR 19 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.001079' position 203015142
MAR 19 11:42:13 http2 mysqld[1380]: 080529 11:42:13 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.001079' at position 203015142, relay log '/var/lib/mysql/slave-relay.000130' position: 100125935
server1:/home/admin#Die letzte Zeile sagt, dass die Replikation wieder gestartet wurde, und wenn Sie nach dieser Zeile keine Fehler sehen, ist alles in Ordnung.
3 Links
- MySQL: http://www.mysql.com
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.