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.