Прекратить репликацию большой транзакции в SQL Server

У меня есть вопрос о попытке остановить крупную транзакцию в издателе, которая распространяется среди подписчиков. Допустим, кто-то случайно обновляет каждую запись в таблице с 50 миллионами записей, а затем, осознав свою ошибку, устанавливает все записи обратно. В этом случае изменения будут распределены по двум подписчикам в настройке репликации транзакций. В системе говорится, что будет 2 дня для репликации подписчикам, но как лучше это преодолеть?

Я видел, что это возможно и на самом деле очень легко пропустить команду, используя транзакцию xact_seqno,sp_helpsubscriptionerrors а также sp_setsubscriptionxactseqno, Однако что произойдет, если это будет использовано в транзакции, которая активно распространяется? Что-нибудь должно быть остановлено?

Если это не лучший способ преодолеть проблему, что будет?

4 ответа

В зависимости от размера таблицы удаление / повторное добавление этой статьи может быть быстрее. Поскольку снимок использует массовую копию для передачи строк подписчику, он должен быть довольно быстрым.

Однако я не проверял это конкретно: остановка выполняемой транзакции сама по себе не обязательно вызовет проблемы и приведет к ее откату - любой тип транзакции, включая реплицированные транзакции на подписчике от издателя. Это происходит из-за свойств ACID, которые всегда применяются к транзакциям, в частности, A, являющийся атомарностью - либо все в транзакции происходит, либо ничего не происходит. Таким образом, остановленная или неудачная транзакция будет полностью отменена.

Я не знаю другого способа остановить репликацию транзакции, но используйте sp_setsubscriptionxactseqno с осторожностью вам нужно не только убедиться, что вы правильно указали LSN, но что бы ни случилось, это будет означать, что вы - издатель и подписчик - больше не синхронизированы. На практике это может не иметь значения, но это должно быть соображение.

Если вы еще не ознакомились с Technet / MSDN (более или менее та же статья зависит от того, предпочитаете ли вы Tnet от devNet), если вы еще этого не сделали, и этот пост в блоге на MSDN, это поможет. NB sp_setsubscriptionxactseqno должен быть запущен на подписчике (и на каждом, на котором вы хотите, чтобы он пропускался).

Альтернатива, и без какой-либо другой информации, я бы порекомендовал просто позволить ей работать. Это может быть не идеально, но это самая безопасная и наименее трудоемкая работа. Является ли система критической и зависимой от времени, что 2 дня вызовут значительные проблемы?

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

Насколько важна целостность ваших данных и какова ваша способность к восстановлению? С каким размером пакета вы установили репликацию? Вы можете остановить планировщики и просто позволить завершить текущий xact, чтобы не вводить откат для подписчиков. Вы можете получить доступ к таблицам издателя и сбросить транзакции, но при этом также будут удалены все другие изменения, которые были зарегистрированы. Возможно, вам придется заново выровнять данные. Сама репликация должна была разделить обновления на меньшие номера транзакций (xact_seqno). И тогда вы можете удалить записи из очередей. Убедитесь, что нет очередей в очереди самих себя. 50M может раздвинуть ограничения хранилища, которое вы дали таблицам очередей распространения, поэтому, как только вы начнете очистку с помощью xact_secno, убедитесь, что нет ни одной, которая все еще записывается. Вы можете проверить, какие команды есть, и посмотреть, идет ли речь о том же массовом обновлении или новой активности. И будьте готовы потерять все другие репликации данных из других таблиц или из этого, пока вы это делаете (в зависимости от того, как вы настроили транзакции). И имейте план реорганизации для подписчиков после завершения репликации.

Не влияет на то, какая транзакция активна или нет. Так как это не повлияет на работу транзакции, это только пропустит эту транзакцию и вызовет проблемы целостности данных.

Агент чтения журнала читает все записи, обновленные в издателе, и обновляет их в БД распространителя, наконец помечает их как зафиксированные...

Теперь агент распространения применяет все команды, которые имеют более высокую временную метку, чем столбец action_timestamp в таблице msreplication_subscription.

select publisher_database_id, xact_id, xact_seqno, entry_time from msrepl_transactions order by publisher_database_id

Итак, в основном мы говорим о том, как заставить подписчика начать с другой команды или даже пропустить ее. Вы можете использовать команду ниже в базе данных подписчика, чтобы пропустить эту транзакцию.

sp_setsubscriptionxactseqno [ @publisher = ] 'publisher'  
        , [ @publisher_db = ] 'publisher_db'  
        , [ @publication = ] 'publication'  
        , [ @xact_seqno = ] xact_seqno   
Другие вопросы по тегам