Odpowiedzi:
Każda „żądana” sekwencja zamykania w MySQL (brak kill -9
) jest nieco wdzięczna , ponieważ trwające transakcje (w tabelach transakcyjnych) są wycofywane, ale oto kilka sposobów, aby ponowne uruchomienie było tak czyste, jak to możliwe.
Uwaga: jeśli zamykasz serwer w celu aktualizacji, nie korzystaj z tego procesu; zamiast tego postępuj zgodnie z procesem opisanym w tej odpowiedzi .
W przeciwnym razie, jeśli ponownie uruchamiasz serwer w inny sposób, aby zmienić globalną zmienną tylko do odczytu lub coś podobnego, oto wdzięczna ścieżka:
Najpierw włącz, innodb_fast_shutdown
jeśli jeszcze nie jest. Nie jest to bezpośrednio związane z wdziękiem zamknięcia, ale powinno przyspieszyć powrót serwera.
mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)
Następnie poinstruuj serwer, aby zamykał wszystkie otwarte tabele, gdy tylko odwołują się do nich obecnie uruchomione zapytania. Ten krok nie ma również nic wspólnego z płynnym zamykaniem, ale sprawi, że kolejny krok będzie przebiegał szybciej:
mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)
FLUSH TABLES
Oświadczenie (z opcjonalnym LOCAL
słów kluczowych, co pozwala uniknąć niepotrzebnego ale inaczej nieszkodliwe przypływ wszelkich niewolników) zablokuje a szybka wola nie wrócić aż wszystkie tabele mogą być zamknięte. Gdy każda tabela zostanie „opróżniona” (zamknięta), jeśli zapytanie odwołuje się następnie do tabeli, zostanie ona automatycznie ponownie otwarta, ale to w porządku. Na tym etapie osiągamy mniej pracy przy ostatnim kroku:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)
mysql>
Ta instrukcja opróżnia wszystkie tabele (stąd korzyść polegająca na tym, że niektóre z nich mniej przeszkadzają w poprzednim kroku) i uzyskuje globalną (tylko dla serwera) blokadę tylko do odczytu.
Nie możesz mieć globalnej blokady odczytu, dopóki nie zostanie wykonane każde aktualnie uruchomione zapytanie „zapisz” (tzn. Prawie wszystko oprócz SELECT
). Wysłanie żądania blokady pozwoli na zakończenie istniejących zapytań, ale nie pozwoli na uruchomienie nowych.
Twoje zapytanie nie powróci, dopóki nie przytrzymasz tej globalnej blokady, więc każde zapytanie, które jest w toku, gdy poprosisz o blokadę, może zakończyć się i wiesz, że zostały zakończone, ponieważ otrzymujesz monit z powrotem. Wszelkie kolejne zapytania, które próbują zapisać cokolwiek w dowolnej tabeli, po prostu utkną w miejscu, nie będą zmieniać danych, będą czekać w nieskończoność na blokadę, dopóki ...
UNLOCK TABLES;
)Oprzyj się pokusie zamknięcia tego.
mysql>
To pytanie o bezczynną konsolę blokuje globalną blokadę. Strać to, stracić zamek.
Z innego okna konsoli zrestartuj MySQL w normalny sposób, albo za pomocą skryptów startowych (np. Lokalny wariant service mysql.server restart
), albo mysqladmin shutdown
ręcznie, po którym nastąpi restart.
Krótko mówiąc, niektóre z najlepszych praktyk, które należy wziąć pod uwagę przed zamknięciem MySQL to:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, zabij je mysql> kill thread_id;
lub poczekaj, aż zakończą.mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;
i załaduj ją ponownie podczas uruchamiania,
# vi /etc/my.cnf
innodb_buffer_pool_load_at_startup = ON
aby rozgrzać pulę buforów.Następnie po potwierdzeniu poprzednich punktów możesz bezpiecznie ponownie uruchomić MySQL shell$ service mysql restart
Aby uzyskać więcej informacji, zobacz mój post Sprawdź je przed wyłączeniem MySQL!
innodb_fast_shutdown = 1
naprawdę zapewnia, że MySQL uruchamia się szybciej? Patrząc na dokumenty, wydaje się, że poprawia to szybkość zamykania (kosztem prędkości uruchamiania?).