Синхронизация БД SQL Server из различных источников. Сравнение баз данных в phpMyAdmin. Генерация XML-файла со структурой БД

При использовании ПК Интеллект в системах с распределенной архитектурой необходимо синхронизировать базы данных Серверов и УРМА. Синхронизация баз данных позволяет хранить данные как централизованно (на одном Сервере или УРМА), так и распределенно (репликация данных из баз различных Серверов и УРМА системы видеонаблюдения). Синхронизация баз данных обеспечивает параллельную работу с базами данных Серверов и УРМА и автоматическое обновление при их изменении.

По умолчанию базы данных ПК Интеллект на Серверах и УРМА не синхронизированы между собой. Как правило, ПК Интеллект настраивается таким образом, что синхронизация всех баз данных осуществляется только с одной централизованной базой данных, размещенной на Сервере администрирования.

Примечание.

В том случае, если одна или несколько баз данных хранятся в формате MS Access, необходимо перед настройкой синхронизации конвертировать базы в формат MS SQL server.

Для настройки синхронизации базы данных Конфигурация программного комплекса Интеллект с базой данных сервера администрирования (или другой базой данных), необходимо выполнить следующие действия:

  1. Проверить, работает ли ПО MS SQL Server.
  2. Запустить утилиту idb.exe, расположенную в корне директории установки ПК Интеллект (например, C:\Program Files (х86) \Интеллект). На экран будет выведено диалоговое окно утилиты idb.exe.
  3. Из списка Выберите источник данных: выбрать пункт Synchro source .
  4. Установить флажок Использовать.
  5. Нажать кнопку Настроить.
  6. На экран будет выведено диалоговое окно Свойства связи с данными . В окне Свойства связи с данными необходимо перейти на вкладку Поставщик данных .
  7. Из списка Поставщики OLE DB необходимо выбрать пункт Microsoft OLE DB Provider for SQL Server .
  8. Нажать кнопку Далее.
  9. После нажатия кнопки Далее будет выполнен автоматически переход на вкладку Подключение .
  10. В строке 1. Выберите или введите имя сервера: данного окна необходимо выбрать из списка или ввести вручную наименование MS SQL сервера, на котором хранится база данных, с которой требуется синхронизировать текущую.
  11. В группе 2. Для входа в сервер использовать: необходимо указать тип и указать параметры аутентификации для подключения к MS SQL серверу. Аутентификация на MS SQL сервере осуществляется по учетной записи пользователя, авторизированного в ОС Windows, или по имени пользователя (логину) и паролю, которыми защищено подключение к MS SQL серверу.
    Метод и параметры, используемые для аутентификации на MS SQL сервере, задаются при установке MS SQL сервера.
    В зависимости от метода аутентификации, который требуется использовать для подключения к MS SQL серверу, необходимо указать следующие параметры:
    1. В том случае, если аутентификация на MS SQL сервере осуществляется по учетной записи пользователя в ОС Windows, необходимо установить переключатель в положение учетные сведения Windows NT . При этом необходимо, чтобы в ОС Windows на компьютере, на котором установлен MS SQL сервер и хранится база данных, с которой требуется настроить синхронизацию, была зарегистрирована учетная запись, под которой в текущий момент авторизирован пользователь в ОС Windows на компьютере, с которого выполняется настройка синхронизации.
    2. В том случае, если аутентификация на MS SQL сервере осуществляется по имени пользователя (логину) и паролю необходимо выполнить следующие действия:
      1. Установить переключатель в положение следующие имя и пароль пользователя: .
      2. В поле Пользователь: ввести имя пользователя (логин) для подключения к MS SQL серверу.
      3. В том случае, если доступ к MS SQL серверу защищен паролем, необходимо снять флажок Пустой пароль и в поле Пароль ввести пароль для доступа к базе данных.
  12. Нажать кнопку Проверить подключение .
  13. При успешном подключении к MS SQL серверу на экран будет выведено окно с сообщением Проверка подключения выполнена .

    Необходимо нажать кнопку ОК в окне сообщения, в результате чего окно автоматически будет закрыто.
  14. В том случае, если наименование MS SQL сервера и/или параметры аутентификации, используемые для подключения к MS SQL серверу, были указаны неправильно, на экран будет выведено соответствующее сообщение.

    Для закрытия окна с сообщением необходимо нажать кнопку ОК . Далее требуется изменить введенные данные и повторно проверить подключение к MS SQL серверу.
  15. Из списка Выберите базу данных на сервере выбрать название базы данных, с которой требуется синхронизировать текущую.
  16. Нажать кнопку ОК в диалоговом окне Свойства связи с данными. В результате выполнения данного действия окно будет закрыто.
  17. Нажать кнопку ОК , расположенную в нижнем правом углу окна утилиты idb.exe.

На этом настройка синхронизации баз данных завершена.

Синхронизация баз данных MySQL позволяет создать и автоматически поддерживать две или более базы данных с идентичным содержимым. Синхронизациия нужна для создания зеркал, кластеров и т.д. Программа Handy Backup позволяет полностью автоматизировать процесс синхронизации БД MySQL.

Методы синхронизации MySQL баз

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

Односторонняя синхронизация

Содержимое одной базы (master) копируется в другую (slave). В MySQL синхронизация БД на разных серверах используется для репликации таблиц, создания тестовых и резервных баз, бэкапа MySQL и т.д.

Двусторонняя синхронизация

Двусторонняя синхронизация MySQL обеспечивает копирование актуальных изменений из каждой базы данных в другую. Эта техника применяется прежде всего для распределения вычислительных задач, связанных с базами данных – создания кластеров и зеркал БД.

Преимущества Handy Backup для синхронизации БД MySQL

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

  • Синхронизация данных MySQL (копирование и восстановление) по расписанию;
  • Хранение таблиц MySQL в удобочитаемом текстовом формате из списка SQL команд;
  • Автоматический останов сервера-приёмника MySQL при восстановлении данных;
  • Версионное копирование и создание временных меток на копиях по необходимости;
  • Получение доступа к внешним MySQL серверам.

Как выполнить синхронизацию MySQL с помощью Handy Backup?

Синхронизация баз данных MySQL состоит из создания резервной копии базы и последующего восстановления таблиц этой базы на другом сервере с помощью плагина "MySQL". Этот процесс включает в себя 2 последовательных задачи:

Резервное копирование данных исходной таблицы (в случае односторонней синхронизации) или обеих таблиц (при симметричной синхронизации).

Восстановление данных в синхронизируемую таблицу MySQL, полное или дифференциальное, в зависимости от типа синхронизации.

Детальное описание задач копирования и восстановления MySQL имеется в Руководстве Пользователя.

Автоматизация задач синхронизации таблиц MySQL

Чтобы сделать процесс синхронизации баз данных MySQL полностью автоматическим, обратите, пожалуйста, внимание на следующие пункты:

  1. Разделите время запуска задач резервного копирования MySQL и их восстановления на достаточно большой промежуток, чтобы запущенная задача резервного копирования базы данных успела завершиться перед началом восстановления.
  2. Выбирайте для промежуточных копий MySQL достаточно быстрые по скорости доступа носители: локальные и внешние диски, устройства NAS/SAN и серверы FTP/SFTP/FTPS с широкой пропускной способностью сетевого интерфейса.
  3. Пользуйтесь возможностями Шага 7 (установка запуска программ до и/или после выполнения задачи) для автоматического останова и перезапуска сервера MySQL на стороне восстановления, а также на стороне записи – для "холодной" загрузки данных.

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

Приобретение лицензии

Как было сказано выше, синхронизация баз данных (БД) MySQL не заменяет регулярного резервного копирования. Мы рекомендуем обеспечивать задачи резервного копирования БД MySQL с помощью одного из бизнес-ориентированных решений нашего программного обеспечения (ПО).

  • Если вам нужно работать только с одним сервером СУБД MySQL, Handy Backup Office Expert обеспечит вас всеми необходимыми возможностями для этого и многими дополнительными функциями.
  • Если вам необходимо обслуживать несколько серверов и рабочих станций, организуя процессы резервного копирования БД MySQL и любых других данных с общего рабочего места, используйте наше флагманское решение Handy Backup Server Network .

Чтобы сравнить цены на эти и другие продукты, пожалуйста, обратитесь к странице Купить .

Видеоурок

В следующем видеоуроке показано, как осуществлять резервное копирование и восстановление БД MySQL с помощью Windows-версии Handy Backup. В настоящий момент видео доступно только на английском языке.

Скачайте и установите наше программное обеспечение прямо сейчас – первая резервная копия ваших данных будет готова уже через пару минут!

Handy Backup предоставляет надёжный, быстрый и гибко настраиваемый инструмент для синхронизации MySQL на уровне таблиц и баз данных. Попробуйте прямо сейчас, скачав бесплатно полную версию программы на 30 дней!

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

1. PHP SQLDIFF, a.k.a. SQLDiff

PHP-скрипт, позволяющий увидеть полные различия (как в структуре, так и в данных) между любыми таблицами двух БД. В инструменте отсутствуют какие-либо средства по автоматической синхронизации структуры или данных – предоставляется лишь визуальная информация. Еще из существенных недостатков – возможность подключения только к БД, к которым возможен доступ напрямую (не через ssh-тоннель). Медленная скорость работы на больших объемах данных (работа через pear-модуль, который не блещет ни новизной, ни скоростью). Считаю данный скрипт весьма полезным для разработчика в случаях, когда необходимо понимание и визуальное представление различий между разными таблицами - имеет удобный интерфейс, быстрая настройка. Охарактеризую скорее как полезную карманную утилиту для быстрого получения понимания о рассинхронизации таблиц, которые в теории должны быть идентичны, нежели как серьезный инструмент, который можно применить для автоматизации процессов синхронизации.

2. LIQUIBASE

Удобный многофункциональный и простой в использовании мигратор структуры БД на java. Вижу для себя в этом плюс, если использовать в связке с Jenkins.
Пример (host1 - сервер, с которого необходимо копировать структуру БД; host2 - сервер, на который необходимо перенести структуру с host1):

Java -jar liquibase.jar --driver=com.mysql.jdbc.Driver --classpath=mysql-connector-java-5.1.xx-bin.jar --logFile=db.ExampleChangelog.xml --url="jdbc:mysql://host2" --defaultSchemaName=db_name --username=username --password="password" --referenceUrl=jdbc:mysql://host1 --referenceUsername=username --referencePassword="password" diffChangeLog > ChangeSet.xml

Формирует changeset в формате xml, дальнейшая миграция которого приводит структуру бд на host2 в состояние, идентичное host1.

Запуск миграции:

Java -jar liquibase.jar --driver=com.mysql.jdbc.Driver --classpath=/path/to/classes --changeLogFile=ChangeSet.xml --url="jdbc:mysql://host2" --username=user --password="password" migrate

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

Changeset также можно формировать и в других форматах - в sql, в json (не только в xml). Формирование changeset"а в sql будет полезным в тех случаях, когда для миграции используются средства другой утилиты.

3. schemasync

Инструмент для синхронизации структуры БД. Для работы необходим python и соответствующий интерфейс для mysql.
Из существенных различий с liquibase:
- schemasync создает не только ченжсет, но и файл, позволяющий откатить изменения (самое важное и самое ценное преимущество, хотя, на мой взгляд, не избавляет от необходимости делать backup перед синхронизацией)
- liquibase позволяет не только получить ченжсет, но и сразу же запустить миграцию средствами самой утилиты. Может быть, не киллер-фича, но все равно удобно и полезно

schemasync работает только с sql – никаких промежуточных xml и аналогов – вижу для себя в этом как преимущества, так и недостатки.
Очень лаконичный синтаксис, минимум настроек. Позволяет не синхронизировать комментарии и автоинкремент (настраивается) - безусловный плюс.

Пример использования:

Schemasync mysql://user:pass@dev-host:3306/dev_db mysql://user:pass@prod-host:3306/production_db

Каждый, кто когда-либо разрабатывал приложения, использующие базу данных, наверняка сталкивался с проблемой обновления структуры БД при разворачивании и обновлении приложения.

Чаще всего используется простой подход - создание набора SQL-скриптов для модификации структуры БД от версии к версии. Конечно, есть такой мощный инструмент, как Red gate , но он во-первых небесплатный, во-вторых не решает проблему полной автоматизации обновления.


Технология migrations, впервые появившаяся в ОРМ Hibernate и реализованная в Linq, очень хороша и удобна, но подразумевает стратегию разработки структуры БД code first, что весьма трудоемко для уже существующих проектов, а использование в БД триггеров, хранимых процедур и функций делает задачу перехода на code first практически невыполнимой.


В данной статье предлагается альтернативный подход к решению этой задачи, использующий хранение эталонной структуры БД в XML-файле и автоматическую генерацию SQL-скрипта на основе сравнения эталонной и существующей структуры. Итак, начнем...

Генерация XML-файла со структурой БД

Для экспериментов будем использовать БД DbSyncSample. Скрипт для создания БД приведен ниже.


USE GO /****** Object: Table . Script Date: 06/01/2017 10:37:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE .( IDENTITY(1,1) NOT NULL, (50) NULL, NULL, (18, 2) NOT NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO CREATE NONCLUSTERED INDEX ON . ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON GO /****** Object: Table . Script Date: 06/01/2017 10:37:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE .( IDENTITY(1,1) NOT NULL, (150) NULL, NULL, (18, 2) NOT NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO /****** Object: Trigger Script Date: 06/01/2017 10:37:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER . ON . AFTER INSERT,UPDATE AS BEGIN UPDATE Orders SET TotalCost = s.Total FROM (SELECT i.OrderId OId, SUM(d.Cost) Total FROM Details d JOIN inserted i ON d.OrderId=i.OrderId GROUP BY i.OrderId) s WHERE Id=s.OId END GO /****** Object: Trigger Script Date: 06/01/2017 10:37:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER . ON . AFTER DELETE AS BEGIN UPDATE Orders SET TotalCost = s.Total FROM (SELECT i.OrderId OId, SUM(d.Cost) Total FROM Details d JOIN deleted i ON d.OrderId=i.OrderId GROUP BY i.OrderId) s WHERE Id=s.OId END GO /****** Object: Default Script Date: 06/01/2017 10:37:43 ******/ ALTER TABLE . ADD CONSTRAINT DEFAULT ((0)) FOR GO /****** Object: Default Script Date: 06/01/2017 10:37:43 ******/ ALTER TABLE . ADD CONSTRAINT DEFAULT ((0)) FOR GO /****** Object: ForeignKey Script Date: 06/01/2017 10:37:43 ******/ ALTER TABLE . WITH CHECK ADD CONSTRAINT FOREIGN KEY() REFERENCES . () GO ALTER TABLE . CHECK CONSTRAINT GO

Для экспериментов создаем консольное приложение. Подключаем к нему nuget-пакет Shed.DbSync .


Структуру БД в виде XML получаем следующим образом:


class Program { private const string OrigConnString = "data source=.;initial catalog=FiocoKb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"; static void Main(string args) { // получаем XML со структурой БД var db = new Shed.DbSync.DataBase(OrigConnString); var xml = db.GetXml(); File.WriteAllText("DbStructure.xml", xml); } }

После запуска программы в файле DbStructure.xml видим следующее:


0 1 int 4 false true false 2 nvarchar 100 true false false 3 datetime 8 true false false 4 decimal 9 false false false 1 CLUSTERED true true false 1 1 false 2 NONCLUSTERED false false false 2 1 false 1 4 ((0))
1 int 4 false true false 2 nvarchar 300 true false false 3 int 4 true false false 4 decimal 9 false false false 1 CLUSTERED true true false 1 1 false 1 2137058649 1 3 1 NO_ACTION NO_ACTION 4 ((0))
CREATE TRIGGER . ON dbo.Details AFTER INSERT,UPDATE AS BEGIN UPDATE Orders SET TotalCost = s.Total FROM (SELECT i.OrderId OId, SUM(d.Cost) Total FROM Details d JOIN inserted i ON d.OrderId=i.OrderId GROUP BY i.OrderId) s WHERE Id=s.OId END SQL_TRIGGER CREATE TRIGGER . ON dbo.Details AFTER DELETE AS BEGIN UPDATE Orders SET TotalCost = s.Total FROM (SELECT i.OrderId OId, SUM(d.Cost) Total FROM Details d JOIN deleted i ON d.OrderId=i.OrderId GROUP BY i.OrderId) s WHERE Id=s.OId END SQL_TRIGGER

Разворачивание/обновление структуры БД при помощи полученного XML.

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


class Program { private const string OrigConnString = "data source=.;initial catalog=DbSyncSample;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"; private const string TargetConnString = "data source=.;initial catalog=DbSyncSampleCopy;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"; static void Main(string args) { // получаем XML со структурой эталонной БД var dborig = new Shed.DbSync.DataBase(OrigConnString); var xml = dborig.GetXml(); File.WriteAllText("DbStructure.xml", xml); // если нужно предварительно очистить структуру целевой БД, используем // Shed.DbSync.DataBase.ClearDb(TargetConnString); // обновляем структуру целевой БД var dbcopy = Shed.DbSync.DataBase.CreateFromXml(xml); dbcopy.UpdateDb(TargetConnString); // на самом деле можно обойтись одной строкой: // dborig.UpdateDb(TargetConnString); // dbcopy создаем только для демонстрации создания объекта базы из XML } }

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


В сценариях тестирования может понадобиться создание тестовой БД каждый раз с нуля. В этом случае будет полезно использовать функцию Shed.DbSync.DataBase.ClearDb(string connString)

Автоматическое слежение за структурой БД.

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


static void SyncDb() { // автоматическое слежение за структурой БД Shed.DbSync.DataBase.Syncronize(OrigConnString, @"Struct\DbStructure.xml", // путь к файлу структуры @"Struct\Logs", // путь к папке логов синхронизации @"Struct\update_script.sql" // (необяз.) в случае определения этого параметра // в него будет записан скрипт, сгенерированный // для обновления БД); }

Слежение производится при помощи параметра (тега) Version в XML. Сценарий использования процедуры такой:

  1. Назначить версию БД. В Microsoft SqlServer Management Studio на узле нужной базы данных правой кнопкой выбрать Properties.
  2. Далее Extended Properties и в таблице свойств добавить свойство Version со значением 1. При каждой последующей модификации структуры это свойство следует наращивать на 1.
  3. При запуске приложения, если XML-файла нет или его версия меньше, чем у БД, он создается.
  4. Если версия XML-файла больше, чем у БД, генерируется скрипт на обновление БД и исполняется.
  5. Если в процессе исполнения скрипта возникли ошибки, все изменения откатываются.
  6. Результаты синхронизации пишутся в log-файл, создаваемый в папке, указанной параметром logDitPath.
  7. Если указан параметр SqlScriptPath, создается файл со скриптом из п.4.

Эксперименты оставляю читателям. Успехов вам!

Теги:

  • ms sql
  • синхронизация баз данных
  • database
  • syncronize
  • dbsync
  • sql
  • shed
  • shed.dbsync
Добавить метки

Понравилась статья? Поделиться с друзьями: