Czy ktoś zna szybki i łatwy sposób migracji bazy danych SQLite3 do MySQL?
Oto lista konwerterów (nie aktualizowana od 2011 roku):
tzn. możesz to zrobić:
Wygląda na to, że wszyscy zaczynają od kilku wyrażeń greps i perl, a ty dostajesz coś, co działa dla twojego konkretnego zestawu danych, ale nie masz pojęcia, czy dane zostały poprawnie zaimportowane, czy nie. Jestem naprawdę zaskoczony, że nikt nie zbudował solidnej biblioteki, która może konwertować między nimi.
Oto lista WSZYSTKICH różnic w składni SQL, o których wiem między dwoma formatami plików: Linie zaczynające się od:
nie są używane w MySQL
CREATE TABLE/INSERT INTO "table_name"
i MySQLCREATE TABLE/INSERT INTO table_name
INSERT INTO
klauzulINSERT INTO
klauzul't'
a 'f'
dla logicznych, MySQL używa 1
i 0
(prosty regex dla tego może się nie powieść, gdy masz ciąg taki jak: „Ja robię, ty nie” wewnątrz INSERT INTO
)AUTOINCREMENT
, MySQLAUTO_INCREMENT
Oto bardzo prosty, zhakowany skrypt perla, który działa dla mojego zbioru danych i sprawdza, czy nie ma wielu innych warunków, które inne skrypty perla znalazłem w Internecie. Nu gwarantuje, że będzie działać na Twoje dane, ale możesz je zmodyfikować i opublikować tutaj.
#! /usr/bin/perl
while ($line = <>){
if (($line !~ /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
$name = $1;
$sub = $2;
$sub =~ s/\"//g;
$line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
}
elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
$line = "INSERT INTO $1$2\n";
$line =~ s/\"/\\\"/g;
$line =~ s/\"/\'/g;
}else{
$line =~ s/\'\'/\\\'/g;
}
$line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
$line =~ s/THIS_IS_TRUE/1/g;
$line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
$line =~ s/THIS_IS_FALSE/0/g;
$line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
print $line;
}
}
&& ($line !~ /CREATE UNIQUE INDEX/)
dodaniu&& ($line !~ /PRAGMA foreign_keys=OFF/)
* wyrażenie regularne pasujące do tabeli pomija cyfry, czyli zamiast tego$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
musi być$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
Nadzieja, że to pomaga w przyszłości czytelnicyOto skrypt w języku Python, zbudowany na podstawie odpowiedzi Shalmanese i pomocy Alexa Martelliego z Translating Perl to Python
Tworzę wiki społeczności, więc prosimy o edycję i refaktoryzację, pod warunkiem, że nie psuje funkcji (na szczęście możemy po prostu wycofać) - To jest brzydkie, ale działa
użyj tak (zakładając, że skrypt nazywa się
dump_for_mysql.py
:Które możesz następnie zaimportować do mysql
Uwaga - należy ręcznie dodać ograniczenia klucza obcego, ponieważ narzędzie sqlite ich nie obsługuje
oto skrypt:
źródło
schema_migrations
(version
varchar (255) NOT NULL); INSERT INTO schema_migrations VALUES (20100714032840
); INSERT INTO schema_migrations VALUES ('20100714033251'); __Blobvar
typ danych, znaczniki wsteczne w instrukcji CREATE ...Prawdopodobnie najszybszym najłatwiejszym sposobem jest użycie polecenia sqlite .dump, w tym przypadku utwórz zrzut przykładowej bazy danych.
Następnie możesz (teoretycznie) zaimportować to do bazy danych mysql, w tym przypadku testowej bazy danych na serwerze bazy danych 127.0.0.1, używając root użytkownika.
Mówię teoretycznie, ponieważ istnieje kilka różnic między gramatykami.
W sqlite rozpoczynają się transakcje
MySQL używa tylko
Istnieją inne podobne problemy (wracają do mnie varchary i podwójne cudzysłowy), ale nic nie można znaleźć i zastąpić.
Być może powinieneś zapytać, dlaczego przeprowadzasz migrację, jeśli problemem jest wydajność / rozmiar bazy danych, być może przyjrzyj się ponownemu uruchomieniu schematu, jeśli system przechodzi na bardziej wydajny produkt, może to być idealny czas na planowanie przyszłości twoich danych.
źródło
Jeśli używasz Python / Django, jest to dość proste:
utwórz dwie bazy danych w settings.py (jak tutaj https://docs.djangoproject.com/en/1.11/topics/db/multi-db/ )
to po prostu zrób tak:
źródło
źródło
Właśnie przeszedłem ten proces i w tym pytaniu jest dużo bardzo dobrej pomocy i informacji, ale odkryłem, że musiałem zebrać różne elementy (plus niektóre z innych pytań / odpowiedzi), aby uzyskać działające rozwiązanie aby pomyślnie migrować.
Jednak nawet po połączeniu istniejących odpowiedzi stwierdziłem, że skrypt Pythona nie działał dla mnie w pełni, ponieważ nie działał tam, gdzie wystąpiło wiele wystąpień boolowskich w INSERT. Zobacz tutaj, dlaczego tak było.
Pomyślałem więc, że opublikuję tutaj scaloną odpowiedź. Uznanie należy się oczywiście tym, którzy przyczynili się gdzie indziej. Ale chciałem coś oddać i zaoszczędzić innym czas.
Skrypt opublikuję poniżej. Ale po pierwsze, oto instrukcje dotyczące konwersji ...
Uruchomiłem skrypt na OS X 10.7.5 Lion. Python działał od razu po wyjęciu z pudełka.
Aby wygenerować plik wejściowy MySQL z istniejącej bazy danych SQLite3, uruchom skrypt na własnych plikach w następujący sposób:
Następnie skopiowałem wynikowy plik dumped_sql.sql do systemu Linux z systemem Ubuntu 10.04.4 LTS, w którym miała znajdować się moja baza danych MySQL.
Innym problemem, który miałem podczas importowania pliku MySQL, było to, że niektóre znaki UTF-8 w standardzie Unicode (konkretnie pojedyncze cudzysłowy) nie były importowane poprawnie, więc musiałem dodać przełącznik do polecenia, aby określić UTF-8.
Wynikowa komenda wprowadzania danych do nowej, pustej bazy danych MySQL jest następująca:
Niech gotuje i to powinno być to! Nie zapomnij przeanalizować swoich danych przed i po.
Tak, jak wymagał PO, jest to szybkie i łatwe, gdy wiesz jak! :-)
Nawiasem mówiąc, jedną rzeczą, o której nie byłem pewien, zanim przejrzałem tę migrację, było to, czy wartości pola create_at i updated_at zostaną zachowane - dobra wiadomość dla mnie jest taka, że mogę migrować istniejące dane produkcyjne.
Powodzenia!
AKTUALIZACJA
Po dokonaniu tej zmiany zauważyłem problem, którego wcześniej nie zauważyłem. W mojej aplikacji Rails moje pola tekstowe są zdefiniowane jako „ciąg”, co prowadzi do schematu bazy danych. Proces opisany tutaj powoduje, że są one zdefiniowane jako VARCHAR (255) w bazie danych MySQL. Powoduje to ograniczenie liczby znaków do 255 znaków - a wszystko poza tym zostało po cichu obcięte podczas importu. Wydaje mi się, że do obsługi tekstu o długości większej niż 255 schemat MySQL musiałby używać „TEKST” zamiast VARCHAR (255). Zdefiniowany tutaj proces nie obejmuje tej konwersji.
Oto scalony i poprawiony skrypt Pythona, który zadziałał dla moich danych:
źródło
Zwykle używam tabel eksport / import cechą IntelliJ DataGrip .
Postęp możesz zobaczyć w prawym dolnym rogu.
[ ]
źródło
Niedawno musiałem przeprowadzić migrację z MySQL do JavaDB dla projektu, nad którym pracuje nasz zespół. Znalazłem bibliotekę Java napisaną przez Apache'a o nazwie DdlUtils, która ułatwiła to. Zapewnia interfejs API, który pozwala wykonać następujące czynności:
Narzędzia, z którymi wylądowaliśmy, nie były całkowicie zautomatyzowane, ale działały całkiem dobrze. Nawet jeśli twoja aplikacja nie jest w Javie, nie powinno być zbyt trudne uruchomienie kilku małych narzędzi do jednorazowej migracji. Myślę, że udało mi się przeprowadzić migrację z mniej niż 150 liniami kodu.
źródło
Nie ma potrzeby żadnego skryptu, polecenia itp.
musisz tylko wyeksportować bazę danych sqlite jako
.csv
plik, a następnie zaimportować ją do Mysql przy użyciu phpmyadmin.Użyłem go i zadziałało niesamowicie ...
źródło
Oparty na rozwiązaniu Jimsa: Szybki i łatwy sposób migracji SQLite3 na MySQL?
To działa dla mnie. Używam sed tylko do rzucenia pierwszej linii, która nie jest podobna do mysql, ale równie dobrze możesz zmodyfikować skrypt dump.py, aby wyrzucić tę linię.
źródło
Uzyskaj zrzut SQL
Zaimportuj zrzut do MySQL
W przypadku małego importu:
lub
Spowoduje to monit o podanie hasła. Uwaga: jeśli chcesz wprowadzić hasło bezpośrednio, musisz to zrobić BEZ spacji, bezpośrednio po
-p
:W przypadku większych zrzutów:
mysqlimport lub inne narzędzia do importowania, takie jak BigDump .
BigDump daje pasek postępu:
źródło
Ha ... Szkoda, że nie znalazłem tego pierwszego! Moja odpowiedź była na ten post ... skrypt do konwersji pliku zrzutu mysql sql do formatu, który można zaimportować do pliku sqlite3 db
Połączenie tych dwóch byłoby dokładnie tym, czego potrzebowałem:
Kiedy baza danych sqlite3 będzie używana z ruby, możesz chcieć to zmienić:
do:
niestety, ta tylko połowa działa, ponieważ chociaż wstawiasz 1 i 0 do pola oznaczonego logicznie, sqlite3 przechowuje je jako 1 i 0, więc musisz przejść przez i zrobić coś takiego:
ale warto było sprawdzić plik sql, aby znaleźć wszystkie wartości logiczne.
źródło
Napisałem ten prosty skrypt w Python3. Może być używany jako dołączona klasa lub samodzielny skrypt wywoływany przez powłokę terminala. Domyślnie importuje wszystkie liczby całkowite jako
int(11)
i ciągi jakovarchar(300)
, ale wszystko to można dostosować odpowiednio w argumentach konstruktora lub skryptu.UWAGA: Wymaga MySQL Connector / Python 2.0.4 lub nowszego
Oto link do źródła na GitHub, jeśli poniższy kod jest trudny do odczytania: https://github.com/techouse/sqlite3-to-mysql
źródło
Ten skrypt jest w porządku, z wyjątkiem tego przypadku, który oczywiście spotkałem:
Skrypt powinien dać następujące dane wyjściowe:
Ale zamiast tego daje ten wynik:
z niektórymi dziwnymi nie-asciowskimi postaciami w ostatnich 0 i 1.
Nie pojawiło się to już, gdy skomentowałem następujące wiersze kodu (43-46), ale pojawiły się inne problemy:
To tylko szczególny przypadek, gdy chcemy dodać wartość „f” lub „t”, ale nie bardzo mi się podoba wyrażenia regularne, chciałem tylko zauważyć, że ktoś może to poprawić.
W każdym razie wielkie dzięki za ten przydatny skrypt !!!
źródło
To proste rozwiązanie zadziałało dla mnie:
źródło
uważaj na instrukcje CREATE
źródło