Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Большой апдейт - или как подвесить репликацию слиянием.  [new]
Poroh
Member

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

Получилось так, что я запустил на подписчике апдейт 920 тыс. записей и это вызвало остановку репликаций с данным подписчиком. Остановилась репликация всех шести подписок, а не только той, к которой относилась обновленная таблица. Репликации зависали на попытке выполнения процедуры sp_MSmakegeneration (видно было через Activity Monitor).

Погуглив немного я наткнулся на полезную ссылку, которая помогла разобраться c проблемой:
http://blogs.msdn.com/b/repltalk/archive/2011/04/24/reducing-impact-of-large-updates-on-merge-replication.aspx

Итак, мои действия:
1) Запускаю синхронизацию и смотрю, что выдает на подписчике следующий код.
SELECT top 100 *
FROM [dbo].[MSmerge_genhistory] with (nolock)
order by generation desc


Вижу, что появляются поколения, которые в основном относятся к одной статье (колонка ART_NICK, в моём случае = 3222043).

2) Удостоверяюсь, что данная статья соответствует той самой таблице, которую я обновлял.
SELECT * FROM dbo.sysmergearticles WHERE NICKNAME = 3222043


3) Пока работает агент репликации, наблюдаю за процессом создания поколений.
SELECT count(*)
FROM [dbo].[MSmerge_genhistory] with (nolock)
WHERE ART_NICK = 3222043


В какой-то момент замечаю, что количество поколений начинает идти вниз (в моём случае примерно после 600-го поколения). Фактически происходит откат процедуры создания поколений. Причем, за время пока агент репликации работает, процедура пытается запуститься и откатывается несколько раз.

4) 600 поколений явно мало, поскольку нужно прокачать 920 тыс записей.
Ещё раз удостоверяюсь что ожидает прокачки это количество записей при помощи следующего кода.
select count(*) from MSmerge_contents where tablenick = 3222043


В каждое поколение у меня должно быть по 1000 записей, что видно из колонки generation_leveling_threshold
sp_helpmergepublication  @publication =  'PublicationName' 


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

5) Далее, вручную запускаю на подписчике процедуру sp_MSmakegeneration без параметров.
sys.sp_MSmakegeneration


Наблюдаю за процессом создания поколений и на этот раз поколения успешно доходят до 930 и не откатываются. Процедура успешно завершается.


Резюме.
Основной результат, которого мне удалось добиться - пять из шести подписок вернулись в работоспособное состояние.
Через шестую же подписку ещё предстоит прокачать это большое обновление.
14 сен 12, 23:16    [13168018]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить