Синхронизация БД SQL Server из различных источников

Сценарий использования

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

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

В любом подобном сценарии использования основная потребность – это постоянный обмен данными между мобильными устройствами на местах и общим хранилищем данных.

Как можно решить подобные задачи

1. Репликация SQL Server. С помощью репликации вы можете осуществлять синхронизацию удалённых баз данных между собой путём копирования данных. Но у неё (репликации SQL Server) есть ряд ограничений:

  • Только более дорогие редакции SQL Server Standard и Enterprise могут выступать в роли издателя (Publisher), поэтому если вы используете бесплатную редакцию SQL Express, то вам придётся обновиться.
  • Конфигурация из издателя (Publisher) SQL Server 2005 и подписчика (Subscriber) SQL Server 2008 не поддерживает web-репликацию.
  • Версия распространителя (Distributor) должна быть строго равна или выше версии издателя (Publisher).
  • В репликации транзакций (Transactional Replication) версия подписчика (Subscriber) не должна отличаться от издателя (Publisher) больше, чем на две версии SQL Server, т.е. издатель SQL Server 2000 не может работать с подписчиком SQL Server 2012.
  • В репликации слиянием (Merge Replication) версия подписчика (Subscriber) должна быть меньше или равна версии издателя (Publisher), т.е. подписчик SQL Server 2012 не сможет работать с издателем SQL Server 2008.

2. Sync Framework – API, которое позволяет создавать приложения для синхронизации данных между разными базами данных. Эта платформа более гибкая для решения подобных задач, но требует дополнительной разработки, что повышает стоимость и сроки реализации.

3. ApexSQL Data Diff – инструмент SQL Server для поиска различий в данных и синхронизации их между собой. Этот инструмент позволяет находить различия не только между базами данных, но и анализировать резервные копии БД, как обычные, так и сжатые. В результате анализа можно получить подробный отчёт о найденных расхождениях и файл синхронизации, который можно выполнить.

Как это сделать

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

  1. Запустите ApexSQL Data Diff
  2. В качестве источника (Source) укажите базу данных (Database). Далее укажите сервер БД и имя вашей центральной БД.
  3. В качестве назначения (Destination) укажите так же базу данных (Database). В качестве сервера укажите удалённое мобильное устройство медсестры и БД, которую необходимо синхронизировать.

    Datasources type and details selection in ApexSQL Data Diff

  4. Нажмите кнопку сравнить (Compare).

    После поиска различий вы получите результирующую таблицу (Main grid) с расхождениями по каждому объекту в ваших БД.

    Main grid after SQL Server database comparison

    Записи, вставленные в таблицу посещения (Visits) в больнице, показаны на вкладке отсутствующих записей (Missing).

  5. Укажите таблицы, которые вы хотите синхронизировать

    Checking the tables for database synchronization

  6. Нажмите синхронизировать (Synchronize) на вкладке главная (Home).

    Synchronize button in ApexSQL Data Diff

  7. На шаге направления синхронизации (Synchronization direction) мастера синхронизации (Synchronization wizard) нажмите далее (Next).
  8. В параметрах вывода результата (Output options) мастера синхронизации (Synchronization wizard) выберите в качестве действия синхронизировать базу данных (Synchronize a database).

    Choosing output action in Synchronization wizard

  9. Нажмите далее (Next).
  10. Просмотрите сводку действий, которые будут выполнены и вероятные предупреждения (Summary and warnings).

    Summary of the actions and warnings preview

  11. Нажмите синхронизировать (Synchronize) на вкладке главная (Home).
  12. В диалоговом окне уведомления нажмите ОК.

    SQL Server database change notification dialogue

    После завершения синхронизации вы увидите следующее уведомление

    Script execution results message

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

Для обратной синхронизации всех изменений, которые совершили медсёстры в течении дня необходимо выполнить похожие действия:

  1. В качестве источника (Source) укажите БД с мобильного устройства, а в качестве назначения (Destination) – центральное хранилище поликлиники.

    Selecting the SQL Server database Source and Destination

  2. Нажмите сравнить (Compare).
  3. Выберите таблицу, в которую были добавлены записи в течении дня, все новые значения можно увидеть на вкладке отсутствий (Missing):

    Comparison and synchronization of the Source and Destination databases

  4. В основном меню нажмите кнопку синхронизировать (Synchronize).
  5. С помощью мастера синхронизации (Synchronization wizard) укажите записи, которые необходимо добавить в центральное хранилище поликлиники.
  6. Нажмите кнопку сохранить (Save) на вкладке главная (Home), чтобы сохранить все настройки синхронизации в виде проекта, тем самым в следующий раз вы сможете легко и быстро выполнить подобную синхронизацию.

Теперь рассмотрим, как автоматизировать процесс синхронизации, при наличии проектов синхронизации.

    1. Сохраните следующую команду в виде bat-файла E:\Test\Morning.bat, который будет выполнять ранее созданный проект Morning_Central_Nurse.axdd:

      "C:\Program files 
      (x86)\ApexSQL\ApexSQLDataDiff2014\ApexSQLDataDiff.com" /
      pf:D: \Test\Morning_Central_Nurse.axdd /
      of:D: \Test\MorningSync.sql / sync / bu:D: \Test / v / f
      

      Он создаст в папке D:\Test скрипт MorningSync.sql, который добавит данные из центральной БД в базы данных медсёстр. В папке D:\Test создайте полную резервную копию БД медсестры и вставьте недостающие записи.

    2. Запустите SQL Server Management Studio
    3. В Object Explorer раскройте SQL Server Agent и правой кнопкой мыши по Jobs создайте новое задание (New job).

    4. Укажите имя задания.

    5. На вкладке Steps нажмите New, чтобы создать новый шаг задания.
    6. Дайте имя новому шагу, в качестве типа укажите “Operating system (CmdExec)” и нажите кнопку открыть (Open).
    7. Select the saved batch file D:\Test\MorningSync.bat

      SQL Server job steps

    8. Нажмите кнопку OK.
    9. На вкладке Schedules укажите расписание, по которому должна происходить синхронизация данных.

      Scheduling a SQL Server job

Для вечерней синхронизации повторите шаги с 3 по 9, чтобы создать ещё одно задание.

С помощью приложения ApexSQL Data Diff вы можете легко настроить синхронизацию ваших удалённых БД SQL Server с центральным хранилищем. При этом вы не привязаны к какой-то конкретной версии или редакции SQL Server, от вас не потребуется дополнительного времени на разработку, при этом вы осуществляете полный контроль над всеми вашими данными до единой записи.

Переводчик: Алексей Князев

November 20, 2015