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?
Odpowiedzi:
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=0
iSET FOREIGN_KEY_CHECKS=1
).źródło
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
I umieść te instrukcje na końcu pliku zrzutu
To zadziałało dla mnie. Miłego przywracania :-)
źródło
cat pre.sql dump.sql post.sql | mysql ...
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.
źródło
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.
źródło
jeśli masz wiele tabel, możesz skorzystać z mk-parallel-restore .
źródło
To wystarczy:
mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql
źródło
Zasugerowałem ci
AUTOCOMMIT=0
,UNIQUE_CHECKS=0
,FOREIGN_KEY_CHECKS=0
( i nie zapomnij cofnąć zmienia )mysql -u root -pPasss requests < mydb.sql
Powodzenia
źródło