Vergleichen von Daten in 2 Tabellen auf verschiedenen Servern mit CHECKSUM

1203
ircmaxell

Ich hatte also ein Problem, bei dem ich Daten in zwei verschiedenen Tabellen auf zwei verschiedenen Servern vergleichen muss. Nun, ich weiß, dass MySQL unterstützt CHECKSUM TABLES, aber aufgrund meines Tests und meines Verständnisses ist es über Serverinstanzen und -versionen hinweg nicht zuverlässig.

Also habe ich diese Abfrage erstellt:

$part = '@CRC := MD5(CONCAT_WS(\'#\', COALESCE(`'.
    implode('`, "#NULL#"), COALESCE(`', $this->_columns).
    '`, "#NULL#")))';
$sql1 = "SELECT COUNT(*) AS cnt, 
        SUM(CONV(SUBSTRING({$part}, 1, 4), 16, 10)) as a1, 
        SUM(CONV(SUBSTRING(@CRC, 5, 4), 16, 10)) as a2, 
        SUM(CONV(SUBSTRING(@CRC, 9, 4), 16, 10)) as a3, 
        SUM(CONV(SUBSTRING(@CRC, 13, 4), 16, 10)) as a4, 
        SUM(CONV(SUBSTRING(@CRC, 17, 4), 16, 10)) as a5, 
        SUM(CONV(SUBSTRING(@CRC, 21, 4), 16, 10)) as a6, 
        SUM(CONV(SUBSTRING(@CRC, 25, 4), 16, 10)) as a7, 
        SUM(CONV(SUBSTRING(@CRC, 29, 4), 16, 10)) as a8 
    FROM `dbname`.`tablename` 
    WHERE `id` >= $min AND `id` <= $max ";

Im Grunde ist es also eine Verkettung jeder Zeile (insbesondere der Spalten jeder Zeile) und das anschließende MD5. Dann durchläuft es jeweils 4 Hexbits durch dieses MD5 und summiert sie über alle Zeilen (4 Hexbits, damit ich riesige Tabellen erstellen kann, ohne sich Sorgen machen zu müssen, dass es zu einem Überlauf kommt). Dann vergleiche ich nur das Ergebnis dieser Abfrage in beiden Tabellen, um zu sehen, ob alles gleich ist.

Durch die Verwendung dieser binären Suche kann ich die Änderungen relativ schnell eingrenzen, so dass ich sie portieren kann.

Es ist eigentlich einigermaßen effizient, darum bin ich nicht allzu besorgt. Was mich beunruhigt, ist, ob dies überhaupt notwendig ist. Es schreit zu mir "Du machst es falsch", aber ich kann keine sauberere Methode um es herausfinden ...

Was sind deine Gedanken?

Antworten
8
Es mag für Ihr Problem übertrieben sein, aber Sie haben sich MYSQL-Cluster angesehen, um das Spiegeln und Verteilen von Daten zu behandeln. Es würde andere Funktionen bieten, die nützlich sein könnten. vor 10 Jahren 1
Sie müssen träge synchronisiert werden. Grundsätzlich QC in die Produktion drängen. Und das Datenvolumen verhindert (oder macht es zumindest teuer), die gesamte Datenmenge in jedem Zyklus zu sichern und wiederherzustellen ... ircmaxell vor 10 Jahren 0

2 Antworten auf die Frage

5
edorian

Wir verwenden mk-table-checksum.

Es funktioniert sehr gut im Master-Slave-Kontext, wo es auch erlaubt, Unterschiede in beide Richtungen zu synchronisieren, je nach Ihrer Wahl.

Aus dem, was ich die meisten Leute gesehen habe, heißt es für die Replikation, und ich kann keine Kopien / pasteable Ausgaben liefern, aber wenn Sie es nicht wissen, ist es definitiv einen Blick wert. Wenn Sie es wissen, würde ich gerne hören, warum es für Sie nicht funktioniert.

Um einen Überblick über viele Tabellen zu erhalten, können Sie so etwas verwenden mk-table-checksum host1 host2 | mk-checksum-filter

Das einzige Problem, das ich damit habe, ist, dass es schwierig sein wird, eine binäre Suche zu schreiben. Es hat zwar eine Stückgröße, aber ich kann auch nicht den Bereich von PK angeben. Alles, was es mir sagen würde, ist, wenn sie sich unterscheiden. Aber da würde das Tool [mk-table-sync] (http://www.maatkit.org/doc/mk-table-sync.html) das tun. Aber ich brauche ein wenig kundenspezifische Arbeit, daher ist das Aufrufen eines externen Programms bestenfalls ein letzter Ausweg. Trotzdem danke! ircmaxell vor 10 Jahren 0
1
dvgmex

Einfach in MySQL laufen lassen CHECKSUM TABLE 'yourtable'

Oder lesen Sie für eine PHP-Lösung nach, wie MySQL Replication-Datenbanken synchronisiert werden