sql >> Database >  >> RDS >> Mysql

Gegevens synchroniseren tussen twee tabellen in verschillende databases (MYSQL) die op verschillende servers worden uitgevoerd

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.



  1. Vertrouwen herstellen in een externe sleutelbeperking in SQL Server (T-SQL-voorbeelden)

  2. Voorbeeld filterhaak om item met gerelateerd veld bij te werken

  3. Naam SQL-queryparameter moet worden gedefinieerd

  4. hoe te bestellen op een dynamische kolomnaam in EntityFramework?