Używając replikacji transakcyjnej SQL 2008 R2 z subskrybentami ściągającymi, kiedy dodajemy artykuł, chciałbym uniknąć konieczności tworzenia całej migawki (db wynosi ~ 80 GB, więc zajmuje to wiele godzin).
W tym artykule widziałem, jak to zrobić z częściową migawką, wyłączając natychmiastową synchronizację, ale to nie działało dla nas.
Idealnie chciałbym uruchomić to jako część naszego skryptu db, aby utworzyć tabelę, więc jeśli chcemy, aby została zreplikowana, wykonujemy:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
źródło
źródło
Miałem to samo pytanie i mimo że od dłuższego czasu jestem DBA, tak naprawdę nie zajmowałem się replikacją na tyle głęboko, aby czuć się z nią komfortowo, więc pomyślałem, że pomocne były następujące zasoby i przewodniki:
Ten blog , który przedstawił dobry zarys tego procesu. Przypomina nam również, że jeśli masz już dużą publikację, a jej opcja jest ustawiona na „natychmiastowa_synchronizacja”, spowoduje to, że za każdym razem, gdy dodasz lub zmienisz artykuł, zostanie przygotowana zupełnie nowa migawka. Ma więc praktyczną wskazówkę, aby zmienić tę opcję, używając
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
Post na blogu MSDN w „repltalk” (ogólnie rzecz biorąc brzmi jak dobry zasób!) - niezwiązany „bezpośrednio”, ale nadal pomocny
To pytanie, w którym @ Brandon-Williams wskazał, że jeśli jest to subskrypcja Pull , należy ją również odświeżyć, używając
sp_refreshSubscriptions @publication = 'MyPub'
Monitor replikacji SSMS - wygodny sposób na zatrzymanie i uruchomienie agentów (migawka, czytnik logów) podczas wykonywania instrukcji.
Oto rzeczywiste kroki, które wykonałem, które działały dobrze i spotkały się z aprobatą mojego nadzorującego DBA:
sp_changePublication
- tak, jak wskazuje @cody_konior, jest to niedokumentowane, ale w moim przypadku działało dobrze. YMMVsp_addArticle
sp_articleColumn
(określona publikacja i artykuł, NIE DOTYCZY określ kolumn -> implikuje WSZYSTKIE kolumny)sp_refreshSubscriptions
dla tej publikacji w celu odświeżenia ściągaczaI chociaż tak, większość zmian można wykonać za pomocą graficznego interfejsu użytkownika SSMS, uważam, że pomocne jest wykonanie skryptu w całości, aby mógł to być A) pod kontrolą źródła (kontrola zmian) i B) wdrażany wielokrotnie lub w wielu instancjach . Niestety nie spędziłem czasu na pisanie skryptów zatrzymywania / uruchamiania agenta, ale nie powinno to być zbyt trudne, biorąc pod uwagę, że są to tylko zadania agenta SQL. Musisz po prostu zrobić całą „sztuczkę JobID przy użyciu Job-Name” (zapytanie
sysjobs
- naprawdę, MS?) ...Mam nadzieję, że pomoże przyszłym czytelnikom!
źródło
Jak wspomniano w artykule Dodawanie artykułów i usuwanie artykułów z istniejących publikacji , należy * utworzyć nową migawkę publikacji.
Aby uniknąć generowania migawki dla wszystkich artykułów podczas dodawania nowego artykułu, właściwość publikacji
immediate_sync
musi być ustawiona na 0.sp_addarticle
Następnie wywołajsp_addsubscription
. Jeśli subskrypcje są ściągane, musisz również zadzwonićsp_refreshsubscriptions
. Następnie wygeneruj migawkę i wygenerowana zostanie tylko migawka dla nowo dodanego artykułu.* Jest to zalecane podejście w SQL Server Books Online. Problem z twoim podejściem polega na tym, że jest podatny na błędy.
źródło
Ważna edycja Ważna Jest to kompletne przepisanie tej odpowiedzi (biorąc pod uwagę słuszną krytykę, że poprzednia wersja była podatna na błędy i powodowała problemy)
Udostępniono również demonstrację tego, jak zastosować to do: Youtube - replikacja serwera SQL: jak dodać artykuł bez robienia migawki .
WAŻNE: NIE jest to zalecane podejście Microsoftu, więc będziesz działał samodzielnie, jeśli chodzi o uruchomienie go, NIE aplikuj bezpośrednio do środowiska produkcyjnego bez znaczących izolowanych testów i poczucia komfortu podczas wykonywania kroków!
Kroki do naśladowania:
Do weryfikacji:
PRZYKŁAD Proces
A) Stwórz sobie tabelę w swoim wydawcy:
B) Utwórz sobie zadanie / proc / skrypt, aby wykonać wstawianie / aktualizację / usuwanie w [TableNotUsingSnap] (możesz następnie użyć tego do sprawdzenia poprawności synchronizacji subskrybenta przy użyciu tej metody.
Wstępne kroki:
1. Utwórz tabelę na subskrybencie
2. Utwórz procedury składowane replikacji (aktualizuj / wstaw / usuń) - u subskrybenta
Możesz utworzyć repl procs:
Zmiana, którą będziesz musiał zastosować:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
aby nie wstawiać, jeśli już tam jestIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
aby zignorować aktualizację, która nie jest stosowana (ponieważ rekord mógł zostać usunięty przez wydawcę przed zsynchronizowaniem danych)IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
aby zignorować usunięcie, które nie jest stosowane (ponieważ rekord mógł zostać usunięty przez wydawcę przed zsynchronizowaniem danych)sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
KROKI WDROŻENIA
3. Zatrzymaj agenta dystrybucyjnego - na dystrybutorze (Push) lub subskrybencie (Pull)
4. Teraz dodaj artykuł do publikacji - Na wydawcy
Kluczowe parametry:
sp_addarticle
-@pre_creation_cmd = N'none'
służy do informowania agenta dystrybucji, aby nie upuszczał i nie generował własnych obiektówsp_addsubscription
-@sync_type = N'none'
używany, aby powiedzieć Distributerowi, że nie musi tworzyć nowej migawki, może po prostu ustawiać w kolejce polecenia IUDsp_addarticle:
5. Zsynchronizuj swoje dane
Teraz musisz skopiować swoje dane do subskrybenta, możesz:
Dokładną metodę, której używasz, pozostawiam czytelnikowi, będzie to również zależeć od tego, jak długo jesteś gotów zatrzymać Agenta Dystrybucyjnego.
DODATKOWO: Jako dodatkowy krok w twoich testach, tutaj jest dobre miejsce do uruchomienia skryptu (od kroku (B)), aby utworzyć akcje IUD na [TableNotUsingSnap], abyś mógł zyskać zaufanie do tej metody.
6. Uruchom ponownie agenta dystrybucji - na dystrybutorze (Push) lub subskrybencie (Pull)
źródło