Подписчики репликации и группы доступности AlwaysOn (SQL Server)

Область применения: SQL Server

Когда выполняется отработка отказа группы доступности AlwaysOn, содержащая базу данных, которая является подписчиком репликации, подписка репликации может завершиться ошибкой. Для владельцев принудительной подписки на репликацию транзакций агент распространителя сможет продолжить репликацию автоматически после отработки отказа, если подписка была создана с использованием имени прослушивателя группы доступности. Для владельцев подписки по запросу на репликацию транзакций агент распространителя сможет продолжить репликацию автоматически после отработки отказа, если подписка была создана с использованием имени прослушивателя группы доступности, а исходный сервер подписчика настроен и запущен. Это обусловлено тем, что задания агента распространения создаются только для исходного подписчика (первичная реплика группы доступности). Для подписчиков на публикацию слиянием администратор репликации должен вручную перенастроить подписчик путем повторного создания подписки.

Поддерживаемые возможности

Репликация SQL Server поддерживает автоматическую отработку отказа издателя и автоматическую отработку отказа подписчиков транзакций. Подписчики слияния могут быть частью группы доступности, однако для настройки нового подписчика после отработки отказа требуются действия вручную. Группы доступности не могут сочетаться с сценариями WebSync и SQL Server Compact.

Создание транзакционной подписки в группе доступности

Для репликации транзакций выполните следующие действия, чтобы настроить и выполнить отработку отказа группы доступности подписчика.

  1. Перед созданием подписки добавьте базу данных подписчика в соответствующую группу доступности.

  2. Добавьте прослушиватель группы доступности подписчика в качестве связанного сервера ко всем узлам группы доступности. Это действие гарантирует, что все возможные участники отработки отказа будут знать о существовании прослушивателя и смогут к нему подключиться.

  3. С помощью скрипта в разделе "Создание принудительной репликации транзакций" создайте подписку с помощью имени прослушивателя группы доступности подписчика. После отработки отказа имя прослушивателя всегда будет допустимым, а фактическое имя сервера подписчика будет зависеть от того, какой узел стал основным.

    Примечание.

    Подписка должна быть создана с использованием сценария Transact-SQL и не может быть создана с использованием Среда Management Studio.

  4. Создание подписки по запросу.

    1. Используя пример скрипта в разделе "Создание подписки на репликацию транзакций", создайте подписку с помощью имени прослушивателя группы доступности подписчика.

    2. После отработки отказа создайте задание агента распространителя на новой первичной реплике с помощью хранимой sp_addpullsubscription_agent процедуры.

При создании подписки на вытягивание с базой данных подписки в группе доступности после каждой отработки отказа рекомендуется отключить задание агента распространителя на старой первичной реплике и включить задание на новой первичной реплике.

Создание принудительной подписки репликации транзакций

-- commands to execute at the publisher, in the publisher database:
USE [<publisher database name>];
GO

EXEC sp_addsubscription @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @destination_db = N'<subscriber database name>',
    @subscription_type = N'Push',
    @sync_type = N'automatic',
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0;
GO
  
EXEC sp_addpushsubscription_agent @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @subscriber_db = N'<subscriber database name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

Создание подписки на извлечение репликации транзакций

-- commands to execute at the subscriber, in the subscriber database:
USE [<subscriber database name>];
GO

EXEC sp_addpullsubscription @publisher = N'<publisher name>',
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @subscription_type = N'pull';
GO

EXEC sp_addpullsubscription_agent @publisher = N'<publisher name>',
    @subscriber = N'<AG listener name>',
    @distributor = N'<distributor AG listener name>', -- this parameter should only be used if the distribution database is part of an AG.
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

Примечание.

При запуске sp_addpullsubscription_agent для подписчика, являющегося частью группы доступности, необходимо передать @Subscriber значение параметра в хранимую процедуру в качестве имени прослушивателя группы доступности. Если вы используете SQL Server 2016 (13.x) и более ранних версий или SQL Server 2017 (14.x) до накопительного обновления 16, хранимая процедура не будет ссылаться на имя прослушивателя группы доступности; он будет создан с именем сервера подписчика, на котором выполняется команда. Чтобы устранить эту проблему, вручную обновите @Subscriber параметр в задании агент распространения со значением имени прослушивателя группы доступности.

Возобновление агентов слияния после отработки отказа группы доступности подписчика

Для репликации слиянием администратор репликации должен вручную перенастроить подписчик следующим образом.

  1. Для удаления старой подписки подписчика выполните процедуру sp_subscription_cleanup. Запустите действие на новой первичной реплике (которая раньше была вторичной репликой).

  2. Создайте подписку заново, начиная с нового моментального снимка.

Примечание.

Текущий процесс является неудобным для подписчиков репликации слиянием, однако основной сценарий репликации слиянием отключен пользователей (настольных компьютеров, ноутбуков, устройств с набором устройств), которые не будут использовать группы доступности на подписчике.

См. также