При использовании транзакционной репликации SQL 2008 R2 с подписчиками по запросу, когда мы добавляем статью, я бы хотел избежать создания полного снимка (дБ составляет ~ 80 ГБ, так что это занимает часы).
Из этой статьи я видел, как сделать это с частичным снимком, отключив немедленную синхронизацию, но у нас это не сработало.
В идеале я хотел бы просто запустить это как часть нашего сценария db для создания таблицы, поэтому, если мы хотим, чтобы она реплицировалась, мы делаем:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
источник
источник
У меня был тот же вопрос, и, хотя я некоторое время работал администратором базы данных, я не занимался репликацией достаточно глубоко, чтобы с ней полностью справиться, поэтому я подумал, что следующие ресурсы и руководства были полезны:
Этот блог , в котором представлена хорошая схема процесса. Это также напоминает нам о том, что, если у вас есть большая существующая публикация, и ее опция установлена на «немедленный_синхронизация», это приведет к тому, что при каждом добавлении или изменении статьи будет готовиться совершенно новый снимок. Таким образом, у него есть полезный совет, чтобы изменить эту опцию, используя
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
Сообщение в блоге MSDN в "repltalk" (звучит как хороший ресурс в целом!) - не "напрямую", но все же полезно
Этот вопрос, где @ Brandon-Williams указал, что, если это подписка на Pull , вы также должны обновить ее, используя
sp_refreshSubscriptions @publication = 'MyPub'
Монитор репликации SSMS - удобный способ остановки и запуска агентов (моментальных снимков, чтения журнала) при следовании руководству.
Вот фактические шаги, которые я выполнил, которые сработали хорошо и получили одобрение моего руководящего администратора баз данных:
sp_changePublication
- да, как указывает @cody_konior, это недостаточно документировано, но в моем случае оно работало нормально. YMMVsp_addArticle
sp_articleColumn
(указанная публикация и статья, НЕ указывали столбцы -> подразумевает ВСЕ столбцы)sp_refreshSubscriptions
для этой публикации, чтобы обновить тягуИ хотя да, вы могли бы сделать большинство изменений с помощью графического пользовательского интерфейса SSMS, я считаю полезным записать все это так, чтобы оно могло быть A) под контролем исходного кода (change-control) и B) развернуто многократно или в нескольких экземплярах , К сожалению, я не тратил время на написание сценариев остановок / запусков агента, но это не должно быть слишком сложно, учитывая, что это всего лишь задания агента SQL. Вам просто нужно проделать весь этот трюк «найти JobID с помощью Job-Name» (запрос
sysjobs
- действительно, MS?) ...Надеюсь, что это поможет будущим читателям!
источник
Как отмечалось в разделе «Добавление статей к удалению статей из существующих публикаций» , вы должны * создать новый снимок для публикации.
Чтобы избежать создания моментального снимка для всех статей при добавлении новой статьи, для свойства публикации
immediate_sync
должно быть установлено значение 0. Вызовитеsp_addarticle
, затемsp_addsubscription
. Если подписки тянуть, вы также должны позвонитьsp_refreshsubscriptions
. Затем создайте снимок, и будет создан только снимок для только что добавленной статьи.* Это рекомендуемый подход в электронной документации по SQL Server. Проблема вашего подхода в том, что он подвержен ошибкам.
источник
Основное редактирование Это полное переписывание этого ответа (принимая во внимание обоснованную критику, что предыдущая версия была подвержена ошибкам и могла вызвать проблемы)
Также размещена демонстрация того, как применить это к: Youtube - Репликация SQL Server: Как добавить статью, не делая снимок .
ВАЖНО: Это НЕ рекомендуемый подход от Microsoft, так что вы будете действовать самостоятельно, не пытайтесь применяя непосредственно к своей производственной среде, не проведя значительного изолированного тестирования и не освоившись с шагами!
Шаги, чтобы следовать:
Проверять:
Пример процесса
А) Создайте себе таблицу на своем издателе:
B) Создайте себе задание / proc / script для выполнения некоторых вставок / обновлений / удалений в [TableNotUsingSnap] (вы можете использовать это для проверки правильности синхронизации подписчика с использованием этого метода.
Предварительные шаги:
1. Создайте свою таблицу на подписчике
2. Создайте свои хранимые процедуры репликации (обновление / вставка / удаление) - на подписчике
Вы можете создать репл проки:
Изменение, которое вам нужно будет применить:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
чтобы не вставлять, если он уже тамIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
чтобы игнорировать обновление, которое не было применено (так как запись могла быть удалена на издателе перед синхронизацией данных)IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
чтобы игнорировать удаление, которое не применяется (так как запись могла быть удалена на издателе до того, как вы синхронизировали данные)sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
ШАГИ РАЗВЕРТЫВАНИЯ
3. Остановите распространителя - на распространителе (Push) или на подписчике (Pull)
4. Теперь добавьте статью в публикацию - Об издателе
Основные параметры:
sp_addarticle
-@pre_creation_cmd = N'none'
используется для указания агенту распространителя не удалять и создавать собственные объектыsp_addsubscription
-@sync_type = N'none'
используется, чтобы сообщать Distributer, что ему не нужно создавать новый снимок, он может просто поставить команды IUD в очередьsp_addarticle:
5. Синхронизируйте ваши данные через
Теперь вам нужно скопировать ваши данные подписчику, вы можете:
Точный метод, который вы используете, я оставлю на усмотрение читателя, он также будет зависеть от того, как долго вы хотите, чтобы ваш агент распространителя был остановлен.
ДОПОЛНИТЕЛЬНО: В качестве дополнительного шага в ваших тестах, здесь хорошее место для запуска вашего скрипта (из шага (B)) для создания действий IUD на [TableNotUsingSnap], чтобы вы могли обрести уверенность в этом методе.
6. Перезапустите агент распространения - На распространителе (push) или на подписчике (Pull).
источник