Der Import von MySQL-Daten schlug mit Fehler 1839 fehl

12

Ich habe Master-Slave-Setup von MySQL mit GTID konfiguriert. Ich habe die Datensicherung des Masters zurückgenommen und auf einen einzelnen Testserver importiert. Es kann nicht importiert werden als

FEHLER 1839 (HY000) in Zeile 24: @@ GLOBAL.GTID_PURGED kann nur gesetzt werden, wenn @@ GLOBAL.GTID_MODE = ON Ich habe es mit --set-gtid-purged = OFF und AUTO versucht, aber kein Glück.

JAVAC
quelle

Antworten:

26

Wenn Sie eine ausführen

SHOW MASTER STATUS\G

Sie werden so etwas sehen:

mysql> show master status\G
*************************** 1. row ***************************
         File: mysql-bin.000299
         Position: 780437462
         Binlog_Do_DB:
         Binlog_Ignore_DB:
         Executed_Gtid_Set: 075d81d6-8d7f-11e3-9d88-b4b52f517ce4:1-616637650,
         e907792a-8417-11e3-a037-b4b52f51dbf8:1-25385296642
         1 row in set (0.00 sec)

Denn wenn GTID aktiviert ist, haben alle Server ihre eigene UUID und es gibt Transaktionen. Ich nehme an, Sie haben den Speicherauszug mit mysqldump erstellt, und wenn Sie sich den Anfang dieser Datei ansehen, werden Sie etwas Ähnliches finden:

--
-- GTID state at the beginning of the backup 
--

 SET @@GLOBAL.GTID_PURGED='075d81d6-8d7f-11e3-9d88-b4b52f517ce4:1-616648986,
 e907792a-8417-11e3-a037-b4b52f51dbf8:1-25385296642';

Dies ist der Befehl, der nicht ausgeführt werden kann.

Sie haben folgende Möglichkeiten:

  • Entfernen Sie diesen Befehl aus der MySQL-Dump-Datei. Einfach löschen. Alle Einfügungen werden auf dem Slave als lokale Transaktionen angezeigt

  • Wenn Sie dies verhindern möchten, können Sie auch den Master auf dem Slave zurücksetzen

    mysql> RESET MASTER;

    Dieser Befehl bereinigt die Variable 'Executed_Gtid_Set' auf dem Slave, sodass Sie die Dumpfile direkt importieren können, und die zuvor erwähnte Variable set_global_gtid_purged wird aktiv

  • Wenn Sie den mysqldump erstellen, können Sie den GTID-Setup-Teil überspringen, indem Sie den --set-gtid-purged=OFFParameter für mysqldump hinzufügen .

HINWEIS:

Wenn sich die GTID-Teilmenge auf dem Master zwischen Master und Slave unterscheidet (wenn Sie dies in einem Replikationssetup verwenden möchten), funktioniert die Replikation nicht. Ich würde einen binären Speicherauszug und eine Wiederherstellung empfehlen, da die GTID des Slaves genau auf die des Masters eingestellt wird.

Mit GTID treten viele neue Probleme auf, aber Ihr Replikat-Setup wird konsistenter. Es lohnt sich, damit zu arbeiten.

Banyek
quelle
Eigentlich versuche ich, diesen ganzen MySQL-Server auf einen neuen Server zu migrieren. Ich habe den MySQL-Server auf einem neuen Computer installiert und versucht, einen Dump zu importieren. Hier
bekomme
1
Und der Server hat eine eigene GTID. (Siehe 'SHOW MASTER STATUS') Wenn es sich um einen brandneuen Server handelt, der derzeit von keinem Slave verwendet wird, würde ich die GTID-Daten aus dem Speicherauszug entfernen und alle Daten importieren. Danach würde ich einen 'RESET MASTER' ausgeben, der die GTID-Sequenz zurücksetzt und Sie können neu beginnen.
Banyek
1
GTID aus Dump SQL-Datei entfernt hat bei mir
funktioniert
2

Wenn Sie wie ich sind und Ihren Dump nicht erneut ausführen möchten, weil es eine sehr lange Operation war, können Sie diese Zeilen einfach nachträglich entfernen.

find . -name '*.sql' -type f -exec perl -0 -i.bak -pe 's/SET \@\@GLOBAL\.GTID_PURGED=\x27.*?\x27;//gs' {} +

Führen Sie dies in dem Ordner mit Ihren .sql-Dateien aus. Die alte Version wird als .bak gespeichert.

Das hat bei mir funktioniert.

Goddard
quelle