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

Откуда:
Сообщений: 384
Добрый день!

Вопрос по транзакционной репликации (SQL Server 2008). Если на подписчике удалить таблицу, а потом вручную ее создать и наполнить теми же данными, что и в текущий момент на издателе, будет ли корректно работать репликация? Или же все равно необходимо переинициализировать снимок?
3 июл 13, 11:14    [14515030]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Нет, переинициализации не требуется. Но если таблицы окажутся не синхронными, то потом могут быть проблемы. Последовательность действий:
1. Обеспечить невозможность изменений в таблице на издателе.
2. Пнуть логридера, если он не работает в непрерывном режиме.
3. Пнуть дистрибьютора, чтобы еще не доставленные транзакции ушли подписчику.
4. Пересоздать таблицу на подписчике и синхронизировать ее с данными издателя.

Если это реплика с обновляемой подпиской, то нужно будет восстановить служебные триггеры.
3 июл 13, 11:35    [14515282]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
temp-for-testing
Member

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

Понял. Спасибо за ответ!
3 июл 13, 11:55    [14515463]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
temp-for-testing,

Но есть способ проще: удалить, а затем вновь добавить статью из публикации. И не нужно никаких приседаний.
3 июл 13, 12:02    [14515530]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
temp-for-testing
Member

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

А можно поподробнее? Можно создать отдельную таблицу из снимка и потом накатить на нее последующие изменения из команд, выполненных после инициализации снимка?
3 июл 13, 12:21    [14515699]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
temp-for-testing,

1. Заскриптовать публикацию.
2. sp_dropsubscription @publication = публикация, @article = статья, @subscriber = 'all'
3. sp_droparticle @publication = публикация, @article = статья, @force_invalidate_snapshot = 0
4. sp_addarticle для этой статьи из скрипта, полученного в п.1
5. sp_addsubscription для этой статьи из скрипта, полученного в п.1
6. sp_refreshsubscriptions @publication = публикация
7. Запустить формирование снепшота. Он будет сформирован только для этой статьи.
3 июл 13, 13:13    [14516099]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
temp-for-testing
Member

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

Хм. На пункте 3 пишет
Cannot make the change because a snapshot is already generated. Set @force_invalidate_snapshot to 1 to force the change and invalidate the existing snapshot.

А если сделать снимок недействительным, то в итоге его все равно придется заново весь снимок создавать.
На пункте 5 - отдельно для выбранной статьи sp_addsubscription нет, есть только для 'all'. При попытке выполнить для указанной статьи выдает
Specify all articles when subscribing to a publication using concurrent snapshot processing.

Почитав это я понял, что публикацию нужно было создавать с @sync_method = native (я создавал с помощью Management Studio -> New Publication и поэтому @sync_type = concurrent).

Спасибо за наводку, буду читать и пробовать.
3 июл 13, 14:36    [14516712]     Ответить | Цитировать Сообщить модератору
 Re: Ручное пересоздание таблицы в репликации на подписчике  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
temp-for-testing
Хм. На пункте 3 пишет
Cannot make the change because a snapshot is already generated. Set @force_invalidate_snapshot to 1 to force the change and invalidate the existing snapshot.
Все правильно, нужно 1. Это я напутал.
temp-for-testing
что публикацию нужно было создавать с @sync_method = native
Да, именно так. Пересоздавать публикаци не обязательно - sync_method можно поменять с посощью sp_changepublication.
3 июл 13, 15:01    [14516931]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить