Microsoft Sql Server Migration Assistant - средство миграции данных с MySQL на Sql Server
10 апреля 2010 г.
Иногда возникают такие ситуации, когда проект, работающий на MySQL, разрастается настолько, что возникает необходимость перехода на более серьезные сервера баз данных. Ранее разработчики в таких ситуациях писали утилиты по переносу данных самостоятельно. При этом возникали различные проблемы - нужно было находить ближайшие соответствия типов данных, ключей, индексов и т.п.
Microsoft выпустила утилиту, которая позволяет практически полностью автоматизировать перенос данных с MySQL на SQL Server. Поддерживаются SQL Server 2005, 2008 и SQL Azure.
Программа автоматически конвертирует типы данных в ближайшие совместимые, а также переносит ключи и индексы.
Рассмотрим ее работу на примере реального веб-приложения - форума PhpBB 3.
Исходные данные
Имеется форум PhpBB 3, который настроен на IIS7 и работает с MySql 5.1:
В конфигурационном файле видно, что работа осуществляется с базой данных forum2 (параметр $dbname):
Зайдя через MySql Query Brower в структуру базы данных forum2, можно увидеть список таблиц:
Подготовка к переносу
Предположим, что мы хотим перенести базу данных форума на SQL Server 2008 Express. Создадим логическую базу данных forum, а так же учетную запись forum, под которой движок форума будет подключаться к БД:
Кроме того, для корректной работы с данными в кодировке UTF в SQL Server, необходимо использовать библиотеку FreeTDS вместо стандартной php_mssql.dll. Информацию о ее настройке можно найти
Перенос структуры базы данных
Загружаем с сайта Microsoft саму утилиту (версия для SQL Server 2008, версия для SQL Server 2005). Утилита бесплатна, но для ее активации нужно получить лицензионный код - сделать это можно через учетную запись Live ID.
Запускаем программу:
Слева от основной рабочей области видно два окна: просмотр метаданных у MySQL-сервера и у SQL Server. С ними мы будем активно работать. Сверху над ними находятся кнопки подключения к серверам баз данных.
Для начала создаем новый проект:
Затем подключаемся к MySQL:
Далее подключаемся к SQL Server:
После подключения заполняются окна с метаданными обоих серверов:
Можно видеть базу данных forum2 в MySQL, которую мы будем переносить, и базу данных forum в SQL Server, в которую будут записаны данные. Отмечаем галочкой базу данных, которую хотим перенести:
В основной рабочей области показывается главная вкладка: Schema Mapping. В ней показан план переноса - откуда и куда он будет выполнен. Стоит отметить одну особенность: при работе с программой считается, что в понятие "схема" применительно к MySql входит название базы данных, а применительно к SQL Server - название базы данных и конкретная схема в ней (по умолчанию используется схема dbo).
Изначально утилита предлагает перенос в базу данных с таким же именем, как и исходная (forum2). Но, поскольку перенос будет осуществляться в базу данных с именем forum, а не forum2, нажимаем кнопку Modify и корректируем схему назначения:
Кроме того, перейдя на вкладку Type Mapping можно посмотреть (и скорректировать) соответствие типов данных при переносе:
После этого можно приступать к конвертации. Кликнув правой кнопкой на объекте переноса (базе данных forum2), выбираем Convert Schema:
Программа приступает к конвертации:
После завершения операции выводится отчет в стандартном стиле сред разработки:
На данный момент сами таблицы физически еще не созданы - подготовлен лишь скрипт, который их создаст. Кликнув правой кнопкой по объекту переноса и выбрав Create Report, можно получить небольшой отчет:
Кроме того, можно сохранить и SQL-скрипт создания таблиц, выбрав пункт Save as Script все по тому же правому клику на переносимом объекте. Результат сохраняется в виде SQL-файла:
Как было сказано ранее, Convert Schema физически не проводит операцию создания таблиц в базе назначения. Чтобы выполнить физическое создание, кликнем по конечной базе данных правой кнопкой мыши и выберем Synchronize with Database. Эта операция выполнит сравнение структуры таблиц, находящихся в базе данных со структурой, созданной нами при конвертации, и создаст недостающие объекты.
Кликнув на указанный пункт меню, получаем следующее диалоговое окно:
Синяя стрелка здесь обозначает, что будет выполнена операция отображения локальной структуры (то, что мы получили в результате конвертации) на базу данных назначения. Возможны и другие варианты - например, в случае, если часть таблиц уже существует. Расшифровку всех операций синхронизации можно получить, кликнув на кнопку с красно-зелено-синей полоской.
Нажав ОК, запускаем процесс создания таблиц:
Открыв базу данных forum в SQL Management Studio, убедимся, что таблицы появились:
Перенос данных
После того, как структура таблиц была перенесена, можно выполнить и перенос данных в таблицах.
Для этого выбираем исходный объект (в нашем случае - базу данных), кликаем по нему правой кнопкой и используем пункт Migrate Data:
Для выполнения этой операции утилита должна заново выполнить подключение к базам данных. Соответствующие диалоги выводятся автоматически. Подключаемся к MySQL:
Подключаемся к SQL Server:
После этого утилита выполнит процедуру переноса данных автоматически. По завершению выводится отчет:
Используя SQL Management Studio, убедимся в том, что данные перенеслись:
Перевод форума на использование SQL Server Express
После того, как мы перенесли все таблицы и данные, осталось только внести правки в форум. Поскольку в нашем случае используется PhpBB 3, умеющий работать с SQL Server-ом, достаточно лишь поменять соответствующие строчки в конфигурационном файле:
К сожалению, во многих других случаях придется вносить изменения в программный код. Так, например, для ограничения числа возвращенных записей в MySQL используется оператор LIMIT, а в SQL Server - TOP. Попытка выполнения запроса вида SELECT * FROM MyTable LIMIT 10, 40 в SQL Server вызовет ошибку.
После изменения конфигурационного файла проверим работоспособность форума:
Как видно, все данные полностью сохранились и корректно отображаются. На этом процесс переноса данных завершен.
Комментарии
Алексей Беляев (06/04/2011 15:27)
С какова числа статья, !
Хорошо б указывать
Nevlabs.ru - Александр (06/04/2011 15:39)
Статья от 10 апреля 2010 г.
Спасибо за подсказку, на будущее учтем.
Алексей (06/04/2011 21:18)
У тебя немного инфы нехватает у меня зацени http://bai.int.ru/perevod-mysql-na-sql/ ...
Щас буду пробовать переезд..
Nevlabs.ru - Александр (06/04/2011 23:23)
Когда писалась статья, этот инструмент был только в CTP версии. Потом да, добавили функционала, а статью я с тех пор так и не обновил. Хотя с докладом выступал с описанием расширенной версии :)
Игорь (19/09/2019 14:15)
Здравствуйте.
Подскажите, пожалуйста, а данные будут самостоятельно обновляться?