J'ai deux bases de données SQL Server. L'un est client (application Windows) et le second est sur le serveur. Je veux synchroniser ces deux bases de données de temps en temps (par exemple toutes les 2 minutes!).
J'ai lu différentes méthodes de synchronisation comme la réplication, l'horodatage, les tables de journal à l'aide de déclencheurs, Microsoft Sync Framework et ainsi de suite.
En fait, je n'aime pas utiliser une méthode de synchronisation qui pourrait être une boîte noire (comme la réplication) parce que je ne veux pas que les tables spécifiques à SQL Server soient bloquées pendant que je les mets à jour et les synchronise avec le serveur.
quelle méthode pensez-vous que je devrais utiliser dans de telles circonstances? N'oubliez pas que toutes les quelques minutes, je dois envoyer plusieurs modifications de table du client au serveur et récupérer également deux modifications de table du serveur.
J'ai trouvé une méthode étrange mais nouvelle. Est-il possible que j'enregistre toutes les procédures stockées exécutées (pour des préférences spécifiques) dans le client et les envoie avec leurs paramètres dans un
.sql
fichier au serveur et les y exécute? La même chose se produira sur le serveur et sera envoyée au client. Pensez-vous qu'il s'agit d'une méthode simple mais utile ou non?veuillez me suggérer toute approche utile si vous le pouvez. Merci beaucoup.
EDIT: N'oubliez pas qu'il s'agit d'une synchronisation en temps réel et que cela la rend spéciale. Cela signifie que lorsque l'utilisateur client utilise la table, le processus de synchronisation avec le serveur doit avoir lieu toutes les quelques minutes, donc aucune des tables ne doit être verrouillée.
la source
Réponses:
Eh bien, je ne comprends peut-être pas, mais j'essaie d'y répondre.
Vous avez dit que vous avez besoin d'une solution hautes performances qui fonctionne souvent (minimum toutes les 2 minutes) et vous avez besoin d'une bonne approche qui devrait être rapide sans verrouillage. Mais vous ne voulez pas d'un système de boîte noire.
Au lieu d'un système de boîte noire, qui est utilisé sur des millions d'installations avec de bons résultats, vous essayez de réinventer la roue et de construire votre propre solution? Hm, ça sonne un peu bizarre.
En fait, ce sont mes suggestions.
ISOLATION LEVEL
surREAD_COMMITTED_SNAPSHOT
. Vous pouvez en lire plus ici . Cela utilisera une partie de votre tempdb, mais votre table est toujours en lecture et en écriture et la réplication peut fonctionner en arrière-plan.Voir l'exemple ci-dessous:
CDC
peut être une chose fragile dans certaines circonstances.CDC
capturera toutes les données d'une table surveillée (vous devez spécifier manuellement chaque table surveillée). Ensuite, vous obtiendrez la valeur avant et la valeur après unINSERT
,UPDATE
ouDELETE
.CDC
retiendra ces informations pendant un certain temps (vous pouvez les spécifier vous-même). L'approche pourrait être d'utiliserCDC
sur certaines tables que vous devez surveiller et répliquer manuellement ces modifications dans l'autre base de données. Soit dit en passant,CDC
utilise également la réplication SQL Server sous le capot. ;-) Vous pouvez en savoir plus ici .Eh bien, ce sont mes 2 cents. J'espère que vous avez une bonne vue d'ensemble et que vous avez peut-être trouvé une solution qui vous convient.
la source
Je vais essayer d'énumérer ici quelques options avec des avantages et des inconvénients au fur et à mesure que je les perçois:
Microsoft Sync Framework - me semble plus adapté aux petites bases de données d'applications mobiles. Il ajoute un grand nombre de tables à votre base de données et n'est pas aussi efficace que la réplication. Comme il est implémenté en dehors de SQL Server en tant que composant, il sera plus difficile à configurer. Je n'en ai aucune expérience, je l'ai seulement essayé et j'ai décidé de ne pas l'utiliser.
Suivi des modifications de la base de données . Il s'agit d'une fonction SQL Server intégrée qui vous permet de modifier le suivi, y compris les insertions, les mises à jour et les suppressions. Tout le reste, comme l'envoi et l'application de modifications, la résolution de conflits, etc., vous devrez vous coder.
CDC comme mentionné dans la réponse d'Ionic - je n'ai aucune expérience avec cela, car il n'est disponible que dans les éditions Enterprise ou Developer.
L'utilisation de votre propre astuce avec la journalisation des procédures stockées exécutées - dépend beaucoup de la nature de votre application de base de données. Mais lorsque les procédures diffèrent peu, vous pouvez obtenir un gros gâchis de données. Et comment feriez-vous face aux conflits?
D'après votre question, il semble que vous ayez besoin de synchroniser seulement quelques tables et non toutes les grandes bases de données. À cette fin, vous devez analyser vos besoins plus en détail que ce que vous avez spécifié dans la question, comme:
Si vous finissez par découvrir que les suppressions et les conflits ne sont pas votre problème et que votre structure ne changera pas beaucoup, vous pouvez envisager d'écrire votre propre logique, mais elle peut facilement atteindre 1 000 lignes de code.
la source
Merci à tous pour vos commentaires.
J'ai réussi à résoudre le processus de synchronisation en capturant les procédures stockées exécutées non pas en tant que groupe mais une par une, ce qui fonctionnait très bien dans mon cas. L'intégrité et tout étant soigneusement pris en compte, le système fonctionne jusqu'à présent en temps réel.
la source
Réponse tardive, mais il pourrait être utile d'enfiler les visiteurs
J'ai eu un défi similaire à essayer de distribuer des données sur différents serveurs et à le résoudre en utilisant des outils tiers ( Diff pour les modifications de schéma et DataDiff pour la synchronisation des modifications de données) et en suivant le script PowerShell requis pour automatiser le processus:
Cette méthode planifie la comparaison entre deux bases de données et synchronise les modifications trouvées en temps réel. Voici quelques articles proposant des instructions étape par étape:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- schémas synchronisés /
la source