Eksportuj bazę danych MySQL do bazy danych SQLite


Odpowiedzi:


71

Na Githubie jest fantastyczny skrypt powłoki Linuksa, który konwertuje Mysql do pliku Sqlite3. Potrzebujesz zarówno mysqldump, jak i sqlite3 zainstalowanych na serwerze. Działa świetnie.


jak dotąd działa najlepiej! potrzebne tylko do usunięcia niektórych instrukcji „COLLATE xy” z kodowaniem, którego sqlite nie rozumie. Zauważ, że nie będziesz potrzebować sqlite3 na swoim serwerze, jeśli chcesz mieć klon swojej bazy danych mysql do lokalnego rozwoju.
benzkji

1
Niestety u mnie nie działało. Oprócz wspomnianych poniżej problemów z instrukcjami „PRIMARY KEY”, zgłoszono wiele innych błędów związanych z instrukcjami „INSERT” i brakującymi tabelami („obiektami”).
BartoszKP 24.07.15

2
Autor anandoned scenariusz, ale kontynuowano prace w tym wideł: github.com/dumblob/mysql2sqlite
ilyaigpetrov

3
github.com/dumblob/mysql2sqlite jest teraz oficjalną wersją. 2016-05-11 17:32 GMT+2 @esperlu declared MIT as a fitting license (also retrospectively) and the original gist as deprecated.
Li-aung Yip

1
dzięki za headsup ilyaigpetrov i @ Li-aungYip, zaktualizowałem link
georgiecasey

7

Odpowiedź użytkownika @ user2111698 edytowana przez @quassy działa zgodnie z obietnicą. Ponieważ robię to często, umieszczam ich instrukcje w skrypcie bash:

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump the mysql database to a txt file
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# remove lines mentioning "PRIMARY KEY" or "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump leaves trailing commas before closing parentheses  
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# change all \' to ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

Streszczenie ze szczegółowymi komentarzami można znaleźć pod adresem https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d


Jeśli sformatujesz kod w celu wyeliminowania przewijania, ułatwisz innym czytanie.
zhon

Chętnie; nie widzę szybko jak
George Fisher

1
Jeśli usuniesz komentarze, skończysz z przewijaniem w pionie (dodaj do tekstu odpowiedzi wszelkie komentarze, które uważasz za ważne). Przewijanie w pionie można obsłużyć za pomocą odwrotnego ukośnika nowej linii.
zhon

jeśli twój plik sql jest większy niż 1 GB, najpierw podziel go. w przeciwnym razie skrypt Perla wyświetli błąd pętli podstawień.
nurp

3

mysql2sqlite.sh wspomniany w górnym poście nie radzi sobie dobrze z liniami PRIMARY KEY, nie zapisuje końca, )aby uzupełnić instrukcję CREATE.

To właśnie zrobiłem. Uruchomiłem zrzut mysql jako:

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h<host> -u<user> -p<passwd> <database name> > localdb.txt

Następnie użyłem grep, aby usunąć PRIMARY KEY i KEY:

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

Następnie użyłem edytora, aby naprawić plik. Po usunięciu kluczy otrzymujesz instrukcję CREATE, która wygląda następująco:

CREATE ...
  ...,
)

Ten koniec ,musi zostać usunięty. W vi to wyrażenie pasuje do nich, $ \ n)

Następnie musisz zmienić wszystko \'na''

Następnie możesz wykonać import:

sqlite3 local.sqlite3 < localdb.txt.1

I to wszystko. Nie znalazłem ani jednego programu, który działałby dla mnie. Mam nadzieję, że to komuś pomoże.


2

Strukturę tabeli utworzyłem ręcznie w bazie danych sqlite.

Następnie przesłałem dane za pomocą następującego polecenia:

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

Musiałem użyć seda, aby naprawić różne kodowanie wierzchołków w dwóch bazach danych


Dzięki za to, było to pomocne, ponieważ pierwotne pytanie nie określało, czy schemat tworzenia musi zostać uwzględniony. Prostsze, gdy schemat został już skonfigurowany
kjones

0

Osobiście podoba mi się proste użycie mysqldump, ale potrzebne są pewne poprawki (w zależności od sztuki z Uniksem i tego, co chcesz zrobić).

Dawny. tylko dla jednego stołu (prods) z PK:

$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Error: near line 1: table "prods" already exists
    Error: near line 7: UNIQUE constraint failed: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

Dla bardziej złożonych rzeczy, prawdopodobnie lepiej napisać wrapper, albo wtedy użyj wspomnianego już fantastycznego skryptu powłoki Linux awk na Gist .


-1

Istnieje fantastyczne, lekkie narzędzie o nazwie Przeglądarka baz danych SQLite, które umożliwia tworzenie i edytowanie baz danych sqlite. Użyłem go do tworzenia baz danych dla aplikacji na Androida. Możesz uruchomić dla niego instrukcje SQL, aby załadować dane, więc jeśli eksportujesz dane z bazy danych mySQL, możesz po prostu zaimportować je za pomocą tego narzędzia. Oto link: http://sqlitebrowser.sourceforge.net/


2
Jak to pomaga w konwersji MySQL?
CL.

2
Pomaga ci robić dokładnie to, co musisz. Właściwie robię to teraz dosłownie. Wyeksportuj swój MySQL za pomocą mysqldump lub phpMyAdmin, a następnie użyj powyższego narzędzia, aby zaimportować go do bazy danych sqlite. Poprosił o „eksport bazy danych MySQL do bazy danych SQLite”, a powyższe narzędzie będzie drugim krokiem do zrobienia dokładnie tego, czego potrzebujesz. Odrzucanie uzasadnionej pomocy jest po prostu złe. Jestem tutaj nowy i moja odpowiedź nie tylko dotyczyła pytania, ale także tego, czego używam teraz w prawdziwej sytuacji. Nie rezygnuj tak szybko z głosowania bez powodu i zniechęcaj ludzi do udziału.
Aaron Ratner

2
Pominięto rzeczywisty drugi (i najważniejszy) krok, konwertując wszystkie specyficzne dla MySQL części zrzutu MySQL na składnię specyficzną dla SQLite lub standardową.
CL.

4
Późno, ale to narzędzie nie działa w przypadku tego problemu. Nie obsługuje składni specyficznej dla MySQL (tylko składnia SQLite). Będziesz musiał dość mocno edytować plik zrzutu, aby został pomyślnie zaimportowany.
Sverri M. Olsen

5
@AaronRatner Nie, rozwiązanie nie działa. Pytanie dotyczy wprost konwersji bazy danych MySQL, a zalecane narzędzie nie obsługuje składni MySQL. Nie musisz brać tego do siebie - z tego, co mówisz, domyślam się, że to Ty musisz się „zrelaksować” :-) Jeśli ktoś mówi, że Twoje rozwiązanie nie jest dla niego pomocne, po prostu stwierdza prosty fakt. Twoja odpowiedź, że jest to „wyjątkowo trudne, ponieważ rozwiązanie jest pomocne”, jest absurdalna. Wiem, że mi to nie pomaga, bo tak nie jest :-) Pozdrawiam!
BartoszKP

-17

wyeksportuj dane z

  mysqldump database > database.sql

i zaimportuj dane z

  sqlite3 database < database.sql

możesz potrzebować opcji -u (użytkownik) i -p (hasło)


9
Czy to faktycznie zadziała z różnicami i funkcjami dostępnymi w mysql, a nie w sqlite?
rzetterberg

5
To nie zadziała. Indeksy, opisy tabel, sekwencje ucieczki danych binarnych, mechanizmy blokujące, prawdopodobnie inne rzeczy, są różne w MySQL i SQLite.
CR.

To znacznie lepsze rozwiązanie: stackoverflow.com/questions/455606/…
Joseph

4
to nie zadziała. Przetestuj rozwiązanie przed wysłaniem tego, co przyjdzie Ci do głowy ...
Maciej Jankowski
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.