2013-03-01 5 views
5

Próbuję zaimportować bardzo duży plik .sql do mojej bazy danych. Obecnie plik ma rozmiar 20 GB. Próbowałem z konsolą bazy danych mysql < backup.sql, ale trwa to dłużej niż 24 godziny, a serwer mysql już nie reagował.Importowanie dużego pliku sql (> 20 GB)

Jak mogę zaimportować tak duży plik? Myślę, że podzielenie go jest drogą do zrobienia, ale jak mogę podzielić to poprawnie? Jest to tylko jedna tabela z kilkoma instrukcjami wstawiania.

+0

. Pliki sql nie są przeznaczone do ładowania plików o tym rozmiarze. Będziesz otwierać i zamykać transakcję z każdą linią tego pliku. Aby to zrobić przy dowolnej wydajności, potrzebujesz specjalnych narzędzi. Informowanie nas o tym, które bazy danych są w użyciu, pomoże użytkownikom wskazać właściwy kierunek. – gbtimmon

+1

Utwórz program w języku Python, który czyta go wiersz po wierszu i kontynuuje wprowadzanie go do bazy danych. Możesz także spowodować, że program będzie drukować sporadyczne komunikaty o stanie (% ukończone itp.). –

+0

@SudiptaChatterjee nie sprawiłoby, że będzie wolniejszy, a nie szybszy ????? – gbtimmon

Odpowiedz

1

MySQL ma api napędzane wstawki tabeli wbudowane w języku. Zobacz poniżej. Użyj tego: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

Musisz sformatować plik ze sprawozdaniem Włożyć do jakiejś formy csv lub tym podobne, ale powinno to wiele zamówień szybciej niż jednostkowego sprawozdania, ponieważ jest to sposób komunikowania się z RDBMS „I mam zamiar przesłać dużo danych, zaoszczędzić na ponownej analizie i księgowości do końca, upewnić się, że masz wystarczająco dużo miejsca i chwycić tę przestrzeń raz zamiast za każdym razem, gdy się zapełnisz, upewnij się, że korzystasz z odpowiednich blokad itp. itd itd".

+0

Czy istnieje skrypt lub coś takiego, aby utworzyć taki plik z mojego pliku "wstaw do"? Czy mogę wyeksportować bazę danych do takiego pliku? – clonaech

+0

Istnieje wiele skryptów, awk działałoby, jeśli wiesz, ale dobry projekt procesu powiedziałby, że chcesz proces, który generuje plik INSERT, którego używasz do wygenerowania pliku .csv. Musiałbym wiedzieć, co to jest proces, aby zrozumieć, co trzeba zrobić, aby uzyskać plik we właściwym formacie. – gbtimmon

+0

Okay, widzę, że jest opcja z mysqldump. Ale jak mogę zapisać indeks? Czy muszę podać ten indeks po imporcie? – clonaech

0

Po prostu zablokuj tabelę, a następnie wykonaj kopię tych plików danych tabeli (.frm, .MYI, .MYD).
Natychmiast otrzymujesz gotowy plik danych, który można zaimportować do dowolnej bazy danych.

Ta metoda działa bardzo dobrze dla myisam. Not sure about innodb.

0

Można podzielić plik sql i zaimportować go do bazy danych.

Najłatwiej podzielić plik sqldump jest użycie sqldumpsplitter oprogramowania, pobierz link

albo użyć tej komendy terminala podzielić

split -l 5000 ./path/to/mysqldump.sql ./mysqldump/dbpart-

Tu 5000 liczba linii poleceń SQL , wolisz się dzielić. Następnymi dwoma argumentami są odpowiednio ścieżki źródłowe i docelowe. Poszczególne pliki podziału będą miały przypisaną nazwę z dołączonym alfabetem.

Mam nadzieję, że pomoże to innym osobom mającym ten problem.

0

I sugerują, że należy rozważyć następujące przypadki, starając się zachować zapytań SQL całej dzielonych plików:

  • Zapytanie pojedynczy SQL może być podzielony na kilka wierszy, dzięki czemu można nie tylko rozłam linia po linii
  • poprawne zapytanie SQL zakończy się na średniku (;), a przeważnie będzie to koniec wiersza.

Uzbrojeni w tę wiedzę na temat tych dwóch przypadków, można napisać prosty skrypt, który przetwarza linię zrzutu SQL po linii i dzieli ją na fragmenty, gdy znajdzie wiersz kończący się średnikiem (;), a może 500 takie linie.

Pisałem taki scenariusz podobny problem, który wychodził: https://gist.github.com/pratikone/0a8d503ffe893b2111f5a1d70d3999b7

ono wyłącznie do kontroli średnikiem (;) w wierszu, a nie na końcu linii, ale nie mają żadnych Zapytanie SQL, które zawierało średnik (;) w zapytaniu, więc działało idealnie dobrze. Biorąc to pod uwagę, jest to niewielka zmiana, jeśli dane mogą zawierać średnik pomiędzy zapytaniami.