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/syslog
server1:/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 -p

Führen Sie in der MySQL-Shell aus:

mysql> SHOW SLAVE STATUS \G

Wenn 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 \G
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: 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/syslog
server1:/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

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.