Mysql
 sql >> Database >  >> RDS >> Mysql

Come sincronizzare i dati tra due tabelle in database diversi (MYSQL) in esecuzione su server diversi

Prima di tutto, perché nessuno di voi risponde alla domanda di questo tizio? A volte dobbiamo farlo a causa di restrizioni di sicurezza/conformità/sistemi legacy.

Ci sono alcune opzioni che scriverò qui con pseudo codice. Non sono sicuro di quanto sia in tempo reale il tuo database, quindi non funzionerà in tutti i casi.

Requisiti

Affinché ciò funzioni, i database dovranno trovarsi nella stessa istanza del server. In caso contrario, sarà necessario configurare un motore di archiviazione federato per accedere ai dati remoti. Come ha affermato un'altra persona, la replica di MySQL potrebbe comunque essere utile per portare i dati almeno sullo stesso server rendendo la sincronizzazione più veloce senza la necessità di configurare l'archiviazione federata. Riferimento:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html

Sincronizzazione dei tempi

MySQL ti consentirà di creare eventi in base a una pianificazione specifica per eseguire il tuo lavoro (supponendo che tu non disponga di strumenti di pianificazione dei lavori esterni).

Si spera che tu abbia una data modificata di qualche tipo, puoi interrogare una volta al giorno o intervalli più ristretti su tutti i campi in cui modified_at>=DATE_SUB(ORA( ),INTERVALLO ? ORA)

Se sei in grado di aggiungere una colonna, puoi crearne una chiamata synced_at che sarebbe un po' più resistente alle differenze di clock del server. Quindi puoi semplicemente interrogare dove synced_at È NULL o synced_at <=modified_at

MySQL supporta i trigger PRIMA e DOPO di INSERT / UPDATE / DELETE ecc... puoi usarli per attivare la tua logica. Tieni presente che subirai una piccola penalizzazione delle prestazioni per ogni transazione e questo può facilmente sopraffare i server di produzione molto attivi.

Non c'è davvero un'enorme differenza tra BEFORE e AFTER tranne per il fatto che se usi i trigger di stile BEFORE puoi lanciare uno sqlstate per impedire l'inserimento nella tabella di origine se è importante che entrambe le tabelle siano altamente sincronizzate.

Sincronizza logica

Questo è uno pseudo codice ma...

# 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

Come sopra, solo stai manipolando un record alla volta e stai rispecchiando l'istruzione trigger. Ad esempio:un INSERT TRIGGER sulla tabella di origine dovrebbe semplicemente interrogare INSERT sulla tabella di destinazione.

Semplice ma non consigliato per nient'altro che forse un database di reporting. Elimina l'intera tabella e ricostruiscila dagli altri record.