Starten Sie die MySQL-Replikation nach sql_error neu

8

Ich habe zwei MySQL-Server, einen Master und einen Slave.

Jemand ging zum Slave und erstellte eine Tabelle, dann ging er zum Master und erstellte dieselbe Tabelle. Natürlich wurde diese DDL-Anweisung auf den Slave repliziert, was einen Fehler verursachte und dazu führte, dass die Replikation an der Stelle des Fehlers gestoppt wurde.

Wie soll ich den Replikationsprozess neu starten, nachdem ich entweder die Tabelle auf dem Slave gelöscht oder die Replikation nach dieser Anweisung gestartet habe?

Slave-Statusausgabe anzeigen:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xx.xx.xx.xx
                  Master_User: buildbot
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.024536
          Read_Master_Log_Pos: 33489509
               Relay_Log_File: mysqld-relay-bin.049047
                Relay_Log_Pos: 32575097
        Relay_Master_Log_File: mysql-bin.024476
             Slave_IO_Running: Yes
            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: 1050
                   Last_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 32574952
              Relay_Log_Space: 6766519525
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 2013
                Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 60  retries: 86400
               Last_SQL_Errno: 1050
               Last_SQL_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'
ʞɔıu
quelle

Antworten:

15

Sie können die folgenden Befehle verwenden (an der MySQL-Eingabeaufforderung):

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;

Der Wert gibt 1die Anzahl der zu überspringenden Anweisungen an. Sie können dies wiederholt tun, bis die Replikation behoben ist. Sie können diese Seite sehen .

Khaled
quelle
2
+1 Ich habe dies oft verwendet, es ist jedoch wichtig zu verstehen, was Sie tun, wenn Sie dies ausführen. Dies kann zu Problemen mit der Datenintegrität führen. In Fällen, in denen eine Dump-Datei in die falsche Box geladen wurde (dh Slave nicht Master), habe ich Hunderte von Abfragen übersprungen (nachdem ich dies zuerst überprüft habe, schadet dies nicht!). Dadurch kann vermieden werden, dass die gesamte Replikation erneut eingerichtet wird.
Coops
Ja, du hast recht. Dies sollte mit Vorsicht erfolgen. Dies ist nützlich, wenn Sie eine ungültige Abfrage haben, die die Replikation gestoppt hat. Sie können es einfach überspringen. Sie können auch die entsprechenden Tabellen überprüfen, um sicherzustellen, dass Sie keine Daten zwischen Master und Slave verloren haben.
Khaled
2

Das tust du nicht. Tatsächlich müssen Sie die Replikation wie beim ersten Mal erneut von Grund auf neu einrichten, da Sie möglicherweise die Integrität verlieren, wenn Sie nur Anweisungen überspringen. Um sicher zu sein, müssen Sie von einem bekannten sicheren Startpunkt aus replizieren.

  • Sperren Sie den Master
  • Speichern Sie die Daten mit --master-data und notieren Sie die Binlog-Koordinaten (z. B. Master-Status anzeigen).
  • Schalte den Master frei
  • Laden Sie den Dump in den Slave
  • Starten Sie den Slave mit 'change master' und den zuvor aufgezeichneten Binlog-Koordinaten
dotplus
quelle