Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index 'ucMSrepl_transactions'. The duplicate key value is (1, 0x000bce2600026ee20156).Cannot insert duplicate key row in object 'dbo.MSrepl_commands' with unique index 'ucMSrepl_commands'. The duplicate key value is (1, 0x000bce2600026ee20156, 1).Cannot insert duplicate key row in object 'dbo.MSrepl_commands' with unique index 'ucMSrepl_commands'. The duplicate key value is (1, 0x000bce2600026ee20156, 2).

Кто сталкивался с такой проблемой помогите.
30 янв 13, 16:17    [13851826]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
http://qa.social.msdn.microsoft.com/Forums/en-US/sqlreplication/thread/8f58643b-3c87-4d82-8165-171a86608c3b
30 янв 13, 16:23    [13851866]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
pkarklin,
Все убить и создать заново - это не решение проблемы
30 янв 13, 16:35    [13851952]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
http://www.sqlservercentral.com/Forums/Topic992144-291-1.aspx

The steps are:
a) Identify the transaction that is trying to insert an existing xact_seqno,publisher_database_id record into the msrepl_transactions table - and the transaction that is trying to insert an existing xact_seqno,command_id,publisher_database_id record into the msrepl_commands table
b) Dummy update the xact_seqno to ensure that log reader agent doesn't pick them up (this is the vague part that I had in the script that I cannot locate)
c) skip this transaction and continue processing other data
d) try to manually synch the data in the transaction that was skipped


Скипнуть тоже не помогло насколько я понял.
Проблема актуальна.
SOS!
30 янв 13, 16:44    [13852020]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Andrey K,

что значит не помогло? не смогли в базе дистрибуции найти нужную запись?
или не смогли ей поменять параметры / удалить ее? чтобы логридер дальше пошел?
30 янв 13, 17:20    [13852256]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
я отвечу за него
удаление в БД распределителя ничего не дало...битая транзакция восстанавливается в том же виде
также попробовали пропускать транзакции
http://blogs.msdn.com/b/repltalk/archive/2011/08/23/using-sp-repldone-to-skip-a-transaction.aspx
к сожалению, делали все по шагам и все равно весь лог транзакций пометился как реплицированный (все команды)
30 янв 13, 17:40    [13852368]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Андрей Г.
весь лог транзакций пометился как реплицированный (все команды)


наверное, все же, как НЕ-реплицированный, раз старые транзакции по-новой пошли?
30 янв 13, 17:46    [13852410]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
Crimean,

нет, я не ошибся....все команды пропустились, если так будет понятнее :-) т.е. они не попали на распределитель, а оттуда на подписчики
30 янв 13, 17:48    [13852428]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Дмитрий Басовский
Member

Откуда: Москва
Сообщений: 159
Пробовали даже такую экзотику, как отключение уникальных индексов. Записи по этой транзакции начали циклически добавляться в таблицы MSrepl_commands и MSrepl_transactions. Остановили процесс и вернули все на место (как было)... На момент удаления добавленных дублей за пару минут работы добавилось порядка 300 тыс. записей. Так что это цикл агента чтения лога транзакций.
30 янв 13, 17:56    [13852486]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
жесть. переподписать, сказав что схема и данные уже есть
дельту данных долить после...
агентов дистрибуции загнать в режим игнора ошибок
это если по-быстрому
ну или переподписать с применением частичного снапшота, но тут уже придется руками (а то и ушами) шевелить
30 янв 13, 18:15    [13852575]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
Crimean
жесть. переподписать, сказав что схема и данные уже есть
дельту данных долить после...
агентов дистрибуции загнать в режим игнора ошибок
это если по-быстрому


переподписать - это не вариант, особенно, когда в БД активно идет запись от пользователей. БД большие и доливание дельты данных может быть долгим процессом (порядка 10 серверов - двунаправленная репликация транзакций, сбойнул центральный сервер в топологии звезда).

Crimean
ну или переподписать с применением частичного снапшота, но тут уже придется руками (а то и ушами) шевелить

про это еще не слышал...можно чуть подробнее или ссылки? заранее спасибо
30 янв 13, 19:06    [13852820]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Андрей Г.,

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

альтернатива, скорее всего, вдумчивое изучение sp_replcmds / sp_repltrans
но тут я уже все забыл, а ошибки / недопонимания там дорого выходят
30 янв 13, 19:15    [13852862]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Такая ошибка не в первый раз, каждый раз такие сбои приводят к рассинхронизации.
Ещё актуальна проблема, когда возникает "петля репликации"
Источник проблем определить не можем.
Только лечим последствия.

Если есть на форуме гуру по репликации транзакций мы пригласили бы в гости, для консультаций.
Находимся в Москве, Бутово.
30 янв 13, 19:52    [13852980]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Версию сервера так и не озвучили...

sp_replcmds не запускать, а то потеряете нераспределенные транзакции. Хотя, если у вас там логридер запущен в непрерывном режиме, то запустить и не получится.

Для начала посмотрите чего там в дистрибуторе есть:
exec sp_browsereplcmds @xact_seqno_start = 0x000bce2600026ee20156;
30 янв 13, 20:33    [13853126]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
invm
Версию сервера так и не озвучили...

начиная от 2005-го и до 2012-го... такая ошибка периодически падала на всех версиях

invm
sp_replcmds не запускать, а то потеряете нераспределенные транзакции. Хотя, если у вас там логридер запущен в непрерывном режиме, то запустить и не получится.

эта команда не способствует потере транзакций. Возможно, вы имели в виду sp_repldone. Вот она вполне может

invm
Для начала посмотрите чего там в дистрибуторе есть:
exec sp_browsereplcmds @xact_seqno_start = 0x000bce2600026ee20156;


для чего?
30 янв 13, 22:08    [13853518]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
Crimean
альтернатива, скорее всего, вдумчивое изучение sp_replcmds / sp_repltrans
но тут я уже все забыл, а ошибки / недопонимания там дорого выходят


в нашей схеме пока только этот вариант самый приемлимый, но к сожалению информации в инете немного, а та, что есть, и руководством к действию трудно назвать...практиков немного, одни теоретики
30 янв 13, 22:17    [13853547]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Андрей Г.
начиная от 2005-го и до 2012-го... такая ошибка периодически падала на всех версиях
Результаты select @@version покажите. Паблишера и дистрибьютора.
Андрей Г.
Возможно, вы имели в виду sp_repldone
Ага, ее и имел в виду.
Андрей Г.
для чего?
Чтобы выяснить что там на самом деле. Например, в непатченом 2008 R2, при определенных условиях, в MSrepl_commands появлялись паразитные инструкции.
Еще, например, можно, начиная с проблемного xact_seqno, сравнить инструкции в MSrepl_commands и в логе. Если выяснится, что они идентичны, то отметить их в логе как распределенные.
30 янв 13, 22:50    [13853692]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
invm
Результаты select @@version покажите. Паблишера и дистрибьютора.

Оба на одном сервере
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


invm
Чтобы выяснить что там на самом деле. Например, в непатченом 2008 R2, при определенных условиях, в MSrepl_commands появлялись паразитные инструкции.

к сожалению, лог уже сброшен, сейчас все работает и смотреть новые команды уже, наверное, не имеет смысла

invm
Еще, например, можно, начиная с проблемного xact_seqno, сравнить инструкции в MSrepl_commands и в логе. Если выяснится, что они идентичны, то отметить их в логе как распределенные.

вот интересует тонкости того, как правильно пропускать команды в логе транзакций. Как писал выше, мы не один раз уже пробовали совет из данной статьи (в разных вариантах)
http://blogs.msdn.com/b/repltalk/archive/2011/08/23/using-sp-repldone-to-skip-a-transaction.aspx
но, к сожалению, после запуска sp_replrestart (последний шаг) все транзакции в логе отмечаются, как будто они уже реплицировались...вот как раз и интересует, что не так
30 янв 13, 23:27    [13853820]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Андрей Г.
вот интересует тонкости того, как правильно пропускать команды в логе транзакций. Как писал выше, мы не один раз уже пробовали совет из данной статьи (в разных вариантах)
http://blogs.msdn.com/b/repltalk/archive/2011/08/23/using-sp-repldone-to-skip-a-transaction.aspx
но, к сожалению, после запуска sp_replrestart (последний шаг) все транзакции в логе отмечаются, как будто они уже реплицировались...вот как раз и интересует, что не так
Очень странная статья ибо вызов sp_replrestart по своему эффекту эквивалентен
exec sp_repldone @xactid = null, @xact_segno = null, @numtrans = 0, @time = 0, @reset = 1


Делать нужно иначе:

Для начала можно выполнить очистку, запустив джоб "Distribution clean up:..."

Затем останавливаем логридер.

Далее смотрим состояние реплики:
+ Скрипт
declare @t table (descr varchar(50), value varchar(50));

insert into @t
 exec('dbcc opentran() with tableresults;');

select
 t.descr,
 cast(cast(a.v1 as int) as binary(4)) + cast(cast(b.v2 as int) as binary(4)) + cast(cast(c.v3 as int) as binary(2)) as lsn
from
 @t t cross apply
 (select charindex(':', t.value, 2) as p1, substring(t.value, 2, charindex(':', t.value, 2) - 2) as v1) a cross apply
 (select charindex(':', t.value, a.p1 + 1) as p2, substring(t.value, a.p1 + 1, charindex(':', t.value, a.p1 + 1) - a.p1 - 1) as v2) b cross apply
 (select substring(t.value, b.p2 + 1, len(t.value) - b.p2 - 1) as v3) c;

select * from distribution.dbo.MSrepl_transactions where publisher_database_id = 10/*Это моя тестовая БД, у вас может быть другое значение*/;

descrlsn
REPL_DIST_OLD_LSN0x0000469500019C300008
REPL_NONDIST_OLD_LSN0x0000469500019C700001

publisher_database_idxact_idxact_seqnoentry_time
100x0000469500019C3000010x0000469500019C3000082013-01-31 11:30:03.193

Обратите внимание на выделенные цветом LSN.

Смотрим нераспределенные транзакции:
exec sp_replcmds 100;

article idpartial_commandcommandxactidxact_seqnopublication_idcommand_idcommand_typeoriginator_srvnameoriginator_dbpkHashoriginator_publication_idoriginator_db_versionoriginator_lsn
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200035002C003300290020000x0000469500019C7000010x0000469500019C7000034100NULLNULLNULL
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200036002C003300290020000x0000469500019C7800010x0000469500019C7800034100NULLNULLNULL
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200037002C003300290020000x0000469500019C8000010x0000469500019C8000034100NULLNULLNULL
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200038002C003300290020000x0000469500019C8800010x0000469500019C8800034100NULLNULLNULL

Мы хотим пометить первые две транзакции как распределенные (выше в таблице выделены соответствующие LSN). Для этого выполняем:
exec sp_repldone @xactid = 0x0000469500019C700001, @xact_seqno = 0x0000469500019C780003;

Опять проверяем нераспределенные транзакции:
article idpartial_commandcommandxactidxact_seqnopublication_idcommand_idcommand_typeoriginator_srvnameoriginator_dbpkHashoriginator_publication_idoriginator_db_versionoriginator_lsn
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200037002C003300290020000x0000469500019C8000010x0000469500019C8000034100NULLNULLNULL
300x69006E007300650072007400200069006E0074006F0020005B00640062006F005D002E005B005400610062006C006500300030005D002000280020005B0069005D002C005B0076005D0029002000760061006C0075006500730020002800200038002C003300290020000x0000469500019C8800010x0000469500019C8800034100NULLNULLNULL
И видим, что получили требуемое.

Проверяем состояние реплики вышеприведенным скриптом:
descrlsn
REPL_DIST_OLD_LSN0x0000469500019C780003
REPL_NONDIST_OLD_LSN0x0000469500019C800001

publisher_database_idxact_idxact_seqnoentry_time
100x0000469500019C3000010x0000469500019C3000082013-01-31 11:30:03.193
Видим расхождение и компенсируем его значениями из вызова sp_repldone:
insert into distribution.dbo.MSrepl_transactions
 (publisher_database_id, xact_id, xact_seqno, entry_time)
values
 (10, 0x0000469500019C700001, 0x0000469500019C780003, getdate());
И опять проверяем:
descrlsn
REPL_DIST_OLD_LSN0x0000469500019C780003
REPL_NONDIST_OLD_LSN0x0000469500019C800001

publisher_database_idxact_idxact_seqnoentry_time
100x0000469500019C3000010x0000469500019C3000082013-01-31 11:30:03.193
100x0000469500019C7000010x0000469500019C7800032013-01-31 12:37:29.753
Все, теперь можно запускать логридера.

Думаю теперь принцип сего шаманства стал вам понятен. И никаких sp_replrestart.

У вас же, ИМХО, по каким-то причинам транзакции попали к дистрибьютору, но не пометились как распределенные. Поэтому в вашем случае компенсировать MSrepl_transactions может быть и не придется.
Ну и естественно сначала нужно потренироваться на кошках. И не забудьте использовать свое значение для publisher_database_id.

В любом случае, необходимо выяснять причину такого аномального поведения.
31 янв 13, 12:56    [13856213]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
И перед запуском логридера не забудьте закрыть сеанс, где делались все предыдущие манипуляции.
31 янв 13, 13:00    [13856246]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Андрей Г.
Member

Откуда:
Сообщений: 8
invm,

Огромное спасибо. Много излазил по инету, но этот самый на мой взгляд профессиональный и правдоподобный ответ. Принял к сведению и обязательно попробую в ближайшее время на тестовых БД.
Еще раз спасибо
31 янв 13, 14:35    [13857177]     Ответить | Цитировать Сообщить модератору
 Re: Cannot insert duplicate key row in object 'dbo.MSrepl_transactions' with unique index ...  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
invm, Спасибо!
Проверим.
31 янв 13, 14:50    [13857333]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить