SQL Transactional Replication - начальный снимок устанавливает блокировку таблицы?
Когда при настройке репликации транзакций SQL Server создается исходный моментальный снимок, знает ли кто-нибудь, устанавливает ли агент моментальных снимков блокировки для выбранных вами таблиц (статей)? У меня есть несколько таблиц, которые содержат более 2 миллионов строк, и я хотел узнать, действительно ли SQL Server устанавливает блокировки таблиц для предотвращения обновлений, когда база данных публикации находится в сети. Если блокировки установлены, то я хочу запустить начальный моментальный снимок в нерабочее время производства.
Спасибо!
3 ответа
В репликации транзакций или любого другого типа репликации отправной точкой является моментальный снимок базы данных. Начальный шаг создания моментального снимка точно такой же для любого типа репликации.
SQL Server вообще не получает никаких блокировок при создании снимка, он буквально является снимком базы данных в определенный момент времени, и создание снимка не мешает каким-либо транзакциям. Неподтвержденные транзакции откатываются в моментальном снимке после его создания.
Чтобы узнать больше о том, как работает моментальный снимок базы данных, прочитайте эту статью в MSDN How Database Snapshots Work
Если вы работаете в выпуске SQL Server, который поддерживает снимки базы данных (как в create database [foo]... as snapshot of [bar]
), то вы можете по желанию использовать их в качестве основы снимка. Проверьте параметр @sync_method в sp_addpublication. Предостережение заключается в том, что вы все еще, вероятно, захотите сделать это в нерабочее время дня из-за того, как работают моментальные снимки базы данных (то есть копирование при записи замедлит любую операцию записи), но вы не будете бороться за блокировки,
Начиная с SQL Server 2005 значение @sync_method по умолчанию для sp_addpublication равно "одновременному", что означает, что таблицы не блокируются во время работы агента snaphsot. Обратите внимание, что это не совсем так: агент моментальных снимков устанавливает блокировки схемы на таблицы, но продолжительность этой блокировки составляет не более нескольких секунд.
Так что если вы установите @sync_method = "одновременный", то нет, обновления, по идее, не будут заблокированы. Если @sync_method = "native" (по умолчанию в SQL Server 2000) или "symbol", тогда да, обновления будут заблокированы.