Jak mogę przyspieszyć przywracanie MySQL z pliku zrzutu?

28

Przywracam bazę danych 30 GB z pliku mysqldump do pustej bazy danych na nowym serwerze. Podczas uruchamiania kodu SQL z pliku zrzutu przywracanie rozpoczyna się bardzo szybko, a następnie staje się coraz wolniejsze. Poszczególne wstawki zajmują teraz ponad 15 sekund. Tabele są w większości MyISAM z jednym małym InnoDB. Serwer nie ma innych aktywnych połączeń. SHOW PROCESSLIST;pokazuje tylko wstawkę z przywracania (i samą listę procesów).

Czy ktoś ma jakieś pomysły na to, co może spowodować dramatyczne spowolnienie?

Czy są jakieś zmienne MySQL, które mogę zmienić, aby przyspieszyć przywracanie w trakcie jego trwania?

Dave Forgac
źródło
Edytowano, aby poprawić typy tabel
Dave Forgac

Odpowiedzi:

26

Jedną z rzeczy, które mogą spowalniać proces, jest key_buffer_size , czyli wielkość bufora używanego do bloków indeksów. Dostosuj to do co najmniej 30% pamięci RAM, w przeciwnym razie proces ponownego indeksowania będzie prawdopodobnie zbyt wolny.

Dla odniesienia, jeśli korzystasz z InnoDB i kluczy obcych, możesz również wyłączyć sprawdzanie kluczy obcych i włączyć je ponownie na końcu (używając SET FOREIGN_KEY_CHECKS=0i SET FOREIGN_KEY_CHECKS=1).

Marco Ramos
źródło
1
Znalazłem dwie rzeczy: key_buffer_size został ustawiony na 8 MB i była jedna tabela InnoDB w mieszance z kluczami obcymi. Zwiększono rozmiar key_buffer_size do 1 GB i tymczasowo wyłączyłem sprawdzanie klucza obcego. Przywracanie zakończyło się za 5 minut. Dzięki!
Dave Forgac
łał! Cieszę się, że pomogło :)
Marco Ramos
2
Właśnie zauważyłem, że wpisałem „5” minut. Jestem prawie pewien, że
trwało
5
key_buffer_size jest dla MYISAM.
Fernando Fabreti
@FernandoFabreti - to ważny punkt dla wielu czytelników, ale OP określił, że mają głównie MyISAM
mc0e
22

Ten link pokazuje, co można zrobić, aby przyspieszyć proces przywracania.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Można umieścić polecenia na górze pliku zrzutu

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

I umieść te instrukcje na końcu pliku zrzutu

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

To zadziałało dla mnie. Miłego przywracania :-)

Dharmesh Tailor
źródło
8
To bardzo pomogło. Zamiast edytować plik, utworzyłem pre.sql i post.sql z powyższych fragmentów i użyłem go do przywrócenia bazy danych:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs
1

Jedynym powodem, dla którego mogę sobie wyobrazić, dlaczego przywracanie stopniowo zwalniało, jest indeksowanie. Zbadaj wyłączanie indeksowania do końca, a następnie pozwól mu zrobić całą akcję naraz.

John Gardeniers
źródło
1

Jeśli masz fizyczną kopię pliku zrzutu (katalog DB), możesz po prostu skopiować go na nowy serwer, jeśli nowy serwer ma tę samą wersję MySQL i będzie działał dobrze. Działa to dobrze z MyISAM i dla mnie myślę, że jest lepsze niż przywracanie danych na podstawie logicznego pliku zrzutu SQL.

usef_ksa
źródło
0

jeśli masz wiele tabel, możesz skorzystać z mk-parallel-restore .

pQd
źródło
Jest to obecnie przestarzałe i powinno być używane tylko do przywracania danych testowych, a nie do przywracania rzeczywistych kopii zapasowych.
svandragt
0

To wystarczy:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql

Matiss
źródło
-1

Zasugerowałem ci

  1. Sprawdź swoje tabele: czy ma wyzwalacze? Wyczyść wszystkie wyzwalacze
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( i nie zapomnij cofnąć zmienia )
  3. UŻYWAJ PODOBNEJ LINII POLECEŃ mysql -u root -pPasss requests < mydb.sql
  4. Sprawdź rozmiar pliku bazy danych

Powodzenia

Ferhat KOÇER
źródło