Microsoft SQL Server
Репликация

Ошибка при репликации: The process could not execute 'sp_replcmds' on 'ServerName'

Опубликовано: 16 апр 09
Рейтинг:

Автор: 1234567
Прислал: 1234567

Опробовано на Microsoft SQL Server 2008 Standard Edition RTM.

Если репликация падает с ошибкой, подобной следующим:

Error messages:
The process could not execute 'sp_replcmds' on 'FSQL14'. (Source: MSSQL_REPL, Error number: MSSQL_REPL20011)
The Log-Scan Process failed to construct a replicated command from log sequence number (LSN) {00003a5d:0001e5f8:0003}. Back up the publication database and contact Customer Support Services. (Source: MSSQLServer, Error number: 18805)
The process could not execute 'sp_replcmds' on 'FSQL14'. (Source: MSSQL_REPL, Error number: MSSQL_REPL22037)

т.е. транзакция с LSN, указанным в сообщении об ошибке, не может быть доставлена с издателя на дистрибьютор.

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

При возникновении такой ситуации нужно либо реинициализировать публикацию (что в большинстве случаев неприемлемо), либо удалить из
журнала на издателе ту транзакцию, которая мешает работе агенту репликации Log Reader.

Ниже описаны шаги для удаления сбойной транзакции.

1. Остановить агента Log Reader.

2. Запустить на издателе в опубликованной базе данных недокументированную функцию fn_dblog:

select * from fn_dblog(null, null);

3. В результате вывода функции найти в столбце [Current LSN] первую запись в сегменте того LSN,
который указан в сообщении об ошибке. В нашем случае LSN = 00003a5d:0001e5f8:0003, значит, первая запись в сегменте
должна быть 00003a5d:0001e5f8:0001, и в столбце [Operation] - LOP_BEGIN_XACT.
Затем найти последнюю запись в том же сегменте. В столбце [Operation] - LOP_COMMIT_XACT.
Запоминаем [Current LSN] этой записи. Пусть в нашем случае это будет 00003a5d:0001e5f8:000c.

4. На издателе в опубликованной базе данных выполнить хранимую процедуру sp_repldone, с помощью которой
транзакции помечаются как уже переданные с издателя на дистрибьютор:

exec sp_repldone @xactid = 0x00003a5d0001e5f80001, @xact_seqno = 0x00003a5d0001e5f8000c;

где @xactid - LSN первой записи в сегменте,
@xact_seqno - LSN последней записи в сегменте.

5. Подключаемся к серверу-дистрибьютору к базе данных distribution и выполняем следующий запрос:

declare @srvid int, @dbid int, @max_time datetime;

/*
Определяем на дистрибьюторе номер опубликованной базы данных с издателя.
Допустим, в нашем случае у сервера-издателя имя - PubServer, имя опубликованной базы данных - PubDB
*/

select @srvid = [srvid] from [master].[dbo].[sysservers] where UPPER([srvname]) = 'PUBSERVER';
select @dbid = [id] from [dbo].[MSpublisher_databases] where [publisher_id] = @srvid and [publisher_db] = 'PubDB';

/*
Определяем максимальную дату для транзакций опубликованной базы данных.
*/

select @max_time = max([entry_time]) from [dbo].[MSrepl_transactions] where [publisher_database_id] = @dbid;

/*
Сообщаем дистрибьютору о следующей транзакции, которую он должен получить.
*/

insert into [dbo].[MSrepl_transactions]([publisher_database_id], [xact_id], [xact_seqno], [entry_time])
values(@dbid, 0x00003a5d0001e5f80001, 0x00003a5d0001e5f8000c, @max_time);

6. Возвращаемся на издателя в опубликованную базу данных и запускаем там хранимую процедуру:

exec sp_replflush;

7. Разрываем подключение, в котором мы выполняли процедуру sp_repldone.

8. Запускаем агента Log Reader.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Репликация / Ошибка при репликации: The process could not execute 'sp_replcmds' on 'ServerName'