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

Откуда:
Сообщений: 581
Всем добрый день.
Собственно возникли вопросы по принципу работы данного типа репликации.
Есть два сервера, на сервере А есть таблица с 1.2млрд записей, на сервере Б есть копия этой таблицы, но без части полей из таблицы на сервере А.

Собственно, таблица на сервере Б (копия) была восстановлена и теперь требуется синхронизировать данные обоих таблиц в одностороннем порядке.

Как я понимаю, в данном случае, как раз подойдет метод репликации.

Теперь, про механику происходящего. На сервере А создается снапшот реплицируемых данных, в случае с репликацией транзакциями таблица на сервере А не блокируется. После того как снапшот готов, что произойдет с данными в таблице на сервере Б? Имеющиеся данные в таблице получателе останутся в ней доступны? Как будет проходить выявление расхождений в таблицах? Репликация просто добавит недостающую часть в таблицу получателя или полностью пересоздаст её?
25 сен 19, 16:25    [21979067]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1507
teCa,
для начала, как мне кажется, надо понять, что нет репликации транзакциЕЙ/ЯМИ, а есть репликация транзакциЙ. Исходя из этого ваши вопросы становятся несколько, э..., не совсем понятными...
25 сен 19, 16:58    [21979096]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
a_voronin
Member

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

О какой репликации идет речь? О репликации лога. Тогда транзакции будут реплицироваться как есть, все пишеться в лог, лог реплицируется, на другом сервере повторяется commit или rollback.

Если речь идет о merge репликации, то записи будут сравниваться и передаваться путем команды merge.

В любом случае вы получите копию данных и они будут целостны, если не использовать READ UNCOMMITED.
25 сен 19, 17:09    [21979106]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

Откуда:
Сообщений: 581
Sergey Sizov, спасибо за замечание.

Что касается транзакций, я понимаю, что для того, что-бы синхронизировать данные при помощи транзакций, необходимо, что-бы обе базы данных (если брать Транзакт Лог Шипинг), изначально должны находится в одном состоянии, например база приемник должна быть развернута из полного бэкапа базы источника.

Что касается моего вопроса, у меня есть 2 таблицы, обе в продакшене и сейчас между ними появилось расхождение. Если я создам репликацию между этими двумя таблицами, что произойдет с данными в таблице приемнике (они там уже есть и их очень много).
25 сен 19, 17:33    [21979140]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1507
teCa
Sergey Sizov, спасибо за замечание.

при помощи транзакций
Не при помощи, а путем переноса транзакций. Имеющихся/появляющихся в логе.
25 сен 19, 17:37    [21979147]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Что касается моего вопроса, у меня есть 2 таблицы, обе в продакшене и сейчас между ними появилось расхождение. Если я создам репликацию между этими двумя таблицами, что произойдет с данными в таблице приемнике (они там уже есть и их очень много).
Если репликация с инициализацией, то таблица на втором сервере станет копией таблицы из первого сервера, и далее эта идентичность таблиц будет поддерживаться.
25 сен 19, 17:59    [21979183]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

Откуда:
Сообщений: 581
alexeyvg
teCa
Что касается моего вопроса, у меня есть 2 таблицы, обе в продакшене и сейчас между ними появилось расхождение. Если я создам репликацию между этими двумя таблицами, что произойдет с данными в таблице приемнике (они там уже есть и их очень много).
Если репликация с инициализацией, то таблица на втором сервере станет копией таблицы из первого сервера, и далее эта идентичность таблиц будет поддерживаться.

Это я понял, я не понимаю каким образом она станет копией если в ней уже есть часть данных. Таблица просто пересоздастся целиком или сервер как то сравнит данные в этих таблицах?
25 сен 19, 18:56    [21979219]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Это я понял, я не понимаю каким образом она станет копией если в ней уже есть часть данных. Таблица просто пересоздастся целиком или сервер как то сравнит данные в этих таблицах?
Да, технически это будет сделано путём пересоздания таблицы, и загрузки (bcp) в неё данных из публикации.

Стандартное сравнение делать слишком долго, намного дольше, чем перезалить.

Если таблица очень большая, и вы не хотите, что бы она загружалась с нуля, то можно выполнить начальную синхронизацию самому (если вы знаете, исходя из бизнес-логики данных, как это сделать быстрее, чем инициализация стандартными средствами).
25 сен 19, 19:00    [21979221]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Спасибо.
25 сен 19, 19:06    [21979224]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

Откуда:
Сообщений: 581
alexeyvg
teCa
Это я понял, я не понимаю каким образом она станет копией если в ней уже есть часть данных. Таблица просто пересоздастся целиком или сервер как то сравнит данные в этих таблицах?
Да, технически это будет сделано путём пересоздания таблицы, и загрузки (bcp) в неё данных из публикации.

Стандартное сравнение делать слишком долго, намного дольше, чем перезалить.

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


Еще один вопрос, если в таблице приемнике мне не нужны все столбцы таблицы источника, в этом случае нужно применить фильтр при настройке репликации?
25 сен 19, 20:12    [21979256]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

Откуда:
Сообщений: 581
teCa
alexeyvg
пропущено...
Да, технически это будет сделано путём пересоздания таблицы, и загрузки (bcp) в неё данных из публикации.

Стандартное сравнение делать слишком долго, намного дольше, чем перезалить.

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


Еще один вопрос, если в таблице приемнике мне не нужны все столбцы таблицы источника, в этом случае нужно применить фильтр при настройке репликации?


Все, понял, что просто публикуемые столбы я выбираю.
25 сен 19, 20:15    [21979259]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
teCa
Еще один вопрос, если в таблице приемнике мне не нужны все столбцы таблицы источника, в этом случае нужно применить фильтр при настройке репликации?

Все, понял, что просто публикуемые столбы я выбираю.
Да, можно выбрать не все столбцы.
25 сен 19, 20:46    [21979274]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2374
alexeyvg
Да, можно выбрать не все столбцы.

и не все строчки )
26 сен 19, 11:39    [21979592]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Немножко я всё поломал :(
Собственно дело в следующем.
Я создал репликацию транзакций на сервере издателе, на нем уже была настроена репликация снапшотом одной из таблиц БД.
Репликацию я создал, но так как принял решение восстановить разрыв другими средствами, то решил, что в данной репликации я не нуждаюсь и решил, что достаточно будет отключить Snapshot Agent и Log Reader Agent.
Но спустя сутки увидел что Log транзакций занял всё свободное место на диске, как я понял, транзакции в логе сохранялись, так как Log Reader Agent был остановлен. Приняв решение удалить эту репликацию, на сервере издателе я через визард Disable Publishing and Distribution выбрал мою публикацию и отключил её. Но при этом, чего я не ожидал пропала Публикация снапшотом, которую я не собирался трогать. Подписка на получателе осталась, а публикация пропала. Создав публикацию заново, я уже не смог создать подписку, сервер выдал следующую ошибку.

автор
A push subscription to the publication exists. Use sp_subscription_cleanup to drop defunct push subscriptions.
Cannot add a Distribution Agent at the Subscriber for a push subscription.
Changed database context to


Подскажите, как мне поступить дальше, что-бы восстановить нужную репликацию и что я сделал не так в своих действиях, что-бы впредь не наступать на эти грабли. Спасибо.
27 сен 19, 10:35    [21980592]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Ну собственно изучив вопрос, убил старую подписку (так как это действие не трогает данные в получателе) и пересоздал её для новой публикации. Снапшот создается при инициализации подписчика.

Как я понимаю, данные будут реплицированы после создания снапшота, а снопшот создастся после инициализации подписчиком.

Правильно я понимаю?
27 сен 19, 13:15    [21980820]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Репликацию я создал, но так как принял решение восстановить разрыв другими средствами, то решил, что в данной репликации я не нуждаюсь и решил, что достаточно будет отключить Snapshot Agent и Log Reader Agent.
Не, так неправильно.

Отключив Snapshot агента, вы просто отключили вызов проги, которая создаёт снапшот.
Но при этом у вас есть репликация, которая находится в статусе ожидание инициализации базы.

А отключив Log Reader Agent, вы отключили одну из подсистем того, что, собственно, является системой репликации транзакций.

А вам нужно было просто установить свойство "сделаю инициализацию сам".
То есть при создании подписки (sp_addsubscription), указать параметр @sync_type = 'replication support only'

teCa
Создав публикацию заново, я уже не смог создать подписку, сервер выдал следующую ошибку.

автор
A push subscription to the publication exists. Use sp_subscription_cleanup to drop defunct push subscriptions.
Cannot add a Distribution Agent at the Subscriber for a push subscription.
Changed database context to
Так надо удалить старую подписку. Вам же сервер подсказывает в сообщении об ошибке.

Можете посмотреть публикации:
select * from [dbo].[syspublications]

Найти старую публикацию, и потом удалить старую подписку, используя найденное имя:
exec sp_dropsubscription
	@publication = 'имя публикации',
	@article= N'all',
	@subscriber = N'all';

Наверное, если неохота разбираться скриптами, можно сделать всё это мышкой, но я не уверен, не подскажу, как.

Вообще, изучение системы репликации MS SQL лучше начинать с скриптов.
И не переходить к репликационным GUI в SSMS, пока не научишся создавать и менять публикации, создавать и удалять подписки, проводить запуск и остановку, делать инициализацию.
Тогда появятся хоть какие то основы знаний о том, как это всё устроено.
27 сен 19, 13:37    [21980847]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Как я понимаю, данные будут реплицированы после создания снапшота, а снопшот создастся после инициализации подписчиком.
Снапшот будет создан тогда, когда какая то из подписок его запросит, потому что он ей нужен для инициализации (а его при этом нет).
Если его запросит ещё пяток подписок, то повторно он создаваться не будет.

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

PS Инициализация, кстати, не обязательно должна делаться снапшотом, её сервер может сделать через бакап.
27 сен 19, 13:45    [21980860]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Спасибо Алексей за ваши ответы. В скриптах разбираться не лень, просто с темой репликаций в своей практике столкнулся впервые, а на поверхности мануалы использующие гуи.

Собственно именно момент накопления лога транзакция я и не учел.

Подскажите, в данный момент я создал новую публикацию, но уже не транзакций, а снапшота. Данная табличка не очень большая (300 000 строк) и данные в ней изменяются очень редко. Как я понимаю, репликация снапшотом в данном случае подходит. При данном виде репликации я вижу только Snapshot Agent, который находится сейчас в режиме:

автор
[0%] A snapshot was not generated because no subscriptions needed initialization.


Почему я не вижу Log Reader Agent? Как я понимаю, именно он должен отправить информацию подписчику, а тот в свою очередь инициировать новый снапшот?
27 сен 19, 14:15    [21980910]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Подскажите, в данный момент я создал новую публикацию, но уже не транзакций, а снапшота. Данная табличка не очень большая (300 000 строк) и данные в ней изменяются очень редко. Как я понимаю, репликация снапшотом в данном случае подходит.

Почему я не вижу Log Reader Agent? Как я понимаю, именно он должен отправить информацию подписчику, а тот в свою очередь инициировать новый снапшот?

Log Reader Agent читает лог, и отправляет транзакции подписчикам.
К снапшоту он не имеет отношения, и к снапшот репликации тоже, потому что ей не нужны транзакции.
То есть, запомните: Log Reader Agent - читатель лога транзакций, и больше ничего.

Снапшот-репликация периодически (или один раз) накатывает снапшот на подписчика, для чего подписка сама его дёргает.

Если репликация транзакционная, то Log Reader Agent тоже не занимается снапшотами. Их запрашивает подписка.

teCa
При данном виде репликации я вижу только Snapshot Agent, который находится сейчас в режиме:

автор
[0%] A snapshot was not generated because no subscriptions needed initialization.
Режим такой, потому что вы не сделали подписку.

Snapshot Agent ждёт, когда понадобится снапшот (для репликации любого типа), и вот когда понадобится, он его сделает.
Соответственно, пока подписки нет, ничего делать не надо.
27 сен 19, 20:35    [21981318]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Подписку я создал.

К сообщению приложен файл. Размер - 24Kb
30 сен 19, 10:38    [21982422]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Подписку я создал.
Подписка видна, но, может, она для той, удалённой публикации?
Конечно, лечить на расстоянии сложно, "у меня не работает", а почему не работает? Вы же понимаете, что вам никто не ответит, что "у микрософта не работают подписки".
Тут варианты простые - либо вы не так создаёте публикацию/подписку, либо вы руками что то сломали (типа джобов)

Можно попытаться всё удалить (подписку и публикацию), а потом отключить функциональность репликации (то есть подписчика, публикатора и дистрибьютора - все три).
А потом всё включить, и настроить заново
30 сен 19, 19:58    [21983189]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Нет, вы не поняли. Подписка создана новая и она работает, мне интересно, в какой момент времени должен создаться снапшот.
1 окт 19, 10:27    [21983513]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
teCa
Member

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

Учитывая, что эта подписка создана заново и снапшот для этой подписки никогда не создавался. Получается, что сейчас есть 2 таблицы между которыми настроена репликация, в обеих таблицах данные, в случае репликации транзакций, Log Reader отправляет подписчикам список транзакций, и как я понял, подписчик либо их применит либо может инициировать создание нового снапшота. А в случае репликации снапшотом, на моем примере, когда создастся снапшот, кто инициирует создание снапшота и на чем будет основана инициация.
1 окт 19, 10:44    [21983538]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa
Подписка создана новая и она работает
А, то есть снапшот был создан, и передался на подписчик(ов)?
teCa
мне интересно, в какой момент времени должен создаться снапшот.
Как указано в подписке.
Если, например, указано, что снапшот должен создаваться раз в сутки, то в первый раз он будет сделан при создании подписки, а потом с интервалом в сутки.
teCa
А в случае репликации снапшотом, на моем примере, когда создастся снапшот, кто инициирует создание снапшота и на чем будет основана инициация.
Я же писал: инициализирует подписка, а когда - зависит от её настроек.

Вы же указади, с какой частотой нужно делать снапшоты, и что после создания подписки тоже нужно сделать снапшот?
1 окт 19, 13:00    [21983766]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите про репликацию транзакцией.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
teCa,

Попробуйте ещё нажать ПКМ на публикацию, а потом View Shapchot Agent Status, и если там ничего, то нажать Start
Бывает, ошибки доступа вылезают.
1 окт 19, 13:09    [21983786]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить