Поделиться через


Средство устранения неполадок: поиск ошибок, связанных с репликацией транзакций SQL Server

Область применения: SQL Server Управляемый экземпляр SQL Azure

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

В результате этой процедуры публикация создается и переводится в состояние синхронизации. Синхронизация осуществляется в три этапа.

  1. Транзакции происходят в реплицируемых объектах и помечаются для репликации в журнале транзакций.

  2. Агент чтения журналов сканирует журнал транзакций и ищет транзакции, помеченные как "для репликации". Затем эти транзакции сохраняются в базе данных распространителя.

  3. Агент распространения просматривает базу данных распространителя с помощью потока чтения. Затем с помощью потока записи этот агент подключается к подписчику, чтобы применить к нему изменения.

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

Примечание.

Цель этого руководства — научить методам устранения неполадок. Оно призвано не помочь в устранении конкретных ошибок, а предоставить общие указания по выявлению ошибок репликации. В нем приводится ряд конкретных примеров, но их решение может отличаться в зависимости от среды. Примеры ошибок основаны на учебном пособии: настройка репликации между двумя полностью подключенными серверами (транзакционный).

Методы устранения неполадок

Вопросы

  1. На каком этапе синхронизации происходит сбой репликации?
  2. В каком агенте возникает ошибка?
  3. Когда в последний раз репликация завершилась успешно? Изменилось ли что-нибудь с того момента?

Действия для выполнения

  1. Используйте монитор репликации, чтобы определить, в какой точке репликации возникает ошибка (какой агент?):

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

  3. Попробуйте определить решение проблемы.

Поиск ошибок с помощью агента моментальных снимков

Агент моментальных снимков создает моментальный снимок и записывает его в указанную папку.

  1. Просмотрите состояние агента моментальных снимков.

    1. В обозревателе объектов разверните узел Локальная публикация в разделе Репликация.

    2. Щелкните публикацию правой кнопкой мыши и выберите пункт AdvWorksProductTrans>Просмотр состояния агента моментальных снимков.

    Снимок экрана: команда

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

    1. В обозревателе объектов разверните узел Агент SQL Server и откройте элемент "Монитор активности заданий".

    2. Выполните сортировку по категории и определите агент моментальных снимков по категории REPL: моментальный снимок.

    3. Щелкните правой кнопкой мыши элемент "Агент моментальных снимков" и выберите пункт Просмотреть журнал.

    Скриншот выбора для открытия журнала Агент моментальных снимков.

  3. В журнале агента моментальных снимков выберите соответствующую запись журнала. Как правило, она находится за одну или две строки до записи с сообщением об ошибке. (Ошибки обозначаются красным значком X.) Прочтите текст сообщения в поле под журналами:

    Снимок экрана ошибки агента моментальных снимков из-за отказа в доступе.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

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

Поиск ошибок, связанных с агентом чтения журнала

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

  1. Подключитесь к издателю в SQL Server Management Studio. Разверните узел сервера, щелкните правой кнопкой мыши папку Репликация и выберите пункт Запустить монитор репликации:

    Снимок экрана: команда

    Откроется монитор репликации:

    Снимок экрана: монитор репликации.

  2. Красный X указывает, что публикация не синхронизируется. Разверните узел Мои издатели в левой части экрана, а затем разверните соответствующий сервер издателя.

  3. Выберите публикацию AdvWorksProductTrans слева и проверьте наличие красного значка X на одной из вкладок, чтобы определить место возникновения проблемы. В этом случае красный значок X находится на вкладке Агенты, что свидетельствует об ошибке одного из агентов:

    Снимок экрана: Red X на вкладке

  4. Перейдите на вкладку Агенты, чтобы определить, какой агент является источником ошибки:

    Снимок экрана с Red X на неработающем агенте чтения журналов в мониторе репликации.

  5. В этом представлении показаны два агента: агент моментальных снимков и агент чтения журнала. Агент с ошибкой помечен красным значком X. В этом случае это агент чтения журнала.

    Дважды щелкните строку с сообщением об ошибке, чтобы открыть журнал агента для агента чтения журнала. В нем будут представлены более подробные сведения об ошибке:

    Снимок экрана: сведения об ошибке для агента чтения логов.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    
  6. Ошибка обычно возникает, когда владелец базы данных издателя не задан правильно. Это может происходить при восстановлении базы данных. Чтобы проверить, так ли это, выполните указанные ниже действия.

    1. В обозревателе объектов разверните узел Базы данных.

    2. Щелкните правой кнопкой мыши свойства AdventureWorks2022.>

    3. На странице Файлы проверьте наличие владельца. Если это поле пусто, скорее всего это и есть причина проблемы.

    Снимок экрана: страница

  7. Если владелец пуст на странице "Файлы" , откройте окно "Создать запрос " в контексте AdventureWorks2022 базы данных. Выполните следующий код T-SQL:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets.
    EXECUTE sp_changedbowner '<useraccount>';
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
    
  8. Может потребоваться перезапустить агент чтения журнала.

    1. Разверните узел Агент SQL Server в обозревателе объектов и откройте монитор активности заданий.

    2. Выполните сортировку по категории и определите агент чтения журнала по категории REPL: агент чтения журнала.

    3. Щелкните правой кнопкой мыши задание Агент чтения журнала и выберите пункт Запустить задание на шаге.

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

  9. Проверьте синхронизацию публикации, повторно открыв монитор репликации. Если он еще не открыт, его можно найти, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов.

  10. Выберите публикацию AdvWorksProductTrans, перейдите на вкладку Агенты и дважды щелкните агент чтения журнала, чтобы открыть журнал агента. Вы должны увидеть, что агент чтения журнала запущен и выполняет репликацию команд или не имеет реплицируемых транзакций.

    Снимок экрана: агент чтения журналов, работающий без реплицированных транзакций.

Поиск ошибок, связанных с агентом распространения

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

  1. Подключитесь к издателю в SQL Server Management Studio. Разверните узел сервера, щелкните правой кнопкой мыши папку Репликация и выберите пункт Запустить монитор репликации.

  2. В Мониторе репликации выберите публикацию AdvWorksProductTrans и перейдите на вкладку Все подписки. Щелкните подписку правой кнопкой мыши и выберите пункт Просмотреть сведения:

    Снимок экрана: команда

  3. Откроется диалоговое окно журнала От распространителя к подписчику, в котором будут приведены подробные сведения о возникшей с агентом ошибке:

    Снимок экрана: сведения об ошибке для агента распространителя.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. Эта ошибка указывает, что агент распространения выполняет повторную попытку. Дополнительные сведения см. в журнале заданий для агента распространения.

    1. Разверните агент SQL Server в мониторе активности заданий обозреватель объектов>.

    2. Выполните сортировку заданий по категории.

    3. Определите агент распространения по категории REPL: распространение. Щелкните агент правой кнопкой мыши и выберите пункт Просмотреть журнал.

    Снимок экрана: выбор для просмотра журнала агента распространителя.

  5. Выберите одну из записей ошибок и просмотрите текст ошибки в нижней части окна:

    Снимок экрана: текст ошибки, указывающий неправильный пароль для агента распространителя.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Эта ошибка указывает на то, что агент распространения использует неверный пароль. Чтобы устранить ошибку, выполните указанные ниже действия.

    1. В обозревателе объектов разверните узел Репликация.

    2. Щелкните правой кнопкой мыши свойства подписки>.

    3. Нажмите кнопку с многоточием (...) рядом с элементом Учетная запись процесса агента и измените пароль.

    Снимок экрана: выбор для изменения пароля агента распространения.

  7. Снова проверьте монитор репликации, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов. Красный значок X рядом с элементом Все подписки указывает, что ошибка агента распространения по-прежнему не устранена.

    Откройте журнал От распространителя к подписчику, для чего выберите Монитор репликации>Просмотреть подробности и щелкните подписку правой кнопкой мыши. В этом случае ошибка будет несколько иной:

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

    Connecting to Subscriber 'NODE2\SQL2016'
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Эта ошибка означает, что агент распространителя не мог подключиться к подписчику, так как вход произошел сбоем для пользователя NODE2\repl_distribution. Чтобы более детально проанализировать причины ошибки, подключитесь к подписчику и откройте текущий журнал ошибок SQL Server в узле Управление в обозревателе объектов.

    Снимок экрана: ошибка, указывающая на сбой входа для подписчика.

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

  9. После устранения ошибки со входом снова проверьте монитор репликации. Если все ошибки устранены, рядом с именем публикации появится зеленая стрелка, а также будет показано состояние Выполняется в разделе Все подписки.

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

    Снимок экрана агента распространения со статусом

Поиск ошибок с агентом слияния

Агент слияния может тратить много времени на репликацию изменений. Чтобы определить, какой шаг процесса синхронизации репликации слиянием занимает больше всего времени, используйте флаг трассировки 101 вместе с логированием агента слияния. Для этого используйте следующие параметры агента слияния, а затем перезапустите агент:

-T 101
-output
-outputverboselevel

Примечание.

Если необходимо записать статистику в таблицу <distribution-server>..msmerge_history, используйте флаг трассировки 102.

Пример вывода агента слияния после завершения итерации слияния выглядит следующим образом:

**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec   Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS  --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS  --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  NETWORK STATISTICS Server  Reads  Writes  Bytes Read Bytes Written Publisher 74  74  19112  37526 Subscriber 73  73  19032  36931 Distributor 75  75  19192  38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming  Outgoing Publisher Unreachable  Unreachable Subscriber Unreachable  Unreachable Distributor Unreachable  Unreachable
**************************************************************

Включение подробного ведения журнала для любого агента

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

Примечание.

Агенты могут находиться на издателе или подписчике в зависимости от того, является ли это подписка на вытягивание или отправку. Если агент недоступен на сервере, который вы изучаете, проверьте другой сервер.

  1. Решите, где необходимо сохранять данные подробного ведения журнала. Эта папка должна существовать. В этом примере используется папка c:\temp.

  2. Разверните узел Агент SQL Server в обозревателе объектов и откройте монитор активности заданий.

    Снимок экрана: команда

  3. Выполните сортировку по категории и определите нужный агент. В этом примере используется агент чтения журнала. Щелкните правой кнопкой мыши агент интересующих >свойств.

    Снимок экрана с выборами для открытия свойств агента.

  4. Перейдите на страницу Шаги и выделите шаг Запуск агента. Выберите Изменить.

    Снимок экрана: выбор для редактирования шага

  5. В поле Команда начните новую строку, введите следующий текст и нажмите кнопку ОК:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Расположение и уровень детализации можно изменить в соответствии с конкретными предпочтениями.

    Снимок экрана: подробные выходные данные в свойствах шага задания.

    При добавлении параметра подробного вывода следующие проблемы могут привести к сбою агента или отсутствию файла outfile.

    • Существует проблема с форматированием, из-за которой тире становится дефисом.

    • Папка отсутствует на диске, или у учетной записи, с которой выполняется агент, нет разрешения на запись в указанную папку.

    • Между последним параметром и параметром -Output отсутствует пробел.

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

  6. Перезапустите агент чтения журналов, щелкнув правой кнопкой мыши задание остановки агента >на шаге. Обновите содержимое окна, щелкнув значок Обновить на панели инструментов. Щелкните правой кнопкой мыши задание запуска агента >на шаге.

  7. Просмотрите выходные данные на диске.

    Снимок экрана: выходной текстовый файл.

  8. Чтобы отключить подробное ведение журнала, выполните описанные выше действия, полностью удалив ранее добавленную строку -Output.

Получение справки

Примите участие в разработке документации по SQL

Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.

Дополнительные сведения см. в разделе Редактирование документации Microsoft Learn.