Средство устранения неполадок: поиск ошибок, связанных с репликацией транзакций SQL Server
Область применения: SQL Server Управляемый экземпляр SQL Azure
Без понимания того, как работает репликация транзакций, устранение ее ошибок может быть затруднительным. Первым шагом при создании публикации является создание моментального снимка агентом моментальных снимков и его сохранение в папке моментальных снимков. Затем агент распространения применяет моментальный снимок к подписчику.
В результате этой процедуры публикация создается и переводится в состояние синхронизации. Синхронизация осуществляется в три этапа.
- Транзакции происходят в реплицируемых объектах и помечаются для репликации в журнале транзакций.
- Агент чтения журналов сканирует журнал транзакций и ищет транзакции, помеченные как "для репликации". Затем эти транзакции сохраняются в базе данных распространителя.
- Агент распространения просматривает базу данных распространителя с помощью потока чтения. Затем с помощью потока записи этот агент подключается к подписчику, чтобы применить к нему изменения.
Ошибки могут возникать на любом этапе этого процесса. Выявление ошибок может быть наиболее сложным аспектом устранения неполадок, возникающих при синхронизации. К счастью, монитор репликации упрощает данный процесс.
Примечание.
- Цель этого руководства — научить методам устранения неполадок. Оно призвано не помочь в устранении конкретных ошибок, а предоставить общие указания по выявлению ошибок репликации. В нем приводится ряд конкретных примеров, но их решение может отличаться в зависимости от среды.
- Ошибки, приведенные в этом руководстве в качестве примера, основаны на учебнике Настройка репликации транзакций.
Методы устранения неполадок
Вопросы
- На каком этапе синхронизации происходит сбой репликации?
- В каком агенте возникает ошибка?
- Когда в последний раз репликация завершилась успешно? Изменилось ли что-нибудь с того момента?
Действия для выполнения
- Используйте монитор репликации, чтобы определить, в какой точке репликации возникает ошибка (какой агент?):
- Если ошибки возникают в разделе От издателя к распространителю, проблема связана с агентом чтения журнала.
- Если ошибки возникают в разделе От распространителя к подписчику, проблема связана с агентом распространения.
- Чтобы получить подробные сведения об ошибке, просмотрите журнал заданий соответствующего агента в мониторе активности заданий. Если сведений в журнале заданий недостаточно, можно включить подробное ведение журнала для агента.
- Попробуйте определить решение проблемы.
Поиск ошибок с помощью агента моментальных снимков
Агент моментальных снимков создает моментальный снимок и записывает его в указанную папку.
Просмотрите состояние агента моментальных снимков.
a. В обозревателе объектов разверните узел Локальная публикация в разделе Репликация.
b. Щелкните публикацию правой кнопкой мыши и выберите пункт AdvWorksProductTrans>Просмотр состояния агента моментальных снимков.
Если в состоянии агента моментальных снимков присутствует сообщение об ошибке, дополнительные сведения можно найти в журнале заданий агента моментальных снимков.
a. В обозревателе объектов разверните узел Агент SQL Server и откройте элемент "Монитор активности заданий".
b. Выполните сортировку по категории и определите агент моментальных снимков по категории REPL: моментальный снимок.
c. Щелкните правой кнопкой мыши элемент "Агент моментальных снимков" и выберите пункт Просмотреть журнал.
В журнале агента моментальных снимков выберите соответствующую запись журнала. Как правило, она находится за одну или две строки до записи с сообщением об ошибке. (Ошибки обозначаются красным значком 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 находится на вкладке Агенты, что свидетельствует об ошибке одного из агентов:
Перейдите на вкладку Агенты, чтобы определить, какой агент является источником ошибки:
В этом представлении показаны два агента: агент моментальных снимков и агент чтения журнала. Агент с ошибкой помечен красным значком 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'.'.
Эта ошибка обычно возникает при неправильной настройке владельца для базы данных издателя. Это может происходить при восстановлении базы данных. Чтобы проверить, так ли это, выполните указанные ниже действия.
a. В обозревателе объектов разверните узел Базы данных.
b. Щелкните правой кнопкой мыши свойства AdventureWorks2022.>
c. На странице Файлы проверьте наличие владельца. Если это поле пусто, скорее всего это и есть причина проблемы.
Если владелец пуст на странице "Файлы" , откройте окно "Создать запрос " в контексте
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'
Может потребоваться перезапустить агент чтения журнала.
a. Разверните узел Агент SQL Server в обозревателе объектов и откройте монитор активности заданий.
b. Выполните сортировку по категории и определите агент чтения журнала по категории REPL: агент чтения журнала.
c. Щелкните правой кнопкой мыши задание Агент чтения журнала и выберите пункт Запустить задание на шаге.
Проверьте синхронизацию публикации, повторно открыв монитор репликации. Если он еще не открыт, его можно найти, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов.
Выберите публикацию 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.
Эта ошибка указывает, что агент распространения выполняет повторную попытку. Дополнительные сведения см. в журнале заданий для агента распространения.
a. Разверните агент SQL Server в мониторе активности заданий обозреватель объектов>.
b. Выполните сортировку заданий по категории.
c. Определите агент распространения по категории 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.)
Эта ошибка указывает на то, что агент распространения использует неверный пароль. Чтобы устранить ошибку, выполните указанные ниже действия.
a. В обозревателе объектов разверните узел Репликация.
b. Щелкните правой кнопкой мыши свойства подписки>.
c. Нажмите кнопку с многоточием (...) рядом с элементом Учетная запись процесса агента и измените пароль.
Снова проверьте монитор репликации, щелкнув правой кнопкой мыши элемент Репликация в обозревателе объектов. Красный значок 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 в узле Управление в обозревателе объектов.
Если отображается эта ошибка, значит, в подписчике не было предоставлено имя для входа. Сведения об устранении этой ошибки см. в разделе Разрешения для репликации.
После устранения ошибки со входом снова проверьте монитор репликации. Если все ошибки устранены, рядом с именем публикации появится зеленая стрелка, а также будет показано состояние Выполняется в разделе Все подписки.
Щелкните подписку правой кнопкой мыши, чтобы открыть журнал От распространителя к подписчику еще раз и проверить успешность выполненных действий. Если агент распространения запущен впервые, вы увидите, что было выполнено массовое копирование моментального снимка в подписчик.
Включение подробного ведения журнала для любого агента
Для просмотра более подробных сведений об ошибках, происходящих с любым агентом в топологии репликации, можно использовать подробное ведение журнала. Действия для всех агентов одинаковы. Просто выберите соответствующий агент в мониторе активности заданий.
Примечание.
Агенты могут находиться на издателе или подписчике в зависимости от того, является ли это подписка на вытягивание или отправку. Если агент недоступен на сервере, который вы изучаете, проверьте другой сервер.
Решите, где необходимо сохранять данные подробного ведения журнала. Эта папка должна существовать. В этом примере используется папка 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
- Reddit: общие сведения о SQL Server
- Условия лицензии и информация о Microsoft SQL Server
- Варианты поддержки для бизнес-пользователей
- Дополнительная справка и отзывы по SQL Server
Примите участие в разработке документации по SQL
Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.
Дополнительные сведения см. в разделе Участие в работе над документацией по SQL Server.