Importuj bazę danych MySQL do MS SQL Server


92

Mam plik .sql ze zrzutu MySQL zawierający tabele, definicje i dane do wstawienia w tych tabelach. Jak mogę przekonwertować tę bazę danych przedstawioną w pliku zrzutu na bazę danych MS SQL Server?


1
Czy masz również dostęp do oryginalnej bazy danych? A może plik eksportu jest w zasadzie wszystkim, co masz?
Whakkee

Mam też dostęp do oryginalnego DB. Po prostu pomyślałem, że korzystanie ze zrzutu może być łatwiejsze
marionmaiden

Odpowiedzi:


62

Użyj Asystenta migracji programu SQL Server (SSMA)

Oprócz MySQL obsługuje Oracle, Sybase i MS Access.

Wydaje się być całkiem sprytny i zdolny do obsługi nawet nietrywialnych transferów. Ma również interfejs wiersza poleceń (oprócz GUI), więc teoretycznie można go zintegrować z jakimś procesem ładowania wsadowego.

To aktualne łącze do pobrania wersji MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

Obecna (z czerwca 2016 r.) Stabilna wersja 6.0.1 ulega awarii z obecnym (5.3.6) sterownikiem MySQL ODBC podczas przesyłania danych. Wszystko w wersji 64-bitowej. Wersja 5.3 ze sterownikiem ODBC 5.1.13 działa dobrze.


9
To narzędzie działa tylko wtedy, gdy możesz zainstalować złącze ODBC z komputera do bazy danych MySQL. Jeśli masz tylko plik zrzutu .sql, nie możesz używać SSMA.
Jake Munson

10
Silnik MySQL jest darmowym oprogramowaniem, istnieje również wersja dla systemu Windows. Zainstalowanie go i załadowanie zrzutu to banalna praca. Jeśli masz nadzieję na znalezienie narzędzia (nawet komercyjnego, nie mówiąc już o darmowym), które niezawodnie przekonwertuje dowolny skrypt MySQL na jego odpowiednik w SQL Server - cóż, powodzenia.
Zar Shardan,

1
Słuszna uwaga. I to właśnie skończyłem wczoraj. Oprócz pisania własnego narzędzia do konwersji, instalacja MySQL wydaje się być najlepszą opcją. Stosowanie SSMA było upierdliwe, ale w końcu udało mi się to.
Jake Munson,

2
SSMA to świetna opcja, powinna to być akceptowana odpowiedź. Nie było mi to wcale trudne w użyciu.
DonBecker

2
Wymaga agenta SQL Server, który nie jest dostarczany z SQL Server Express.
Vinicius Rocha

18

Sugeruję użycie mysqldump w następujący sposób:

mysqldump --compatible=mssql

phpMyAdmin nadal jest aplikacją internetową i może mieć pewne ograniczenia dla dużych baz danych (czas wykonywania skryptu, przydzielana pamięć i tak dalej).


6
Niestety, powoduje to wiele problemów ze zgodnością. Skrypt będzie zawierał znaki odwrotne wokół nazw kolumn, typy danych, które nie istnieją w MSSQL, naruszy ograniczenie max-1000-inserts, słowa kluczowe auto_increment itp. Itd. Ta odpowiedź jest logiczną sugestią, ale obawiam się, że tak nie jest nie działa zbyt dobrze (przynajmniej: nie dla mnie).
Jeroen

mysqldump --compatible = ansi "Tworzy dane wyjściowe, które są bardziej zgodne z innymi systemami baz danych lub ze starszymi serwerami MySQL. Jedyną dozwoloną wartością dla tej opcji jest ansi, co ma takie samo znaczenie jak odpowiednia opcja ustawiania trybu SQL serwera."
Thomas Taylor

14

Znalazłem na to sposób w sieci

Wymaga to trochę pracy, bo trzeba to zrobić stół po stole. W każdym razie mógłbym skopiować tabele, dane i ograniczenia do bazy danych MS SQL.

Tutaj jest link

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


1
Dzieje się tak, gdy zarówno MySQL, jak i SQL znajdują się na jednym komputerze lub są połączone przez sieć. Nie jest to przydatne, gdy istnieją dwie różne maszyny i masz plik zrzutu z mysql. dobrze?
Espanta

7

Jeśli wykonujesz eksport za pomocą PhpMyAdmin , możesz zmienić tryb zgodności sql na „MSSQL”. W ten sposób po prostu uruchom wyeksportowany skrypt w bazie danych MS SQL i gotowe.

Jeśli nie możesz lub nie chcesz używać PhpMyAdmin, w mysqldump jest również opcja zgodności , ale osobiście wolałbym, aby PhpMyAdmin zrobił to za mnie.


1
Ta odpowiedź zadziałała dla mnie, przy minimalnych modyfikacjach wygenerowanego skryptu. Przeniesiono go do SQL Server 2012. Nie widziałem wcześniej trybu zgodności.
Kilonia

7

Oto moje podejście do importowania plików .sql do MS SQL:

  1. Eksportuj tabelę z MySQL z opcjami --compatible=mssqli --extended-insert=FALSE:

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

  2. Podziel wyeksportowany plik za pomocą programu PowerShell o 300000 linii na plik:

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

  3. Uruchom każdy plik w MS SQL Server Management Studio

Istnieje kilka wskazówek, jak przyspieszyć wkładki .

Innym podejściem jest użycie –whereopcji mysqldump . Korzystając z tej opcji, możesz podzielić tabelę na dowolny warunek, który jest obsługiwany przez whereklauzulę sql.


jak możemy wyeksportować całą bazę danych zamiast tabeli po tabeli
MonsterMMORPG

spróbuj --databases [db_name]słowo kluczowe, jak wyjaśniono w tej odpowiedzi: stackoverflow.com/a/26096339/155687
Vladislav

4

Miałem dzisiaj bardzo podobny problem - musiałem skopiować dużą tabelę (5 milionów wierszy) z MySql do MS SQL.

Oto kroki, które wykonałem (w systemie Ubuntu Linux):

  1. Utworzono tabelę w MS SQL, której struktura odpowiada tabeli źródłowej w MySql.

  2. Zainstalowany wiersz poleceń MS SQL: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Zrzucona tabela z MySql do pliku:

mysqldump \
    --kompaktowy \
    --complete-insert \
    --no-create-info \
    --compatible = mssql \
    --extended-insert = FALSE \
    --host "$ MYSQL_HOST" \
    --user "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    „$ MYSQL_DB” \
    „$ TABLE”> „$ FILENAME”
  1. W moim przypadku plik zrzutu był dość duży, więc postanowiłem podzielić go na kilka małych części (po 1000 wierszy) - split --lines=1000 "$FILENAME" part-

  2. W końcu przejrzałem te małe pliki, dokonałem kilku podmian tekstu i wykonałem fragmenty jeden po drugim na serwerze MS SQL:

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

x = 0

dla pliku w części- *
zrobić
  echo "Eksportowanie pliku [$ plik] do MS SQL. Przetworzono x tysięcy $"

  # zamienia \ 'na' '
  sed -i "s / \\\ '/' '/ g" "$ plik"

  # usuwa wszystko ”
  sed -i 's / "// g'" $ plik "

  # pozwala na wstawianie rekordów o określonym 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 "$ plik"
  Echo ""
  Echo ""

  x = $ ((x + 1))
Gotowe

echo „Gotowe”

Oczywiście trzeba wymienić moje zmienne jak $AZURE_SERVER, $TABLEitp z naszą.

Mam nadzieję, że to pomoże.


3

U mnie najlepiej było wyeksportować wszystkie dane za pomocą tego polecenia:

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

--extended-insert = FALSE jest potrzebne, aby uniknąć limitu importu wierszy mssql 1000.

Utworzyłem tabele za pomocą narzędzia do migracji, więc nie jestem pewien, czy funkcja CREATE z pliku backup.sql zadziała.

W SSMS MSSQL musiałem zaimportować tabelę danych po tabeli z IDENTITY_INSERT ON, aby zapisać pola 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 

Jeśli masz relacje, musisz najpierw zaimportować dziecko, a następnie tabelę z kluczem obcym.



0

Biegać:

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

Czy chcesz zobaczyć pasek postępu?

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

0

możesz użyć aplikacji sqlie do konwersji z mysql na sqlserver możesz obejrzeć ten film https://www.youtube.com/watch?v=iTVEqys_vTQ&t=108s


1
Witamy w Stackoverflow @gorgino! Jeśli umieścisz link, zamieść również krótkie podsumowanie treści na wypadek, gdyby link ten został wyłączony w przyszłości. Łączenie powinno być wykorzystywane głównie rozwinąć swoją odpowiedź, nie jest odpowiedź.
Cribber
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.