Subskrypcja nie istnieje, gdy replika podstawowa dystrybutora przełączy się w tryb failover do repliki, która nie używa tego samego profilu agenta

Ten artykuł ułatwia obejście subskrypcji nie istnieje błąd, który występuje, gdy replika podstawowa dystrybutora przełączy się w tryb failover do repliki, która nie używa tego samego profilu agenta.

Oryginalna wersja produktu: SQL Server 2017 Developer, SQL Server 2017 Enterprise, SQL Server 2017 Enterprise Core
Oryginalny numer KB: 4488815

Symptomy

Rozważmy następujący scenariusz:

  • W programie SQL Server 2017 masz agenta dystrybucji, który nie używa domyślnego profilu agenta.
  • Baza danych dystrybucji jest dodawana do grupy dostępności.
  • Replika podstawowa bazy danych dystrybucji przełączy się w tryb failover do repliki, która nie używa dokładnie tego samego profilu agenta.

W tym scenariuszu agent dystrybucji kończy się niepowodzeniem i zostanie wyświetlony następujący komunikat o błędzie:

Subskrypcja nie istnieje.

Przyczyna

Profile agentów są zarządzane i utrwalane w msdb bazie danych. Zmiany profilu agenta są utrwalane msdb i nie mogą być wysyłane do innych dystrybutorów w bazie danych dystrybucji grupy dostępności.

Agenci replikacji są skojarzeni z profilem za pomocą polecenia profile_id. Po przejściu w tryb failover agent może nie znaleźć prawidłowego profilu. Alternatywnie może się okazać, że nieprawidłowy profil. Ponieważ profil niezdefiniowany w jednym dystrybutorze może się różnić od innego dystrybutora lub nigdy nie istniał lub może mieć inny profile_idelement .

Zadanie agenta dystrybucji wystawia procedurę sp_MShelp_distribution_agentid składowaną w celu pobrania identyfikatora agenta podczas jego uruchamiania. Jeśli profil nie istnieje lub identyfikatory profilów są inne, zadanie agenta dystrybucji nie otrzymuje identyfikatora agenta i zwraca komunikat o błędzie subskrypcji.

Rozwiązanie

Aby obejść ten problem, użyj jednej z następujących metod:

  • Określ parametry bezpośrednio w poleceniu agenta dystrybucji zamiast używać profilu agenta. Ponadto zastosuj zmiany do zadania agenta dystrybucji we wszystkich replikach dystrybutora.

  • Upewnij się, że profil agenta został utworzony we wszystkich dystrybutorach uczestniczących w bazie danych dystrybucji grupy dostępności i upewnij się, że identyfikatory profilów są takie same.

Agent dystrybucji uruchamia procedurę sp_MShelp_distribution_agentid składowaną, aby uzyskać profil agenta. Jeśli profil agenta nie istnieje lub jeśli identyfikator profilu jest inny, nie można odnaleźć prawidłowego profilu agenta i zostanie zwrócony komunikat o błędzie Subskrypcja nie istnieje .

Aby zapobiec temu problemowi, określ prawidłowy profil agenta (identyfikator profilu) w procedurze sp_MShelp_distribution_agentid składowanej.

Poniżej przedstawiono segment sp_MShelp_distribution_agentid kodu procedury składowanej:

SELECT distribAgent.id,
    distribAgent.name,
    distribAgent.publisher_database_id,
    distribAgent.publisher_db,
    distribAgent.subscriber_db,
    profileName.profile_id,
    profileName.profile_name
FROM MSdistribution_agents AS distribAgent
INNER JOIN msdb..MSagent_profiles AS profileName
    ON distribAgent.profile_id = profileName.profile_id