MySQL w jakikolwiek sposób szybciej zaimportować ogromny zrzut (32 GB) sql?


67

Mam ten ogromny zrzut 32 GB SQL, który muszę zaimportować do MySQL. Nie musiałem wcześniej importować tak dużego zrzutu SQL. Zrobiłem zwykle:

mysql -uroot dbname < dbname.sql

To trwa zbyt długo. Jest stół z około 300 milionami wierszy, osiągnął 1,5 miliona w około 3 godziny. Wygląda więc na to, że cała sprawa zajęłaby 600 godzin (to 24 dni) i jest niepraktyczna. Więc moje pytanie brzmi: czy jest na to szybszy sposób?

Dalsze informacje / ustalenia

  1. Wszystkie tabele są InnoDB i nie zdefiniowano żadnych kluczy obcych. Istnieje jednak wiele indeksów.
  2. Nie mam dostępu do oryginalnego serwera i bazy danych, więc nie mogę wykonać nowej kopii zapasowej ani wykonać „gorącej” kopii itp.
  3. Ustawienie innodb_flush_log_at_trx_commit = 2sugerowane tutaj wydaje się nie wprowadzać (wyraźnie widocznej / wykładniczej) poprawy.
  4. Statystyki serwera podczas importu (z MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. Wersja MySQL to społeczność 5.6.20.
  6. innodb_buffer_pool_size = 16M i innodb_log_buffer_size = 8M. Czy muszę je zwiększyć?

Czy możesz dodać szybsze komponenty do serwera, a mianowicie więcej pamięci RAM i SSD?

@Bert serwer ma 8 GB pamięci RAM, z których większość jest po prostu nieużywana. Nie można też dodać więcej miejsca. Jak to by pomogło? Czy to naprawdę tak powolne operacje zapisu?

Jakie jest wąskie gardło? Czy rdzeń procesora jest powiązany?
Chris S

@ChrisS nie, użycie procesora wynosi od 3 do 4%. Nie jestem pewien, co to jest wąskie gardło. Myślę, że to indeksy. Jak znaleźć / potwierdzić wąskie gardło?

1
Jeśli masz sql, czy możesz edytować instrukcje tworzenia indeksów i sprawdzać, czy idzie szybciej? po zaimportowaniu danych musisz je ponownie utworzyć

Odpowiedzi:


84

Vadim Tkachenko z Percony wykonał tę wspaniałą graficzną reprezentację InnoDB

Architektura InnoDB

Zdecydowanie musisz zmienić następujące elementy

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

Dlaczego te ustawienia?

Uruchom ponownie mysql w ten sposób

service mysql restart --innodb-doublewrite=0

To wyłącza podwójny bufor zapisu InnoDB

Zaimportuj swoje dane. Po zakończeniu uruchom ponownie mysql normalnie

service mysql restart

Włącza to podwójny bufor zapisu InnoDB

Spróbuj !!!

UWAGA BOCZNA : Należy zaktualizować do wersji 5.6.21, aby uzyskać najnowsze poprawki bezpieczeństwa .


Zrobiłem dla niego skrypt bash dla Linuksa,
obniżyłem

9

Czy naprawdę potrzebujesz przywrócić całą bazę danych? Jeśli nie, mój 2c:

Możesz wyodrębnić określone tabele, aby wykonać przywracanie „fragmentów”. Coś takiego:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

Zrobiłem to raz i zajęło mi to 10 minut, aby wyodrębnić tabelę, której potrzebowałem - moje pełne przywrócenie zajęło 13 ~ 14 godzin, z zrzutem 35 GB (zgzipowanym).

Parametr /pattern/,/pattern/pwith -ntworzy plasterek „między wzorami” - łącznie z nimi.

W każdym razie, aby przywrócić 35 GB, użyłem maszyny AWS EC2 (c3,8xlarge), zainstalowałem Percona przez yum (Centos) i właśnie dodałem / zmieniłem następujące linie my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Myślę, że liczby są o wiele za wysokie, ale działały na moją konfigurację.


5

Najszybszym sposobem na zaimportowanie bazy danych jest skopiowanie plików (.frm, .MYD, .MYI), jeśli MyISAM, bezpośrednio do / var / lib / mysql / „nazwa bazy danych”.

W przeciwnym razie możesz spróbować: mysql > use database_name; \. /path/to/file.sql

To kolejny sposób na import danych.


1

Jednym ze sposobów przyspieszenia importu jest zablokowanie tabeli podczas importowania. użyj opcji --add-locks do mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

lub możesz włączyć kilka przydatnych parametrów za pomocą --opt to włącza kilka przydatnych rzeczy dla zrzutu.

mysqldump --opt --database db > db.sql

Jeśli masz inne urządzenie pamięci na serwerze, skorzystaj z niego - kopiowanie z jednego urządzenia na drugie jest sposobem na przyspieszenie transferu.

możesz również odfiltrować tabele, które nie są wymagane za pomocą --ignore-table

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.