Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So synchronisieren Sie Daten zwischen zwei Tabellen in verschiedenen Datenbanken (MYSQL), die auf verschiedenen Servern ausgeführt werden

Erstens, warum beantwortet niemand von euch die Frage dieses Typen? Manchmal müssen wir dies aufgrund von Sicherheitsbeschränkungen / Compliance / Legacy-Systemen tun.

Es gibt einige Optionen, die ich hier mit Pseudocode schreiben werde. Ich bin mir nicht sicher, wie echtzeitfähig Ihre Datenbank ist, daher wird dies nicht in allen Fällen funktionieren.

Anforderungen

Damit dies funktioniert, müssen sich die Datenbanken in derselben Serverinstanz befinden. Wenn nicht, müssen Sie eine föderierte Speicher-Engine einrichten, um auf die Remote-Daten zuzugreifen. Wie eine andere Person feststellte, könnte die MySQL-Replikation immer noch nützlich sein, um zumindest die Daten auf denselben Server zu bringen und die Synchronisierung zu beschleunigen, ohne dass ein Verbundspeicher eingerichtet werden muss.Referenz:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html

Synchronisierungs-Timing

MySQL ermöglicht es Ihnen, Ereignisse nach einem bestimmten Zeitplan zu erstellen, um Ihre Arbeit auszuführen (vorausgesetzt, Sie haben keine externen Job-Scheduling-Tools).

Hoffentlich haben Sie irgendeine Art von Änderungsdatum, Sie können einmal am Tag oder in kürzeren Abständen alle Felder abfragen, in denen modified_at>=DATE_SUB(JETZT( ),INTERVALL ? STUNDE)

Wenn Sie eine Spalte hinzufügen können, könnten Sie eine mit dem Namen synced_at erstellen was etwas widerstandsfähiger gegen Serveruhrunterschiede wäre. Dann kannst du einfach abfragen wo synced_at IST NULL oder synced_at <=modified_at

MySQL unterstützt BEFORE- und AFTER-Trigger von INSERT / UPDATE / DELETE usw. Sie können diese verwenden, um Ihre Logik auszulösen. Denken Sie daran, dass Sie für jede Transaktion eine kleine Leistungseinbuße hinnehmen müssen, was sehr aktive Produktionsserver leicht überfordern kann.

Es gibt wirklich keinen großen Unterschied zwischen BEFORE und AFTER, außer dass Sie, wenn Sie die Trigger im BEFORE-Stil verwenden, einen sqlstate werfen können, um das Einfügen in die Quelltabelle zu verhindern, wenn es wichtig ist, dass beide Tabellen hochgradig synchronisiert sind.

Sync-Logik

Dies ist Pseudo-Code, aber...

# new and updated records
INSERT ... ON DUPLICATE KEY UPDATE ...
SELECT FROM source_table
JOIN target_table.id
WHERE target_table.id IS NULL or modified_at > DATE_SUB(NOW(), INTERVAL ..)

# deleted records

Dasselbe wie oben, nur manipulieren Sie jeweils nur einen Datensatz und spiegeln die Trigger-Anweisung. Zum Beispiel:Ein INSERT TRIGGER in der Quelltabelle sollte nur INSERT in der Zieltabelle abfragen.

Einfach, aber nicht für etwas anderes als vielleicht eine Berichtsdatenbank empfohlen. Löschen Sie die gesamte Tabelle und bauen Sie sie aus den anderen Datensätzen neu auf.