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

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

Итак… Речь пойдет о merge репликации между SQL Server 2008R Для упрощения задачи, предположим, что в данный момент существует такая топология: Подписчик1-Издатель-Подписчик2. Репликация многих статей настроена и работает, данные в этих таблицах синхронны.

Появилась необходимость создать новую публикацию, в которую включить ряд таблиц, которые ранее не реплицировались, их нет на издателе, но они есть на Подписчике 1, где они активно модифицируются и на Подписчике 2, где они не модифицируются и находятся в состоянии «на несколько недель от Подписчика 1». Схема абсолютно идентична. Задача состоит в том, чтобы включить эти таблицы в репликацию с сохранением данных на обоих подписчиках и чтобы в дальнейшем передавались только измененные данные

Что удалось придумать:
1. На Подписчик 1 в нужных таблицах устанавливаем признак RowGuid, где это возможно, где невозможно добавляем новую колонку с этим признаком и значением по умолчанию.
2. Ручками или средствами сравнения генерим скрипт для внесения аналогичных изменений в структуру таблиц на Подписчик 2. Выполняем.
3. Формируем скрипт на создание измененных таблиц и выполняем его на Издателе
4. Создаем публикацию на Издателе для этих таблиц с опцией для всех статей «Keep existing object unchanged»
5. На Подписчике 1 выполняем скрипт создания подписки
EXEC sp_addmergepullsubscription @publisher = N'Издатель'
,    @publication = N'Публикация'
,    @publisher_db = N'DB'
,    @subscriber_type = N'Local'
,    @subscription_priority = 0
,    @description = N''
,    @sync_type = N'None'

Здесь мне кажется самое важное – это параметр @sync_type = N'None', что соответствует признаку «Подписчик уже имеет схему и данные»
6. Выполняем скрипт создания задания
7. На издателе регистрируем новую подписку
EXEC dbo.sp_addmergesubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @subscription_type = N'Pull',
  @sync_type=  N'none'

Здесь тоже важен параметр @sync_type= N'none'
8. Аналогичную процедуру проводим на Подписчике 2
9. Делаем на Подписчик 1 фиктивный update тех записей которых не на Подписчик 2

В принципе все, но невооруженным глазом виден косяк в том, что на Подписчиках будут разные ключи репликации для тех таблиц, где пришлось добавлять новую колонку и в случае изменения данных в строке, которая есть и там и там, получим нарушение PK. Какие есть Best Practice в таких случаях? Можно, конечно, на Подписчике 2 тупо пересоздать таблицы и потом фиктивно проапдейтить записи на Подписчик 1, и они переползут репликацией, но есть таблицы с несколькими десятками миллионов записей – репликация устанет это все качать.

Какие еще есть подводные камни, которые я не заметил? Например, нужно ли как-то играть с опцией публикации «create schema at subscriber» и т.д.. В принципе, я на тестовом стенде провел все эти шаги, но там были совершенно другие объемы данных, да и такую топологию по ряду причин собрать нет возможности. Может кто-то уже твердо знает: «Взлетит-Не взлетит»? Думаю, эти знания будут полезны многим, как начинающим, так и не очень
26 июл 13, 12:51    [14621499]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
Если данные в этих таблицах модифицируются только на Подписчике1, то почему бы просто не сделать его еще одним издателем?
26 июл 13, 13:48    [14621868]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
sky
Member

Откуда:
Сообщений: 281
Думал об этом. Но для этого необходимо снести все существующие подписки на нем, потом создать публикации и снова вернуть подписки - это нереально. На нем основные бизнес-процессы висят, на него стекается информация с 60 филиалов и остановить процесс нельзя.
26 июл 13, 13:53    [14621918]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
sky
Но для этого необходимо снести все существующие подписки на нем
Зачем???
26 июл 13, 14:30    [14622162]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
sky
Member

Откуда:
Сообщений: 281
"You cannot create a merge publication in this database because it contains one or more anonymous or local merge subscriptions. To create a merge publication, drop the existing anonymous or local merge subscriptions, create the publication, and then recreate the subscriptions."
26 июл 13, 14:46    [14622277]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
У вас данные в одном месте меняются. Зачем тогда мерж? Можно транзакционной обойтись.
26 июл 13, 15:09    [14622471]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
sky
Member

Откуда:
Сообщений: 281
Не хочется городить зоопарк разных публикаций, да и второй подписчик запросто может быть недоступным. Есть идея при необходимости переключать рабочую нагрузку с одного сервера на другой, например на время профилактических работ на сервере. Сейчас второй подписчик используется для отчетов, но может принять и полную нагрузку, а первый в это время может быть совсем недоступен
26 июл 13, 15:17    [14622547]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
sky
Не хочется городить зоопарк разных публикаций
Это не аргумент.
sky
да и второй подписчик запросто может быть недоступным
А это не важно. Синхронизацию можно делать по расписанию, а не непрерывно.
sky
You cannot create a merge publication in this database because it contains one or more anonymous or local merge subscriptions
У вас подписчик локальный(клиентский). Если бы был серверный, ошибки бы не было.

ЗЫ: Вы понимаете, что при желании оставить единственного издателя, вам придется на нем иметь в актуальном состоянии все таблицы, задействованные в репликации?
26 июл 13, 20:22    [14624624]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
sky
Member

Откуда:
Сообщений: 281
Я наверное не правильно выразился... Усложнение топологии репликации добавляет лишние потенциальные точки отказа, изменение стратегии резервного копирования, и как следствие усложнение администрирования всего хозяйства. Что касается актуальности данных на издателе - естественно, если через него будут переваливаться данные с одного подписчика на другой - он будет носителем актуальных данных.
29 июл 13, 09:15    [14630307]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
sky,

Ок, тогда:
1. На Подписчик1 вносите необходимые для мерж-репликации изменения в схему таблиц;
2. Схема таблиц переносится на Издатель и Подписчик2;
3. Остановить изменения данных в таблицах на Подписчик1;
4. Через bcp перенести данных с Подписчик1 на Издатель;
5. Создать подписку Издатель -> Подписчик1 без инициализации схемы и данных;
6. Возобновить изменения данных в таблицах на Подписчик1;
7. Создать подписку Издатель -> Подписчик2 без инициализации схемы и с инициализацией данных;
29 июл 13, 10:15    [14630608]     Ответить | Цитировать Сообщить модератору
 Re: Репликация новых таблиц с сохранением данных на подписчике  [new]
sky
Member

Откуда:
Сообщений: 281
ок, будем пробовать. Спасибо за участие в теме, мне проще думать в режиме обмена мнениями :). Странно, что тема привлекла так мало участников, видно, не актуально :)
29 июл 13, 10:27    [14630664]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить