Importar banco de dados MySQL para um servidor MS SQL

89

Eu tenho um arquivo .sql de um despejo do MySQL contendo tabelas, definições e dados a serem inseridos nessas tabelas. Como posso converter este banco de dados representado no arquivo de despejo em um banco de dados MS SQL Server?

marionmaiden
fonte
1
Você também tem acesso ao banco de dados original? Ou o arquivo de exportação é basicamente tudo o que você tem?
Whakkee
Também tenho acesso ao DB original. Eu apenas pensei que usar o despejo seria mais fácil
marionmaiden

Respostas:

62

Use o SQL Server Migration Assistant (SSMA)

Além do MySQL, ele oferece suporte a Oracle, Sybase e MS Access.

Parece ser bastante inteligente e capaz de lidar até com transferências não triviais. Ele também tem alguma interface de linha de comando (além da GUI), portanto, teoricamente, pode ser integrado a algum processo de carregamento em lote.

Este é o link de download atual para a versão MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

A versão estável 6.0.1 atual (junho de 2016) falha com o driver ODBC MySQL atual (5.3.6) durante a transferência de dados. Tudo de 64 bits. A versão 5.3 com o driver ODBC 5.1.13 funciona bem.

Zar Shardan
fonte
9
Esta ferramenta só funciona se você puder instalar um conector ODBC de seu PC para o banco de dados MySQL. Se você tiver apenas um arquivo de despejo .sql, não poderá usar o SSMA.
Jake Munson
10
O motor MySQL é um software livre e também existe uma versão para Windows. Instalá-lo e carregar o dump é uma tarefa trivial. Se você espera encontrar uma ferramenta (mesmo uma comercial, quanto mais gratuita) que irá converter de forma confiável um script MySQL arbitrário em seu equivalente do SQL Server - bem, boa sorte com isso.
Zar Shardan
1
Bom ponto. E foi isso que acabei fazendo ontem. Além de escrever seu próprio utilitário de conversão personalizado, instalar o MySQL parece ser a melhor opção. SSMA era um pé no saco de usar, mas eventualmente consegui fazer funcionar.
Jake Munson
2
SSMA é uma ótima opção, essa deve ser a resposta aceita. Não achei nada difícil de usar.
DonBecker
2
Ele requer o SQL Server Agent que não vem com o SQL Server Express.
Vinicius Rocha
18

Eu sugiro que você use o mysqldump assim:

mysqldump --compatible=mssql

phpMyAdmin ainda é um aplicativo da web e pode ter algumas limitações para bancos de dados grandes (tempo de execução de script, memória alocável e assim por diante).

Deklin
fonte
6
Infelizmente, isso me causa todos os tipos de problemas de compatibilidade. O script conterá crases em torno dos nomes das colunas, tipos de dados que não existem no MSSQL, violarão a restrição max-1000-inserts, palavras-chave auto_increment, etc. etc. Esta resposta é uma sugestão lógica, mas infelizmente não não funciona muito bem (pelo menos: não funcionou para mim).
Jeroen
mysqldump --compatible = ansi "Produz uma saída que é mais compatível com outros sistemas de banco de dados ou com servidores MySQL mais antigos. O único valor permitido para esta opção é ansi, que tem o mesmo significado da opção correspondente para configurar o modo SQL do servidor."
Thomas Taylor
14

Eu encontrei um jeito para isso na net

Exige um pouco de trabalho, porque tem que ser feito mesa a mesa. Mas de qualquer maneira, eu poderia copiar as tabelas, dados e restrições em um banco de dados MS SQL.

Aqui está o link

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

marionmaiden
fonte
1
É quando o Mysql e o SQL estão em uma máquina ou conectados por uma rede. Isso não é útil quando existem duas máquinas diferentes e você tem um arquivo Dump do mysql. certo?
Espanta
7

Se você fizer uma exportação com PhpMyAdmin , poderá alternar o modo de compatibilidade sql para 'MSSQL'. Dessa forma, você apenas executa o script exportado em seu banco de dados MS SQL e pronto.

Se você não pode ou não deseja usar o PhpMyAdmin, há também uma opção de compatibilidade no mysqldump , mas pessoalmente prefiro que o PhpMyAdmin faça isso por mim.

Whakkee
fonte
1
Essa resposta funcionou para mim, com modificações mínimas no script gerado. Trouxe para o SQL Server 2012. Não vi o modo de compatibilidade antes.
Kiel
7

Aqui está minha abordagem para importar arquivos .sql para MS SQL:

  1. Exportar tabela do MySQL com opções --compatible=mssqle --extended-insert=FALSE:

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

  2. Divida o arquivo exportado com PowerShell por 300.000 linhas por arquivo:

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

  3. Execute cada arquivo no MS SQL Server Management Studio

Existem algumas dicas para acelerar as inserções .

Outra abordagem é usar a –whereopção mysqldump . Usando esta opção, você pode dividir sua tabela em qualquer condição que seja suportada pela wherecláusula sql.

Vladislav
fonte
como podemos exportar todo o banco de dados em vez de tabela por tabela
MonsterMMORPG
tente a --databases [db_name]palavra-chave conforme explicada nesta resposta: stackoverflow.com/a/26096339/155687
Vladislav
4

Tive um problema muito semelhante hoje - precisei copiar uma grande tabela (5 milhões de linhas) do MySql para o MS SQL.

Aqui estão as etapas que executei (no Ubuntu Linux):

  1. Criou uma tabela em MS SQL cuja estrutura coincide com a tabela de origem no MySql.

  2. Linha de comando MS SQL instalada: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Tabela descartada do MySql para um arquivo:

mysqldump \
    --compact \
    --complete-insert \
    --no-create-info \
    --compatible = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --user "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. No meu caso, o arquivo de despejo era muito grande, então decidi dividi-lo em várias partes pequenas (1000 linhas cada) - split --lines=1000 "$FILENAME" part-

  2. Finalmente, eu iterou sobre esses pequenos arquivos, fiz algumas substituições de texto e executei as partes uma a uma no servidor MS SQL:

export SQLCMD = / opt / mssql-tools / bin / sqlcmd

x = 0

para arquivo em parte- *
Faz
  echo "Exportando arquivo [$ file] para MS SQL. $ x mil (s) processado"

  # substitui \ 'por' '
  sed -i "s / \\\ '/' '/ g" "$ arquivo"

  # remove tudo "
  sed -i 's / "// g'" $ arquivo "

  # permite inserir registros com PK (id) especificado
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ arquivo"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ arquivo"
  echo ""
  echo ""

  x = $ ((x + 1))
feito

echo "Done"

Claro que você vai precisar para substituir meus variáveis como $AZURE_SERVER, $TABLE, etc com o seu.

Espero que ajude.

Vladimir Korobkov
fonte
2

Para mim, funcionou melhor exportar todos os dados com este comando:

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

--extended-insert = FALSE é necessário para evitar o limite de importação de 1000 linhas de mssql.

Criei minhas tabelas com minha ferramenta de migração, então não tenho certeza se o CREATE do arquivo backup.sql funcionará.

No SSMS do MSSQL, tive que importar os dados tabela por tabela com o IDENTITY_INSERT ON para escrever os campos de ID:

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 

Se você tiver relacionamentos, terá que importar primeiro o filho e depois a tabela com a chave estrangeira.

Pinguin Pinguin
fonte
0

Corre:

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

Você quer ver uma barra de processo?

pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
Francesco Mantovani
fonte