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
- Wszystkie tabele są InnoDB i nie zdefiniowano żadnych kluczy obcych. Istnieje jednak wiele indeksów.
- Nie mam dostępu do oryginalnego serwera i bazy danych, więc nie mogę wykonać nowej kopii zapasowej ani wykonać „gorącej” kopii itp.
- Ustawienie
innodb_flush_log_at_trx_commit = 2
sugerowane tutaj wydaje się nie wprowadzać (wyraźnie widocznej / wykładniczej) poprawy. - Statystyki serwera podczas importu (z MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- Wersja MySQL to społeczność 5.6.20.
- innodb_buffer_pool_size = 16M i innodb_log_buffer_size = 8M. Czy muszę je zwiększyć?
Odpowiedzi:
Vadim Tkachenko z Percony wykonał tę wspaniałą graficzną reprezentację InnoDB
Zdecydowanie musisz zmienić następujące elementy
Dlaczego te ustawienia?
.ibd
plików. Zgodnie z dokumentacją MySQLConfiguring the Number of Background InnoDB I/O Threads
, każdy wątek może obsłużyć do 256 oczekujących żądań We / Wy. Domyślna wartość dla MySQL to 4, 8 dla serwera Percona. Max ma 64 lata.Uruchom ponownie mysql w ten sposób
To wyłącza podwójny bufor zapisu InnoDB
Zaimportuj swoje dane. Po zakończeniu uruchom ponownie mysql normalnie
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 .
źródło
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:
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/p
with-n
tworzy 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
:Myślę, że liczby są o wiele za wysokie, ale działały na moją konfigurację.
źródło
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.
źródło
Jednym ze sposobów przyspieszenia importu jest zablokowanie tabeli podczas importowania. użyj opcji --add-locks do mysqldump.
lub możesz włączyć kilka przydatnych parametrów za pomocą --opt to włącza kilka przydatnych rzeczy dla zrzutu.
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
źródło