Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server Управляемый экземпляр SQL Azure
Без понимания того, как работает репликация транзакций, устранение ее ошибок может быть затруднительным. Первым шагом при создании публикации является создание моментального снимка агентом моментальных снимков и его сохранение в папке моментальных снимков. Затем агент распространения применяет снимок на подписчике.
В результате этой процедуры публикация создается и переводится в состояние синхронизации. Синхронизация осуществляется в три этапа.
Транзакции происходят в реплицируемых объектах и помечаются для репликации в журнале транзакций.
Агент чтения журналов сканирует журнал транзакций и ищет транзакции, помеченные как "для репликации". Затем эти транзакции сохраняются в базе данных распространителя.
Агент распространения просматривает базу данных распространителя с помощью потока чтения. Затем, используя пишущий поток, этот агент подключается к подписчику, чтобы применить эти изменения к подписчику.
Ошибки могут возникать на любом этапе этого процесса. Выявление ошибок может быть наиболее сложным аспектом устранения неполадок, возникающих при синхронизации. К счастью, монитор репликации упрощает данный процесс.
Примечание.
Цель этого руководства — научить методам устранения неполадок. Оно призвано не помочь в устранении конкретных ошибок, а предоставить общие указания по выявлению ошибок репликации. В нем приводится ряд конкретных примеров, но их решение может отличаться в зависимости от среды. Примеры ошибок основаны на учебном пособии: настройка репликации между двумя полностью подключенными серверами (транзакционный).
Методы устранения неполадок
Вопросы, которые стоит задать
- На каком этапе синхронизации происходит сбой репликации?
- У какого агента возникла ошибка?
- Когда в последний раз репликация завершилась успешно? Изменилось ли что-нибудь с того момента?
Действия для выполнения
Используйте монитор репликации, чтобы определить, в какой точке репликации возникает ошибка (какой агент?):
- Если ошибки возникают в разделе От издателя к распространителю, проблема связана с агентом чтения журнала.
- Если ошибки возникают в разделе От распространителя к подписчику, проблема связана с агентом распространения.
Чтобы получить подробные сведения об ошибке, просмотрите журнал заданий соответствующего агента в мониторе активности заданий. Если история заданий не показывает достаточно подробных сведений, можно включить подробное логирование на этом конкретном агенте.
Попробуйте определить решение проблемы.
Найти ошибки с помощью агента Snapshot
Агент моментальных снимков создает моментальный снимок и записывает его в указанную папку.
Просмотрите состояние агента моментальных снимков.
В обозревателе объектов разверните узел Локальная публикация в разделе Репликация.
Щелкните публикацию правой кнопкой мыши и выберите пункт AdvWorksProductTrans>Просмотр состояния агента моментальных снимков.
Если в состоянии агента моментальных снимков присутствует сообщение об ошибке, дополнительные сведения можно найти в журнале заданий агента моментальных снимков.
В обозревателе объектов разверните узел Агент SQL Server и откройте элемент "Монитор активности заданий".
Выполните сортировку по категории и определите агент моментальных снимков по категории REPL: моментальный снимок.
Щелкните правой кнопкой мыши на агенте моментальных снимков, а затем выберите пункт Просмотр журнала.
В журнале агента моментальных снимков выберите соответствующую запись журнала. Как правило, она находится за одну или две строки до записи с сообщением об ошибке. (Ошибки обозначаются красным значком X.) Прочтите текст сообщения в поле под журналами:
The replication agent had encountered an exception. Exception Message: Access to path '\\node1\repldata.....' is denied.
Если разрешения Windows настроены неправильно для папки моментального снимка, вы увидите ошибку "Доступ запрещен" для агента моментальных снимков. Необходимо проверить права доступа к папке, в которой хранится моментальный снимок, и убедиться, что учетная запись, используемая для запуска агента моментальных снимков, имеет права доступа к общему ресурсу.
Найдите ошибки в агенте чтения журналов
Агент чтения журналов подключается к базе данных издателя и сканирует журнал транзакций для любых транзакций, помеченных как "для репликации". Затем он добавляет эти транзакции в базу данных распространителя.
Подключитесь к издателю в SQL Server Management Studio. Разверните узел сервера, щелкните правой кнопкой мыши папку Репликация и выберите пункт Запустить монитор репликации:
Откроется монитор репликации:
Красный X указывает, что публикация не синхронизируется. Разверните узел Мои издатели в левой части экрана, а затем разверните соответствующий сервер издателя.
Выберите публикацию AdvWorksProductTrans слева и проверьте наличие красного значка X на одной из вкладок, чтобы определить место возникновения проблемы. В этом случае красный значок X находится на вкладке Агенты, что свидетельствует об ошибке одного из агентов:
Перейдите на вкладку Агенты, чтобы определить, какой агент является источником ошибки:
В этом представлении показаны два агента: агент моментальных снимков и агент чтения журнала. Тот, в работе которого возникла ошибка, обозначен красным крестиком. В данном случае это Агент чтения журнала.
Дважды щелкните строку, в которой сообщается об ошибке, чтобы открыть историю агента Log Reader Agent. В нем будут представлены более подробные сведения об ошибке:
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'.'.Ошибка обычно возникает, когда владелец базы данных издателя не задан правильно. Это может происходить при восстановлении базы данных. Чтобы проверить, так ли это, выполните указанные ниже действия.
В обозревателе объектов разверните узел Базы данных.
Щелкните правой кнопкой мыши AdventureWorks2025>Свойства.
На странице Файлы проверьте наличие владельца. Если это поле пусто, скорее всего это и есть причина проблемы.
Если на странице «Файлы» поле «Владелец» пусто, откройте окно «Создать запрос» в контексте базы данных
AdventureWorks2025. Выполните следующий код 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'Может потребоваться перезапустить агент чтения журнала.
Разверните узел Агент SQL Server в обозревателе объектов и откройте монитор активности заданий.
Выполните сортировку по категории и определите агент чтения журнала по категории REPL: агент чтения журнала.
Щелкните правой кнопкой мыши задание Агент чтения журнала и выберите пункт Запустить задание на шаге.
Проверьте синхронизацию публикации, повторно открыв монитор репликации. Если он еще не открыт, его можно найти, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов.
Выберите публикацию AdvWorksProductTrans, перейдите на вкладку Агенты и дважды щелкните агент чтения журнала, чтобы открыть журнал агента. Теперь вы должны увидеть, что агент чтения журнала запущен и либо реплицирует команды, либо имеет статус «нет реплицированных транзакций»:
Найдите ошибки агента распространителя
Агент распространения находит данные в базе данных распространителя и применяет их к подписчику.
Подключитесь к издателю в SQL Server Management Studio. Разверните узел сервера, щелкните правой кнопкой мыши папку Репликация и выберите пункт Запустить монитор репликации.
В Мониторе репликации выберите публикацию AdvWorksProductTrans и перейдите на вкладку Все подписки. Щелкните подписку правой кнопкой мыши и выберите пункт Просмотреть сведения:
Откроется диалоговое окно От распространителя подписчику, в котором поясняется, с какой ошибкой столкнулся агент:
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.Эта ошибка указывает, что агент распространения выполняет повторную попытку. Чтобы получить дополнительные сведения, просмотрите журнал заданий для агента распространения:
Разверните агент SQL Server в обозревателе объектов >Монитор активности заданий.
Выполните сортировку заданий по категории.
Определите агент распространения по категории REPL: распространение. Щелкните агент правой кнопкой мыши и выберите пункт Просмотреть журнал.
Выберите одну из записей ошибок и просмотрите текст ошибки в нижней части окна:
Message: Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)Эта ошибка указывает на то, что агент распространения использует неверный пароль. Чтобы устранить ошибку, выполните указанные ниже действия.
В обозревателе объектов разверните узел Репликация.
Щелкните правой кнопкой мыши свойства подписки>.
Нажмите кнопку с многоточием (...) рядом с элементом Учетная запись процесса агента и измените пароль.
Снова проверьте монитор репликации, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов. Красный значок 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'.Эта ошибка означает, что агент распространителя не мог подключиться к подписчику, так как вход произошел сбоем для пользователя NODE2\repl_distribution. Чтобы более детально проанализировать причины ошибки, подключитесь к подписчику и откройте текущий журнал ошибок SQL Server в узле Управление в обозревателе объектов.
Если вы видите эту ошибку, значит, у подписчика отсутствует логин. Чтобы устранить эту ошибку, см. Требования к ролям безопасности для репликации.
После устранения ошибки со входом снова проверьте монитор репликации. Если все ошибки устранены, рядом с именем публикации появится зеленая стрелка, а также будет показано состояние Выполняется в разделе Все подписки.
Щелкните правой кнопкой мыши подписку, чтобы еще раз открыть историю От распространителя к подписчику и убедиться, что операция выполнена успешно. Если это первый раз, когда вы запускаете агент распространения, вы увидите, что снимок состояния был массово скопирован к подписчику.
Поиск ошибок с агентом слияния
Агент слияния может тратить много времени на репликацию изменений. Чтобы определить, какой этап процесса синхронизации репликации слияния занимает больше всего времени, используйте флаг трассировки 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
**************************************************************
Включите подробное журналирование для любого агента
Для просмотра более подробных сведений об ошибках, происходящих с любым агентом в топологии репликации, можно использовать подробное ведение журнала. Шаги одинаковы для всех агентов. Просто убедитесь, что вы выбрали нужного агента в «Мониторе активности заданий».
Примечание.
Агенты могут находиться либо на стороне издателя, либо на стороне подписчика, в зависимости от того, является ли подписка подпиской с извлечением или с отправкой. Если агент недоступен на сервере, который вы изучаете, проверьте другой сервер.
Определите, где должны сохраняться подробные журналы, и убедитесь, что эта папка существует. В этом примере используется папка c:\temp.
Разверните узел Агент SQL Server в обозревателе объектов и откройте монитор активности заданий.
Выполните сортировку по категории и определите нужный агент. В этом примере используется агент чтения журнала. Щелкните правой кнопкой мыши на нужном агенте >и выберите Свойства.
Перейдите на страницу Шаги и выделите шаг Запуск агента. Выберите Изменить.
В поле Команда начните новую строку, введите следующий текст и нажмите кнопку ОК:
-Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3Вы можете изменить местоположение и уровень детализации в соответствии со своими предпочтениями.
При добавлении параметра подробного вывода следующие проблемы могут привести к сбою агента или отсутствию файла outfile.
Существует проблема с форматированием, из-за которой тире становится дефисом.
Расположение не существует на диске, или у учетной записи, под которой запущен агент, нет разрешения на запись в указанное расположение.
Между последним параметром и параметром
-Outputотсутствует пробел.Разные агенты поддерживают разные уровни детализации. Если вы включили подробное логирование, но агент не запускается, попробуйте уменьшить указанный уровень подробности на 1.
Перезапустите агент чтения журнала, щелкнув правой кнопкой мыши агент >Остановить задание на шаге. Обновите содержимое окна, щелкнув значок Обновить на панели инструментов. Щелкните правой кнопкой мыши агент >Запустить задание с шага.
Просмотрите выходные данные на диске.
Чтобы отключить подробное ведение журнала, выполните те же действия, что и ранее, удалив всю строку
-Output, которую вы добавили ранее.
Связанный контент
Получить помощь
- Идеи об SQL. Есть рекомендации по улучшению SQL Server?
- Вопросы и ответы по продуктам Майкрософт (SQL Server)
- DBA Stack Exchange (тег sql-server): вопросы о SQL Server
- Stack Overflow (тег sql-server): ответы на вопросы о разработке SQL
- Условия лицензии и информация о Microsoft SQL Server
- Варианты поддержки для бизнес-пользователей
- Дополнительная справка и отзывы по SQL Server
Примите участие в разработке документации по SQL
Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.
Дополнительные сведения см. в разделе Редактирование документации Microsoft Learn.