Импортировать базу данных MySQL в MS SQL Server

92

У меня есть файл .sql из дампа MySQL, содержащий таблицы, определения и данные, которые нужно вставить в эти таблицы. Как я могу преобразовать эту базу данных, представленную в файле дампа, в базу данных MS SQL Server?

марионетка
источник
1
У вас также есть доступ к исходной базе данных? Или файл экспорта - это все, что у вас есть?
Whakkee
У меня тоже есть доступ к исходной БД. Я просто подумал, что использовать дамп будет проще
marionmaiden

Ответы:

62

Используйте помощник по миграции SQL Server (SSMA)

Помимо MySQL он поддерживает Oracle, Sybase и MS Access.

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

Это текущая ссылка для загрузки версии MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

Текущая (июнь 2016 г.) стабильная версия 6.0.1 дает сбой при передаче данных с текущим (5.3.6) драйвером MySQL ODBC. Все 64 бит. Версия 5.3 с драйвером ODBC 5.1.13 работает нормально.

Зар Шардан
источник
9
Этот инструмент работает только в том случае, если вы можете установить коннектор ODBC со своего ПК на базу данных MySQL. Если у вас есть только файл дампа .sql, вы не можете использовать SSMA.
Джейк Мансон
10
Движок MySQL - это бесплатное программное обеспечение, также есть версия для Windows. Его установка и загрузка дампа - тривиальная работа. Если вы надеетесь найти инструмент (даже коммерческий, не говоря уже о бесплатном), который надежно конвертирует произвольный сценарий MySQL в его эквивалент SQL Server - что ж, удачи в этом.
Зар Шардан
1
Хорошая точка зрения. И это то, чем я закончил вчера. За исключением написания вашей собственной утилиты преобразования, установка MySQL кажется лучшим вариантом. SSMA было неудобно использовать, но в конце концов я заставил его работать.
Джейк Мансон,
2
SSMA - отличный вариант, это должен быть принятый ответ. Мне было совсем не сложно использовать.
DonBecker
2
Для этого требуется агент SQL Server, который не поставляется с SQL Server Express.
Винисиус Роча
18

Я предлагаю вам использовать mysqldump вот так:

mysqldump --compatible=mssql

phpMyAdmin по-прежнему является веб-приложением и потенциально может иметь некоторые ограничения для больших баз данных (время выполнения скрипта, выделяемая память и т. д.).

Деклин
источник
6
Увы, это вызывает у меня всевозможные проблемы с совместимостью. Скрипт будет содержать обратные кавычки вокруг имен столбцов, типов данных, которые не существуют в MSSQL, будут нарушать ограничение max-1000-insert, ключевые слова auto_increment и т. Д. И т. Д. Этот ответ является логическим предложением, но я боюсь, что это не так. не работает слишком хорошо (по крайней мере: не для меня).
Jeroen
mysqldump --compatible = ansi «Производить вывод, который более совместим с другими системами баз данных или со старыми серверами MySQL. Единственное допустимое значение для этой опции - ansi, которое имеет то же значение, что и соответствующая опция для установки режима SQL сервера».
Томас Тейлор
14

Я нашел способ для этого в сети

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

Вот ссылка

http://www.codeproject.com/KB/database/migrate-mysql-to-mssql.aspx

марионетка
источник
1
Это когда и Mysql, и SQL находятся на одном компьютере или связаны через сеть. Это бесполезно, когда существуют две разные машины и у вас есть файл дампа из mysql. верно?
Espanta
7

Если вы выполняете экспорт с помощью PhpMyAdmin , вы можете переключить режим совместимости sql на «MSSQL». Таким образом, вы просто запускаете экспортированный сценарий для своей базы данных MS SQL, и все готово.

Если вы не можете или не хотите использовать PhpMyAdmin, в mysqldump также есть опция совместимости , но лично я бы предпочел, чтобы PhpMyAdmin сделал это за меня.

Whakkee
источник
1
Этот ответ сработал для меня с минимальными изменениями в сгенерированном скрипте. Перенес в SQL Server 2012. Режим совместимости раньше не видел.
Киль
7

Вот мой подход к импорту файлов .sql в MS SQL:

  1. Экспорт таблицы из MySQL с --compatible=mssqlи --extended-insert=FALSEопций:

    mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql

  2. Разделите экспортированный файл с помощью PowerShell на 300000 строк на файл:

    $i=0; Get-Content exported.sql -ReadCount 300000 | %{$i++; $_ | Out-File out_$i.sql}

  3. Запустите каждый файл в MS SQL Server Management Studio

Есть несколько советов, как ускорить вставку .

Другой подход - использовать –whereопцию mysqldump . Используя эту опцию, вы можете разделить свою таблицу по любому условию, которое поддерживается предложением wheresql.

Владислав
источник
как мы можем экспортировать всю базу данных вместо таблицы за таблицей
MonsterMMORPG
--databases [db_name]ключевое слово try, как это объясняется в этом ответе: stackoverflow.com/a/26096339/155687
Владислав,
4

Сегодня у меня была очень похожая проблема - мне нужно было скопировать большую таблицу (5 миллионов строк) из MySql в MS SQL.

Вот шаги, которые я сделал (в Ubuntu Linux):

  1. Создал таблицу в MS SQL, структура которой соответствует исходной таблице в MySql.

  2. Установленная командная строка MS SQL: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Выгруженная таблица из MySql в файл:

mysqldump \
    --компактный \
    --complete-insert \
    --no-create-info \
    --compatible = mssql \
    --extended-insert = ЛОЖЬ \
    --host "$ MYSQL_HOST" \
    --user "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. В моем случае файл дампа был довольно большим, поэтому я решил разбить его на несколько маленьких частей (по 1000 строк каждая) - split --lines=1000 "$FILENAME" part-

  2. Наконец, я перебрал эти небольшие файлы, произвел некоторые замены текста и выполнил части один за другим на сервере MS SQL:

экспорт SQLCMD = / opt / mssql-tools / bin / sqlcmd

х = 0

для файла частично - *
делать
  echo "Экспорт файла [$ file] в MS SQL. Обработано x тысяч долларов"

  # заменяет \ 'на' '
  sed -i "s / \\\ '/' '/ g" "$ file"

  # удаляет все "
  sed -i 's / "// g'" $ файл "

  # позволяет вставлять записи с указанным PK (id)
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ file"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ file"
  эхо ""
  эхо ""

  х = $ ((х + 1))
сделанный

эхо "Готово"

Конечно, вам нужно заменить мои переменные, например $AZURE_SERVER, $TABLEи т. Д., На ваши.

Надеюсь, это поможет.

Владимир Коробков
источник
3

Для меня лучше всего было экспортировать все данные с помощью этой команды:

mysqldump -u USERNAME -p --all-databases --complete-insert --extended-insert=FALSE --compatible=mssql > backup.sql

--extended-insert = FALSE необходимо, чтобы избежать ограничения импорта mssql 1000 строк.

Я создал свои таблицы с помощью инструмента миграции, поэтому не уверен, что CREATE из файла backup.sql будет работать.

В SSMS MSSQL мне пришлось импортировать таблицу данных по таблице с IDENTITY_INSERT ON, чтобы записать поля идентификатора:

SET IDENTITY_INSERT dbo.app_warehouse ON;
GO 
INSERT INTO "app_warehouse" ("id", "Name", "Standort", "Laenge", "Breite", "Notiz") VALUES (1,'01','Bremen',250,120,'');
SET IDENTITY_INSERT dbo.app_warehouse OFF;
GO 

Если у вас есть отношения, вы должны сначала импортировать дочерний элемент, а затем таблицу с внешним ключом.

Пингвин Пингвин
источник
0

Бегать:

mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql

Вы хотите увидеть панель процесса?

pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
Франческо Мантовани
источник
0

вы можете использовать приложение sqlie для преобразования из mysql в sqlserver, вы можете посмотреть это видео https://www.youtube.com/watch?v=iTVEqys_vTQ&t=108s

Горджино
источник
1
Добро пожаловать в Stackoverflow @gorgino! Если вы публикуете ссылку, также опубликуйте краткое изложение содержания на случай, если в будущем ссылка не будет работать. Ссылки в основном следует использовать для расширения вашего ответа, а не для вашего ответа.
Криббер,