Mam dwie bazy danych SQL Server. Jeden to klient (aplikacja Windows), a drugi znajduje się na serwerze. Chcę synchronizować te dwie bazy danych tak często (np. Co 2 minuty!).
Czytałem o różnych sposobach synchronizacji, takich jak replikacja, znacznik czasu, tabele dziennika przy użyciu wyzwalaczy, Microsoft Sync Framework i tak dalej.
Właściwie nie lubię używać metody synchronizacji, która może być czarną skrzynką (jak replikacja), ponieważ nie chcę, aby tabele specyficzne dla SQL Server były blokowane podczas ich aktualizacji i synchronizacji z serwerem.
jaką metodę według ciebie powinienem zastosować w takich okolicznościach? Pamiętaj, że co kilka minut muszę wysyłać kilka zmian tabeli z klienta na serwer i pobrać także dwie zmiany tabeli z serwera.
Znalazłem metodę, która jest dziwna, ale nowa. Czy to możliwe, że rejestruję wszystkie wykonywane (dla określonych preferowanych) procedur przechowywanych w kliencie i wysyłam je wraz z parametrami do
.sql
pliku na serwer i tam je wykonuję? To samo stanie się na serwerze i wysłane do klienta. Czy uważasz, że jest to prosta, ale przydatna metoda, czy nie?proszę zasugeruj mi jakieś użyteczne podejście, jeśli możesz. Dziękuję bardzo.
EDYCJA: Pamiętaj, że jest to synchronizacja w czasie rzeczywistym, co czyni ją wyjątkową. Oznacza to, że gdy użytkownik klienta korzysta z tabeli, proces synchronizacji z serwerem musi się odbywać co kilka minut, więc żadna z tabel nie musi być zablokowana.
źródło
Odpowiedzi:
Cóż, może nie rozumiem, ale staram się na nie odpowiedzieć.
Powiedziałeś, że potrzebujesz wysokowydajnego rozwiązania, które często działa (minimum wszystkie 2 minuty) i potrzebujesz dobrego podejścia, które powinno być szybkie bez blokowania. Ale nie chcesz systemu blackbox.
Zamiast systemu blackbox, który jest używany w milionach instalacji z dobrymi wynikami, próbujesz wymyślić koło ponownie i zbudować własne rozwiązanie? Hm, brzmi trochę dziwnie.
W rzeczywistości są to moje sugestie.
ISOLATION LEVEL
naREAD_COMMITTED_SNAPSHOT
. Możesz przeczytać więcej na ten temat tutaj . To zużyje część twojego tempdb, ale twoja tabela jest zawsze do odczytu i zapisu, a replikacja może działać w tle.Zobacz przykład poniżej:
CDC
w niektórych okolicznościach może być delikatne.CDC
przechwyci wszystkie dane z obserwowanej tabeli (musisz ręcznie określić każdą obserwowaną tabelę). Następnie otrzymasz wartość przed, a wartość poINSERT
,UPDATE
lubDELETE
.CDC
zatrzyma te informacje przez pewien czas (możesz je podać samodzielnie). Podejściem może być użycieCDC
w niektórych tabelach, które należy oglądać i ręcznie replikować te zmiany do innej bazy danych. Nawiasem mówiąc,CDC
używa również replikacji SQL Server pod maską. ;-) Możesz przeczytać o tym więcej tutaj .To są moje 2 centy. Mam nadzieję, że masz dobry przegląd i być może znalazłeś jedno rozwiązanie, które będzie dla ciebie odpowiednie.
źródło
Spróbuję wymienić tutaj niektóre opcje z zaletami i wadami, gdy je dostrzegam:
Microsoft Sync Framework - wydaje mi się bardziej odpowiedni dla mniejszych baz danych aplikacji mobilnych. Dodaje do bazy danych sporo tabel i nie jest tak wydajna jak replikacja. Ponieważ jest implementowany poza SQL Server jako komponent, konfiguracja będzie trudniejsza. Nie mam z tym doświadczenia, tylko wypróbowałem go i postanowiłem go nie używać.
Śledzenie zmian w bazie danych . Jest to wbudowana funkcja SQL Server, która wykonuje śledzenie zmian, w tym wstawiania, aktualizacji i usuwania. Wszystko inne, jak wysyłanie i stosowanie zmian, rozwiązywanie konfliktów itp., Będziesz musiał sam kodować.
CDC, jak wspomniano w odpowiedzi Ionic - nie mam z tym doświadczenia, ponieważ jest dostępny tylko w wersjach Enterprise lub Developer.
Korzystanie z własnej sztuczki przy rejestrowaniu wykonanych procedur przechowywanych - zależy w dużej mierze od charakteru aplikacji bazy danych. Ale kiedy procedury stają się nieco inne, możesz mieć duży bałagan w danych. A jak poradziłbyś sobie z konfliktami?
Z twojego pytania wynika, że musisz zsynchronizować tylko kilka tabel, a nie całe duże bazy danych. W tym celu należy przeanalizować swoje potrzeby bardziej szczegółowo niż określono w pytaniu, na przykład:
Jeśli w końcu okaże się, że usuwanie i konflikty nie są twoim problemem i że twoja struktura niewiele się zmieni, możesz rozważyć napisanie własnej logiki, ale z łatwością może ona wzrosnąć do 1000 wierszy kodu.
źródło
Dziękujemy wszystkim za opinie.
Z powodzeniem rozwiązałem proces synchronizacji, przechwytując wykonane procedury przechowywane nie jako kilka, ale jedna po drugiej, co w moim przypadku działało świetnie. Ponieważ rzetelność i wszystko jest dokładnie przemyślane, do tej pory system działał w czasie rzeczywistym.
źródło
Późna odpowiedź, ale pomocne mogą być odwiedzający wątki
Miałem podobne wyzwanie, próbując dystrybuować dane między różnymi serwerami i rozwiązałem je za pomocą narzędzi firm trzecich ( Diff w przypadku zmian schematu i DataDiff w przypadku synchronizacji zmian danych) i wykonania skryptu PowerShell wymaganego do automatyzacji procesu:
Ta metoda planuje porównanie dwóch baz danych i synchronizuje znalezione zmiany w czasie rzeczywistym. Oto kilka artykułów zawierających instrukcje krok po kroku:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- schemas-in-sync /
źródło