Знакомимся с репликацией транзакций в SQL ServerИсточник: osp Джозеф Сек
Базовое развертываниеРепликация SQL Server включает набор возможностей, которые полностью пока еще не заменены другими функциями, реализованными в SQL Server. Некоторые из распространенных примеров использования предусматривают возможность распределения данных между различными экземплярами SQL Server и базами данных для формирования отчетов и разгрузки основной производственной базы данных. Репликация может приблизить данные к пользователям в распределенных средах и масштабировать производительность путем многоадресной пересылки данных. Кроме того, некоторые находят место для репликации даже в задачах восстановления после аварий и обеспечения высокой доступности (более подробно об этом рассказано в статье Пола Рэндала In defense of transactional replication as an HA technology по адресу http://www.sqlskills.com/blogs/paul/in-defense-of-transactional-replication-as-an-ha-technology). Хотя процесс изучения репликации может казаться сложным, для успешного использования репликации достаточно разобраться в составляющих ее компонентах. А это позволяет сделать практическое развертывание базовых конфигураций и последующее изучение сопутствующих модификаций пользовательской схемы, объектов метаданных, заданий агента SQL Server Agent и связанных с этим настроек агента. Чтобы вам помочь, вначале я кратко пройдусь по терминологии репликации и покажу, как работают различные компоненты. Затем мы выполним типовое развертывание репликации транзакций, одного из самых распространенных типов репликации. Базовые понятия репликацииСуществуют различные типы репликации, поэтому я начну описание набора возможностей с самого верхнего уровня. Репликация - это набор технологий, позволяющий копировать, распространять и синхронизировать определенные типы объектов базы данных и связанных с ними данных и зависимостей между ними из одной базы данных в одну или несколько других баз данных в одном и том же экземпляре или в разных экземплярах SQL Server. Экземпляр SQL Server, содержащий базу данных, из которой распространяются данные, называется издателем (Publisher). В одной базе данных можно определить одну или более публикаций (Publication), которые логически объединяются в одну или более статей (Article). Статья представляет собой особый объект в базе данных публикации, который требуется переслать в другую базу данных. Допустимые типы объектов в статьях включают в себя определяемые пользователем таблицы, хранимые процедуры и представления. Для репликации необходима отдельная база данных для хранения метаданных и пересылаемых данных. Такая база данных называется базой данных распространителя (Distribution Database), а экземпляр SQL Server, на котором она хранится, - распространителем (Distributor). Распространитель может быть тем же экземпляром SQL Server, что и издатель, отдельными экземпляром или экземпляром, на который пересылаются данные. Решение о размещении базы данных распространителя обычно базируется на рассмотрении таких моментов как загруженность или доступность (например, если репликация транзакций сочетается с зеркалированием баз данных). Сервер, получающий данные от издателя, называется подписчиком (Subscriber). Подписчиком может быть тот же экземпляр SQL Server, что и издатель, экземпляр, являющийся распространителем, или отдельный экземпляр SQL Server. Подписчик определяется с помощью добавления подписки на определенную публикацию. База данных подписчика может содержать как реплицированные, так и нереплицированные объекты, и хранить более одной подписки от разных публикаций. Подписка может быть определена как принудительная (push), при этом данные принудительно пересылаются от распространителя в базу данных подписчика, или как подписка по запросу (pull), когда данные запрашиваются подписчиком. Принудительные подписки более распространены при развертывании репликации моментальных снимков (snapshot replication) и репликации транзакций (transactional replication). Подписки по запросу обычно используются при репликации слиянием (merge replication), так как подписчик может чаще отключаться от коммуникаций и требовать проверки данных, обновляемых по запросу. Решение о выборе вида подписки также может базироваться на емкости и объеме избыточной нагрузки серверов, участвующих в топологии репликации. Внешние исполняемые модули, называемые агентами репликации, передают данные от издателя к распространителю и затем к подписчику. Тип агента репликации зависит от используемого типа репликации. Выбор типа репликацииСуществует три основных типа репликации: репликация моментального снимка, репликация транзакций и репликация слиянием. Встречаются и базирующиеся на этих типах различные вариации, например одноранговая репликация (peer-to-peer replication), но мы не будем в этой статье их обсуждать. Репликация моментального снимка позволяет распространять данные на определенный момент времени. Снимок пересылается и более не обновляется процессом репликации, пока не будет сделан новый снимок, который будет отправлен подписчику. Репликация моментального снимка обычно используется для формирования схемы статей и связанных с ней данных у подписчика для репликации транзакций и репликации слиянием. Репликация слиянием позволяет подписчику напрямую модифицировать данные подписки (статьи) и затем синхронизировать модифицированные строки с издателем. Как указывалось ранее, подписчики могут быть некоторое время отключены от коммуникаций, периодически подключаться и синхронизировать данные по запросу. В этот момент их изменения синхронизируются с издателем и наоборот. Это может привести к конфликту данных, когда издатель и один или более подписчиков пытаются модифицировать одни и те же данные. Последний тип репликации - тот, который мы рассмотрим, - репликация транзакций. При правильном проектировании репликация транзакций может обеспечивать потоковое изменение данных с низким уровнем задержек, выполняемое издателем для одного или более подписчиков. Реплицируемые данные, как правило, обрабатываются подписчиком в режиме "только чтение". Модификация данных у подписчика может привести к нарушению синхронизации всего набора данных с данными издателя. Репликация транзакций предоставляет не рекомендуемую сейчас функцию обновляемых подписок (updatable subscriptions), которая позволяет подписчику реплицировать данные в обратном направлении, к издателю. Одноранговая репликация (возможность SQL Server редакции Enterprise) также позволяет выполнять двунаправленную репликацию изменений в данных, используемых в базах данных с репликацией транзакций. Развертывание репликации транзакцийПоскольку данная статья представляет собой введение в репликацию транзакций, я продемонстрирую использование различных мастеров консоли SQL Server Management Studio (SSMS) для реализации соответствующих функций. Кроме того, вы можете использовать сценарии. Более подробно об этом рассказано во врезке "Мастера или сценарии?". Чтобы воспроизвести описанные в статье действия, необходимо иметь аналог среды со следующими характеристиками.
В качестве базы данных публикации используется демонстрационная база данных AdventureWorks версии SQL Server 2008 R2 (http://msftdbprodsamples.codeplex.com/). Мы будем реплицировать описания таблиц и соответствующие данные для следующих таблиц базы данных AdventureWorks: [Person].[Address] [Person].[Contact] [Person].[CountryRegion] [Person].[StateProvince] [HumanResources].[Employee] [HumanResources].[EmployeeAddress] Кроме того, будет реплицироваться описание представления [HumanResources].[vEmployee]. И хотя представление не содержит данных, можно реплицировать описание этого объекта, при условии, что все зависимые объекты включены в публикацию. Настройка экземпляра SQL Server для публикацииДалее описаны шаги по настройке экземпляра SQL Server в качестве издателя.
Разрешение публикации базы данныхНиже описаны шаги для разрешения публикации базы данных.
Настройка параметров безопасности для агентовДалее приведены шаги для подготовки минимальных требуемых разрешений для трех учетных записей службы агентов репликации, используемых в данной демонстрационной топологии.
Хотя вы в нескольких местах назначили разрешения db_owner, это официально объявлено минимально необходимыми разрешениями. По сравнению с разрешениями sysadmin вы создали более защищенную конфигурацию. Создание публикацииДля создания новой публикации выполните следующие действия.
Создание принудительной подписки Для создания новой принудительной подписки необходимо выполнить следующие действия.
Тестирование репликацииТеперь необходимо протестировать настроенную репликацию и убедиться, что она работает надлежащим образом. Выполните следующие действия. 1. В базе данных публикации выполните код: INSERT [Person].[Address] (AddressLine1, City, StateProvinceID, PostalCode) VALUES ('2222 Test Drive', 'Minneapolis', 36, 55410);2. Подождите секунд 10, затем выполните операцию SELECT на сервере-подписчике: SELECT AddressID FROM [Person].[Address] WHERE AddressLine1 = '2222 Test Drive';Если все было сделано правильно, то будут возвращены только что вставленные строки. 3. Протестируйте репликацию представления на сервер-подписчик с помощью кода: SELECT COUNT(*) FROM HumanResources.vEmployee;У меня после исполнения данного кода было выдано 250 строк и не было никаких сообщений об ошибках, что указывает на то, что все зависимые объекты были реплицированы. Изучение на практикеДанное введение в репликацию транзакций представляет собой лишь верхний пласт знаний о развертывании и поддержке в среде репликации транзакций. И хотя объем материала для изучения может показаться устрашающим, наилучшим способом повышения квалификации в области репликации является ее практическое использование в вашей работе, связанной с обслуживанием корпоративных приложений и бизнес-задач. Листинг 1. Код для создания учетной записи агента моментальных снимков в базах данных публикации и распространителя USE [master]; GO CREATE LOGIN [SQLskills\SQLskillsSnapshotAGT] FROM WINDOWS; USE [distribution]; GO CREATE USER [SQLskills\SQLskillsSnapshotAGT] FOR LOGIN [SQLskills\SQLskillsSnapshotAGT]; EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsSnapshotAGT'; USE [AdventureWorks]; GO CREATE USER [SQLskills\SQLskillsSnapshotAGT] FOR LOGIN [SQLskills\SQLskillsSnapshotAGT]; EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsSnapshotAGT';Листинг 2. Код для создания учетной записи агента чтения журнала в базах данных публикации и распространителя USE [master]; GO CREATE LOGIN [SQLskills\SQLskillsLogReaderAG] FROM WINDOWS; USE [AdventureWorks]; GO CREATE USER [SQLSKILLS\SQLskillsLogReaderAG] FOR LOGIN [SQLSKILLS\SQLskillsLogReaderAG]; EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsLogReaderAG'; USE [distribution]; GO CREATE USER [SQLSKILLS\SQLskillsLogReaderAG] FOR LOGIN [SQLSKILLS\SQLskillsLogReaderAG]; EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsLogReaderAG';Листинг 3. Код для создания учетной записи агента распространителя в базе данных распространителя USE [master]; GO CREATE LOGIN [SQLskills\SQLskillsDistAGT] FROM WINDOWS; USE [distribution]; GO CREATE USER [SQLskills\SQLskillsDistAGT] FOR LOGIN [SQLskills\SQLskillsDistAGT] EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsDistAGT';Листинг 4. Код для создания учетной записи агента распространителя в базе данных подписчика USE [master]; GO CREATE LOGIN [SQLskills\SQLskillsDistAGT] FROM WINDOWS; USE [AWReporting]; GO CREATE USER [SQLSKILLS\SQLskillsDistAGT] FOR LOGIN [SQLSKILLS\SQLskillsDistAGT] EXEC sp_addrolemember N'db_owner', N'SQLskills\SQLskillsDistAGT'Мастера или сценарии? Администраторы баз данных могут использовать комбинацию мастеров SQL Server Management Studio (SSMS) и сценариев для развертывания и поддержки репликации транзакций. Если вы серьезно относитесь к поддержке репликации для критически важных задач, хорошо изучите оба этих метода. Используйте мастера для быстрого предварительного создания сценариев, а затем тестируйте их и вносите необходимые изменения. Используйте сценарии для автоматизации развертывания, проверки требуемых настроек и быстрого восстановления. Например, в процессе данного тестового развертывания репликации я рекомендую параллельно использовать сценарии на различных экранах мастера, чтобы вы могли видеть, что происходит "за кулисами" этого процесса. |