2009-07-10 15 views
18

Powiel możliwe:
Speeding up mysql dumps and importsCzy istnieje szybszy sposób ładowania mysqldumps?

mysqldump jest dość szybki, ale zrzuty bazy danych średniej wielkości (20-30 Megs) zająć kilka minut, aby załadować używając mysql my_database < my_dump_file.sql

Czy są jakieś ustawienia mysql, które mogę dostroić, aby przyspieszyć ładowanie? Czy istnieje lepszy sposób na załadowanie zapisanych danych?

Eksperymentowałem przy użyciu narzędzia mysqlimport z zrzutami opartymi na CSV. Te obciążenia ładują się nieznacznie - ale nie zauważalnie - szybciej. Mam ochotę po prostu skopiować surowe pliki baz danych, ale to wygląda na zły pomysł.

+0

Wystarczy FYI ... Miałem zepsuty dysk RAID 5, który spowodował bardzo złe wyniki z MySQL przywracania . To, co zwykle trwało 40 minut, wymagało 24 godzin. Tylko w celach informacyjnych. – gahooa

Odpowiedz

5
+0

Dzięki, właśnie tego szukałem! –

+13

Opis mówi, że są błędy w oprogramowaniu i NIE powinny być używane do tworzenia kopii zapasowych lub ważnych danych! Szkoda ... Zastanawiam się, czy mogę po prostu uruchomić wiele mysqldumps równolegle na różnych stołach, aby uzyskać przyspieszenie? – davr

5

Upewnij się, że używasz opcji --opt do mysqldump podczas zrzucania. Pozwoli to używać składni insert luzem, opóźnienie kluczowych aktualizacje, itp ...


Jeśli tylko przy użyciu tabel MyISAM, można bezpiecznie je skopiować przez zatrzymywanie serwera, kopiując je do zatrzymanego serwera i zaczynając to.

Jeśli nie chcesz, aby zatrzymać serwer pochodzenia, można postępować w ten sposób:

  1. Uzyskać blokada odczytu na wszystkich stołach
  2. wypłukać stoły
  3. skopiować pliki
  4. Unlock tabele:

Ale jestem prawie pewny, że twój serwer kopiowania do serwera musi zostać zatrzymany po umieszczeniu ich na miejscu.

+0

Właściwie to, co mysqlhotcopy ma – aldrinleal

+0

Niestety, mam tylko jeden głos w górę, aby dać. Zmieniając sposób, w jaki wykonywałem mysqldump, używając opcji --opt zgodnie z twoimi sugestiami, zgoliłem 5 godzin wolnego z mojego importu! – Nate

+0

@Nate Istnieją inne powody, dla których import jest teraz szybszy, ponieważ opcja '--opt' jest domyślnie włączona w mysqldump. Tak było przynajmniej od wersji 5.5 (2010). – dr01

1

Istnieje metoda użycia migawek LVM do tworzenia kopii zapasowych i przywracania, które mogą być dla Ciebie interesującą opcją.

Zamiast wykonywać mysqldump, należy rozważyć użycie LVM do robienia migawek katalogów danych MySQL. Używanie migawek LVM pozwala na tworzenie kopii zapasowych w czasie prawie rzeczywistym, obsługę wszystkich mechanizmów magazynowania i niesamowicie szybkie odtwarzanie. Aby zacytować pod poniższym linkiem,

"Czas przywracania jest tak szybki, jak przywrócenie danych i standardowe usuwanie awarii MySQL, i można go zmniejszyć jeszcze bardziej."

http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

4

Czy jesteś pewien, że dane jest zdrowy i nie ma żadnych problemów z wydajnością systemu plików lub systemu? Kilka minut na bazę danych o wielkości 20-30 megawatów to długi czas. Jestem na MacBooku z 2 GB pamięci RAM, 320 GB HD i standardowym procesorem 2,1 GHz. Złapałem jedną z moich baz danych za szybki test porównawczy:

gavinlaking$ du -sm 2009-07-12.glis 
74 2009-07-12.glis 
gavinlaking$ mysql -pxxx -e "drop database glis" 
gavinlaking$ mysql -pxxx -e "create database glis" 
gavinlaking$ time mysql -pxxx glis < 2009-07-12.glis 

real 0m17.009s 
user 0m2.021s 
sys 0m0.301s 

17 sekund na plik o wielkości 74 megabajtów. Wydaje mi się to dość przygnębiające. Nawet jeśli był 4 razy większy (co oznacza, że ​​jest nieśmiały 300 megabajtów), kończy się w niecałe 70 sekund.

25

Zakładając, że używasz InnoDB ...

byłem w sytuacji posiadania stos istniejących plików wyjściowych mysqldump że chciałem zaimportować w rozsądnym czasie. Tabele (po jednym na plik) miały około 500 MB i zawierały około 5 000 000 wierszy danych. Korzystając z poniższych parametrów udało mi się skrócić czas wstawiania z 32 minut do poniżej 3 minut.

innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

Trzeba także mieć dość dużą innodb_buffer_pool_size ustawienia.

Ponieważ moje wkładki były jednorazowe, później zmieniłem ustawienia. Jeśli zamierzasz nadal używać ich długoterminowo, upewnij się, że wiesz, co robią.

Znalazłem sugestię, aby użyć tych ustawień na Cedric Nilly's blog, a szczegółowe objaśnienia dla każdego z ustawień można znaleźć w MySQL documentation.

+0

Po raz drugi używam tej metody. W obu przypadkach (różne bazy danych) skrócił czas importu z godzin na kilka minut. Dzięki! – lepe

+0

Niedawno musiałem to zrobić dla prostej tabeli zawierającej ~ 8 kolumn i głównie danych int. Przed ich zastosowaniem otrzymywałem około ~ 30 insertów/s (indeksy wyłączone). Po zmianie otrzymywałem ~ 600 insertów/s. Największą wygraną jest ustawienie innodb_flush_log_at_trx_commit z "1" (domyślnie) na "2", co powoduje opróżnienie zapisów do logowania co sekundę, zamiast każdej transakcji (która jest po każdej wstawce, gdy autocommit ma wartość true). – Adil

+0

Czy możesz wyjaśnić, co się dzieje podczas edycji tych wartości? Abyśmy mogli zrozumieć. Po prostu użyłem tego i szybkość jest niesamowita. – reignsly

Powiązane problemy