Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment synchroniser les données entre deux tables dans différentes bases de données (MYSQL) exécutées sur différents serveurs

Tout d'abord, pourquoi aucun d'entre vous ne répond à la question de ce mec ? Parfois, nous devons le faire en raison de restrictions de sécurité/de conformité/de systèmes hérités.

Il y a quelques options que j'écrirai ici avec un pseudo-code. Vous ne savez pas à quel point votre base de données est en temps réel, cela ne fonctionnera donc pas dans tous les cas.

Exigences

Pour que cela fonctionne, les bases de données devront se trouver dans la même instance de serveur. Sinon, vous devrez configurer un moteur de stockage fédéré pour accéder aux données distantes. Comme une autre personne l'a déclaré, la réplication MySQL pourrait toujours être utile pour au moins obtenir les données sur le même serveur, ce qui accélère la synchronisation sans avoir besoin de configurer un stockage fédéré. Référence :https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html

Synchronisation

MySQL vous permettra de créer des événements selon un calendrier spécifique pour effectuer votre travail (en supposant que vous ne disposez d'aucun outil de planification de travail externe).

J'espère que vous avez une date modifiée quelconque, vous pouvez interroger une fois par jour ou des intervalles plus serrés sur tous les champs où modified_at>=DATE_SUB(MAINTENANT( ),INTERVALLE ? HEURE)

Si vous pouvez ajouter une colonne, vous pouvez en créer une appelée synced_at qui serait un peu plus résistant aux différences d'horloge des serveurs. Ensuite, vous pouvez simplement demander où synced_at EST NULL ou synced_at <=modified_at

MySQL prend en charge les déclencheurs AVANT et APRÈS de INSERT / UPDATE / DELETE etc ... vous pouvez les utiliser pour déclencher votre logique. Gardez à l'esprit que vous subirez une légère pénalité de performance pour chaque transaction, ce qui peut facilement submerger des serveurs de production très actifs.

Il n'y a vraiment pas une grande différence entre AVANT et APRÈS, sauf que si vous utilisez les déclencheurs de style AVANT, vous pouvez lancer un sqlstate pour empêcher l'insertion dans la table source s'il est important que les deux tables soient hautement synchronisées.

Logique de synchronisation

C'est du pseudo code mais...

# 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

Comme ci-dessus, vous ne manipulez qu'un seul enregistrement à la fois et vous reproduisez l'instruction de déclenchement. Par exemple :un INSERT TRIGGER sur la table source doit simplement interroger INSERT sur la table cible.

Simple mais déconseillé pour autre chose que peut-être une base de données de rapports. Supprimez la table entière et reconstruisez-la à partir des autres enregistrements.