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

Откуда:
Сообщений: 263
Всем привет.
Имеем 2 сервера MS SQL Server 2008 R2, Между которыми настроена репликация транзакций. 1-й сервер издатель, 2-й подписчик.
Клиентское приложение (не важно на чем написанное), пишет в таблицу БД сервера 1, и это изменение реплицируется в такую же таблицу БД сервера 2. Перед началом транзакции связь между серверами пропадает. Тут у меня 2 вопроса:
1) Как будет вести себя распространитель? будет ли повторять попытки провести неудавшуюся репликацию?
2) Надо чтобы клиент, писавший в сервер 1 узнал о том, что запись во второй сервер не состоялась. Как это реализовать?
12 окт 11, 18:03    [11429180]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
host.13
1) Как будет вести себя распространитель? будет ли повторять попытки провести неудавшуюся репликацию?
2) Надо чтобы клиент, писавший в сервер 1 узнал о том, что запись во второй сервер не состоялась. Как это реализовать?
1. Будет.

2. Это довольно сложно...
Для начала нужно описать эту задачу детальнее. Хотя бы прояснить вопрос, как клиент может идентифицировать сделанное им изменение.
12 окт 11, 18:15    [11429242]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
У меня была похожая задача. Я реализовал её с помощью Service Broker.
После успешной синхронизации (нужный шаг я добавил в джоб синхронизации) на подписчик отправлялось сообщение, которое запускало определённую процедуру. Вы можете запустить процедуру, которая просигнализирует, что всё прошло успешно.
12 окт 11, 18:37    [11429363]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
host.13
Member

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

По второму вопросу хотелось бы так. Клиент пишет в БД 1, и если репликация в БД 2 неудачна, то на сервере 1 запускается хранимка, которая отсылает по сети пакет с сообщением об неудачном завершении репликации и откатывает изменения, сделанные пользователем 1. Клиент, получив пакет, выводит сообщение пользователю. Как отловить событие, когда репликация неудачна?
13 окт 11, 09:59    [11431472]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
iljy
Member

Откуда:
Сообщений: 8711
host.13,

у репликации есть собственные механизмы восстановление при разрыве соединения, чем они вас не устроили? Зачем нужно вешать такой функционал на клиент?
13 окт 11, 10:12    [11431555]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
host.13
Клиент пишет в БД 1, и если репликация в БД 2 неудачна, то на сервере 1 запускается хранимка, которая отсылает по сети пакет с сообщением об неудачном завершении репликации и откатывает изменения, сделанные пользователем 1. Клиент, получив пакет, выводит сообщение пользователю. Как отловить событие, когда репликация неудачна?


Репликация выполняется джобом, если она завершилась неудачно, по идее джоб (а конкретно, шаг, именуемый по умолчанию "Run agent.") завершится с ошибкой. Не уверен, правда, что это работает при репликации по FTP.
А завершение джоба(шага) с ошибкой легко можно обработать или встроенной рассылкой, или добавлением своих шагов.

Или я чего-то не понял?
13 окт 11, 10:48    [11431806]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
host.13
alexeyvg,

По второму вопросу хотелось бы так. Клиент пишет в БД 1, и если репликация в БД 2 неудачна, то на сервере 1 запускается хранимка, которая отсылает по сети пакет с сообщением об неудачном завершении репликации и откатывает изменения, сделанные пользователем 1. Клиент, получив пакет, выводит сообщение пользователю. Как отловить событие, когда репликация неудачна?
Слабенькая постановка задачи :-)

Вы сценарии расписывайте. Допустим,
Клиент 1 пишет в БД 1
update table set name = '1' where id=1
Клиент 2 пишет в БД 1
update table set name = '2' where id=1
Клиент 3 пишет в БД 1
update table set name = '3' where id=1

Через секунду в базу 2 приходит транзакция 1
Через неделю в базу 2 приходит транзакция 2
Транзакция 3 в базу 2 никогда не приходит (кстати, тут 2 варианта - никогда не приходит или приходит, но отклоняется к применению в базе 2 - это тоже интересно)

При этом клиент 1 выключил комп через час, клиент 2 выключил комп через день и уволился, клиент 3 выключил комп через час и залогинился под тем же именем на другом компе
13 окт 11, 15:45    [11434962]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Jovanny
agent.") завершится с ошибкой.
Неправильно, наверное. Впрочем, это может сказать только ТС

Например, джоб выполняется без ошибок, но ни одна из транзакций в подписчика не попадает. По вашему это не ошибка, но ТС может думать по другому.
13 окт 11, 15:47    [11434994]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
alexeyvg
Например, джоб выполняется без ошибок, но ни одна из транзакций в подписчика не попадает.

Это в каких же случаях? Повторю, что при репликации через FTP не знаю, не пробовал, но скорее всего не сработает.
А при репликации транзакций распространитель коннектится к подписчику и пытается выполнить определённые хранимые процедуры. Если сеанс выбросит исключение, мне кажется, шаг завершится с ошибкой.
13 окт 11, 15:58    [11435133]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Jovanny
alexeyvg
Например, джоб выполняется без ошибок, но ни одна из транзакций в подписчика не попадает.

Это в каких же случаях? Повторю, что при репликации через FTP не знаю, не пробовал, но скорее всего не сработает.
А при репликации транзакций распространитель коннектится к подписчику и пытается выполнить определённые хранимые процедуры. Если сеанс выбросит исключение, мне кажется, шаг завершится с ошибкой.
Это зависит от настроек.

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

Хотя в принципе это к нему вопрос...
13 окт 11, 16:03    [11435180]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
alexeyvg
Jovanny
Это в каких же случаях? Повторю, что при репликации через FTP не знаю, не пробовал, но скорее всего не сработает.
А при репликации транзакций распространитель коннектится к подписчику и пытается выполнить определённые хранимые процедуры. Если сеанс выбросит исключение, мне кажется, шаг завершится с ошибкой.
Это зависит от настроек.

Думаю, если у ТС репликация останавливается после любой ошибки, то тогда и задачи такой не стояло бы.
Кроме того, может и просто медленно идти транзакция.
13 окт 11, 16:04    [11435201]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
host.13
Member

Откуда:
Сообщений: 263
Распишу сценарий.
Клиент 1 пишет в БД1:
update table set name = '1' where id=1
На период обновления строка с id=1 блокируется, и остальные клиенты туда не могут ничего записать. Тут же начинается репликация в БД2, причем она проваливается по таймауту, далее клиенту 1 приходит сообщение об ошибке, и изменения, сделанные клиентом 1 откатываются. Откат изменений происходит без участия клиента 1, так что уволился ли он в отпуск на обед не имеет значения.
Эта схема реальна тогда, когда (update + репликация + обработкой ошибок + рассылка сообщений о результатах) - атомарная операция, или набор действий, выполняющихся рамках одной транзакции. Все вроде бы реально, да не хочется отходить от стандартных инструментов репликации и писать что-то свое для реплицирования.
13 окт 11, 17:19    [11436241]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
host.13
Member

Откуда:
Сообщений: 263
Добавлю, что если связь клиент - БД1 гигабит, а БД1-БД2 - dialup, то с точки зрения клиента скорость записи в БД1 - dialup, потому что он не получит сообщения об успешно результате, пока изменения не попадут в БД2
13 окт 11, 17:46    [11436534]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
host.13,

У вас превратные представления о репликации транзакций. Реплицируются только подтвержденные транзакции. Следовательно сценарий
host.13
На период обновления строка с id=1 блокируется, и остальные клиенты туда не могут ничего записать. Тут же начинается репликация в БД2, причем она проваливается по таймауту, далее клиенту 1 приходит сообщение об ошибке, и изменения, сделанные клиентом 1 откатываются. Откат изменений происходит без участия клиента 1, так что уволился ли он в отпуск на обед не имеет значения
невозможен в принципе. Где вы вообще вычитали, что такое возможно?
Смотрите в сторону распределенных транзакций.
13 окт 11, 18:43    [11436970]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
invm
host.13,

У вас превратные представления о репликации транзакций. Реплицируются только подтвержденные транзакции.
+1, так нельзя сделать стандартной репликацией.

Да и вообще, работа системы в офисе будет зависеть от канала связи с фиилалом. Оыбчно так не делают :-(
13 окт 11, 20:39    [11437414]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, успешно ли прошла репликация?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
host.13
Распишу сценарий.
Клиент 1 пишет в БД1:
update table set name = '1' where id=1
На период обновления строка с id=1 блокируется, и остальные клиенты туда не могут ничего записать. Тут же начинается репликация в БД2, причем она проваливается по таймауту, далее клиенту 1 приходит сообщение об ошибке, и изменения, сделанные клиентом 1 откатываются.
Вообще все системы репликиции (не только для сиквела, для любой СУБД) используют такой подход:

В сервере-издателе делается поток транзакций, меняющий данные.
Некая подсистема репликации асинхронно распространяет эти изменения данных (для завершённых транзакций, конечно) на серверы-подписчики.
В рамках одной публикации и одного подписчика изменения применяются последовательно, в порядке транзакций на издателе, при этом некотрорые промежуточные состояния могут быть опущены (зависит от типа репликации)
13 окт 11, 20:47    [11437442]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить