Вопросы использования репликации транзакций

При использовании репликации транзакций следует учитывать следующие факторы:

  • Место в журнале транзакций.

  • Место на диске для базы данных распространителя.

  • Первичные ключи для публикуемых таблиц.

  • Триггеры.

  • Типы данных больших объектов.

  • Обновляемые подписки (если имеются). Дополнительные сведения по вопросам использования обновляемых подписок см. в разделе Обновляемые подписки для репликации транзакций.

Место в журнале транзакций

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

Если база данных распространителя недоступна или если не запущен агент чтения журнала, журнал транзакций базы данных публикации продолжает увеличиваться. Журнал не может быть усечен до тех пор, пока самая ранняя опубликованная транзакция не будет перемещена в базу данных распространителя. Чтобы учесть эти обстоятельства, рекомендуется задать для файла журнала транзакций автоматическое увеличение. Дополнительные сведения см. в разделах CREATE DATABASE (Transact-SQL) и ALTER DATABASE (Transact-SQL).

Рекомендуется установить для базы данных распространителя параметр sync with backup, который определяет задержку усечения журнала базы данных публикации до тех пор, пока не будет выполнено резервное копирование соответствующих транзакций в базе данных распространителя. Это может привести к увеличению журнала транзакций в базе данных публикации. Дополнительные сведения об этом параметре см. в разделе Стратегии резервного копирования и восстановления из копии репликации моментальных снимков и репликации транзакций.

Место на диске для базы данных распространителя

Убедитесь в том, что на диске имеется достаточно свободного места для хранения реплицируемых транзакций в базе данных распространителя:

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

  • Если создается публикация транзакций и файлы моментальных снимков доступны подписчикам немедленно, транзакции хранятся до истечения большего из следующих сроков: либо пока они не будут реплицированы на всех подписчиках, либо пока не будет запущен агент моментальных снимков, который создаст новый моментальный снимок. Если время между запусками агента моментальных снимков больше максимального времени хранения распространения для публикации, которое по умолчанию составляет 72 часа, транзакции, хранящиеся больше срока хранения, удаляются из базы данных распространителя. Дополнительные сведения см. в разделе Окончание срока действия и отключение подписки.

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

Первичные ключи для публикуемых таблиц

Все таблицы, публикуемые в репликации транзакций, должны содержать объявленный первичный ключ. Подготовка существующих таблиц для публикации заключается в добавлении первичного ключа с использованием Transact-SQL-инструкции ALTER TABLE (Transact-SQL).

Триггеры

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

  • По умолчанию триггеры выполняются с параметром XACT_ABORT равным ON. Если инструкция с триггером вызывает ошибку, пока агент распространителя применяет изменения на стороне подписчика, завершится со сбоем работа всего пакета изменений, а не отдельной инструкции. Для пропуска инструкций, вызывающих ошибки, в репликации транзакций можно использовать параметр -SkipErrors агента распространителя. Если параметр -SkipErrors используется вместе с XACT_ABORT ON, весь пакет изменений пропускается в том случае, если инструкция вызывает ошибку. Если в триггерах не требуется использовать XACT_ABORT, то рекомендуется его отключить, если используется параметр -SkipErrors. Чтобы отключить параметр, укажите в определении триггера SET XACT_ABORT OFF. Дополнительные сведения о XACT_ABORT см. в разделе SET XACT_ABORT (Transact-SQL). Дополнительные сведения о параметре -SkipErrors см. в разделе Пропуск ошибок в репликации транзакций.

  • Рекомендуется не включать в триггеры на подписчике явные транзакции. В репликации транзакций для сокращения количества обращений к сети и, соответственно, увеличения производительности используются пакеты транзакций. Если на подписчике добавляются триггеры с инструкциями ROLLBACK, пакеты транзакций могут быть отменены и может быть выдано сообщение об ошибке сервера 266 (Количество транзакций после EXECUTE указывает, что отсутствует инструкция COMMIT или ROLLBACK TRANSACTION. Предыдущее количество = %ld, текущее количество = %ld.). В пакете могут содержаться команды из нескольких транзакций или пакет может быть частью большой транзакции на издателе, поэтому откат транзакций может нарушить их целостность.

    Если явные транзакции не включены, убедитесь в том, что в триггере все инструкции COMMIT имеют соответствующие инструкции BEGIN TRANSACTION. Оператор COMMIT без соответствующей инструкции BEGIN TRANSACTION вызывает применение изменений строк на подписчике вне транзакции. Кроме того, позднее это может привести к ошибке, если агент распространителя обнаружит ошибку сервера 266 и попытается выполнить откат транзакции или пакета команд, чтобы применить их еще раз. Если агент пытается применить команды, которые уже были применены, это приводит к ошибкам дублирующего ключа.

Дополнительные сведения о триггерах см. в разделе Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».

Типы данных больших объектов

Репликация транзакций поддерживает публикацию LOB и выполняет частичное обновление столбцов LOB: если столбец LOB обновлен, реплицируется только измененный фрагмент данных, а не все данные в столбце.

Если публикуемая таблица содержит какие-либо данные большого тип-объекта (LOB), рассмотрите возможность использования следующих параметров агента распространителя: -UseOledbStreaming, -OledbStreamThreshold и -PacketSize. Наиболее простой способ настройки этих параметров — использование профиля агента распространителя с названием Профиль распространителя для потоковой передачи данных OLEDB. Дополнительные сведения см. в разделе Профили агента репликации. В дополнение к этому предопределенному профилю можно указывать параметр в создаваемом или изменяемом профиле агента или в командной строке. Дополнительные сведения см. в следующих разделах.

Типы данных text, ntext и image

Процесс репликации типов данных text, ntext и image в публикации транзакций имеет несколько факторов. Рекомендуется использовать типы данных varchar(max), nvarchar(max), varbinary(max) вместо text, ntext и image соответственно.

Если используете типы text, ntext или image, имейте в виду следующее:

  • В явных транзакциях инструкции WRITETEXT и UPDATETEXT должны быть свернутыми.

  • Операции регистрации текстовых данных могут реплицироваться с помощью инструкций WRITETEXT и UPDATETEXT при включенном в публикуемых таблицах параметре WITH LOG. Параметр WITH LOG необходим, так как репликация транзакций отслеживает изменения в журнале транзакций.

  • Операции UPDATETEXT могут использоваться только в том случае, если запущены все подписчики SQL Server. Операции WRITETEXT реплицируются как инструкции UPDATE, поэтому их можно использовать с подписчиками, отличными от SQL Server.

  • Настраиваемый параметр max text repl size управляет максимальным размером (в байтах) реплицируемых данных типов text, ntext, varchar(max), nvarchar(max) и image. Это обеспечивает поддержку: драйверов ODBC и поставщиков OLE DB, экземпляров компонента SQL Server Database Engine, не способных обрабатывать большие значения для этих типов данных, а также распространителей с ограничениями системных ресурсов (виртуальной памяти). При публикации столбца, содержащего один из этих типов данных, выполнение операции INSERT, UPDATE, WRITETEXT или UPDATETEXT, превышающей установленный предел, может завершиться ошибкой.

    Используйте системную хранимую процедуру sp_configure (Transact-SQL), чтобы настроить параметр max text repl size.

  • При публикации столбцов text, ntext и image необходимо получить указатель текста в той же транзакции, которая используется для операции UPDATETEXT или WRITETEXT (с повторяемостью чтения). К примеру, нельзя получить указатель текста в одной транзакции, а затем использовать его в другой транзакции. Указатель может переместиться и стать недопустимым.

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

    Рекомендуемый способ использования операций UPDATETEXT или WRITETEXT с реплицируемыми данными:

    1. Начните транзакцию.

    2. Получите текстовый указатель с помощью функции TEXTPTR() с уровнем изоляции REPEATABLE READ.

    3. Используйте текстовый указатель в операции UPDATETEXT или WRITETEXT.

    4. Зафиксируйте транзакцию.

      ПримечаниеПримечание

      Если текстовый указатель не получен в той же транзакции, то изменения на издателе разрешены, но эти изменения не публикуются на подписчиках.

    Например:

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    BEGIN TRAN
    DECLARE @mytextptr varbinary(16)
    SELECT @mytextptr = textptr(Notes)
    FROM Employees 
    WHERE EmployeeID = '7'
    IF @mytextptr IS NOT NULL 
    BEGIN
    UPDATETEXT Employees.Notes @mytextptr 0 NULL 'Terrific job this review period.'
    -- Dummy update to fire trigger that will update metadata and ensure the update gets propagated to other Subscribers.
    UPDATE Employees 
    -- Set value equal to itself.
    SET Notes = Notes
    WHERE EmployeeID = '7' 
    END
    COMMIT TRAN 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    
ПримечаниеПримечание

Данный пример основан на базе данных Northwind, которая по умолчанию не устанавливается. Дополнительные сведения об установке этой базы данных см. на странице Образцы баз данных Northwind и pubs в центре загрузки Майкрософт.

Вопрос изменения размера баз данных подписчиков заключается в том, что текстовый указатель для реплицируемых столбцов text, ntext и image должен инициализироваться таблицами подписчика, даже если они не инициализированы на издателе. Следовательно, каждый столбец типа text, ntext и image, добавленный в таблицу подписчика задачей распространения, занимает не менее 43 байтов базы данных, даже если столбцы пусты.