Ten eerste, waarom beantwoordt niemand van jullie de vraag van deze gast? Soms moeten we dit doen vanwege beveiligingsbeperkingen / compliance / legacy-systemen.
Er zijn enkele opties die ik hier zal schrijven met pseudo-code. Ik weet niet zeker hoe realtime uw database is, dus dit zal niet in alle gevallen werken.
Vereisten
Om dit te laten werken, moeten de databases zich in dezelfde serverinstantie bevinden. Als dat niet het geval is, moet u een federatieve opslagengine instellen om toegang te krijgen tot de externe gegevens. Zoals een andere persoon al zei, kan MySQL-replicatie nog steeds nuttig zijn om de gegevens op zijn minst naar dezelfde server te krijgen, waardoor de synchronisatie sneller wordt zonder de noodzaak om federatieve opslag in te stellen. Referentie:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
Synchronisatietijd
Met MySQL kunt u evenementen maken volgens een specifiek schema om uw werk uit te voeren (ervan uitgaande dat u geen externe tools voor taakplanning hebt).
Hopelijk heb je een of andere wijzigingsdatum, je kunt één keer per dag of kortere intervallen opvragen op alle velden waar modified_at
>=DATE_SUB(NOW( ),INTERVAL ? UUR)
Als u een kolom kunt toevoegen, kunt u er een maken met de naam synced_at
die iets beter bestand zou zijn tegen serverklokverschillen. Dan kun je eenvoudig opvragen waar synced_at
IS NULL of synced_at
<=modified_at
MySQL ondersteunt BEFORE en AFTER triggers van INSERT / UPDATE / DELETE etc... u kunt deze gebruiken om uw logica te activeren. Houd er rekening mee dat u voor elke transactie een kleine prestatiestraf krijgt en dat dit gemakkelijk zeer actieve productieservers kan overweldigen.
Er is niet echt een enorm verschil tussen BEFORE en AFTER, behalve dat als je de BEFORE-stijltriggers gebruikt, je een sqlstate kunt gooien om te voorkomen dat het in de brontabel wordt ingevoegd als het belangrijk is dat beide tabellen sterk gesynchroniseerd zijn.
Synchronisatielogica
Dit is pseudo-code, maar...
# 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
Hetzelfde als hierboven, alleen manipuleert u slechts één record tegelijk en spiegelt u de trigger-instructie. Bijvoorbeeld:een INSERT TRIGGER op de brontabel zou INSERT op de doeltabel moeten opvragen.
Eenvoudig maar niet aanbevolen voor iets anders dan misschien een rapportagedatabase. Laat de hele tabel vallen en herbouw deze vanuit de andere records.