Najszybszym sposobem na zamknięcie mysql, kiedy to robi, jest po prostu uruchomienie
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Oto dlaczego:
Plik usługi mysql ( /etc/init.d/mysql
) zależy od obecności pliku gniazda. Mówiąc historycznie, sięgając wstecz do MySQL 4.0, plik gniazda czasami znika w niewytłumaczalny sposób. Utrudnia to normalne service mysql stop
działanie.
Nie wystarczy powiedzieć
mysqladmin -uroot -p -h127.0.0.1 shutdown
ponieważ trasa mysqld woli użytkownik najbliższych jak root@127.0.0.1
na root@localhost
razie TCP / IP nie jest jawnie włączone. Domyślnie mysqld wybiera najmniejszą ścieżkę oporności i łączy root@127.0.0.1
się root@localhost
za pomocą pliku gniazda. Jednak jeśli nie ma pliku gniazda, root@localhost
nigdy się nie łączy.
Nawet dokumentacja MySQL na mysqladmin mówi:
Jeśli wykonasz zamknięcie mysqladmin podczas łączenia się z lokalnym serwerem przy użyciu pliku gniazda Unix, mysqladmin czeka na usunięcie pliku identyfikatora procesu serwera, aby upewnić się, że serwer zatrzymał się poprawnie.
Dlatego konieczne jest włączenie protokołu TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
W dniu 30 września 2011 r. Napisałem własną wersję skryptu o mysqld_multi
nazwie mysqlservice
(Zobacz mój post: Uruchamianie wielu instancji na tym samym hoście ). Służy jako wirtualny silnik do łączenia się z mysqld z różnych portów. Musisz tylko przynieść własne my.cnf
z niestandardowymi parametrami. W tym skrypcie uruchamiam zamknięcia w następujący sposób:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Ale co to jest ${MYSQLD_STOP}
?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Proszę zauważyć, że używam 127.0.0.1
i wyraźny port. W ten sposób nie polegam na pliku gniazda.
Zawsze używałem mysqladmin --protocol=tcp shtudown
jako właściwej alternatywy dla zamykania mysql, jeśli service mysql stop
zawiesza się. Robi kill -9
on mysqld
i mysqld_safe
powinien ostatni ostatni z ostatnich ośrodków. (Tak, powiedziałem ostatnie trzy razy).
Wiele razy mysqld usunął mysql.sock bez ostrzeżenia. Inne osoby również miały ten problem przez lata:
EPILOG
Sekret jest taki, jak powiedziałem: Połącz się z mysql za pomocą mysqladmin przez TCP / IP ( --protocol=tcp
) i wydaj shutdown
. Musi to działać, ponieważ przywilej wyłączania jest mysql.user
wyłącznym celem uwierzytelnionych wyłączeń. To zaoszczędziło mi kilka dni roboczych, kiedy mogłem zdalnie zamknąć komputer z systemem Windows podczas zamykania mysqld na serwerze Linux.
AKTUALIZACJA 2013-03-06 22:48 EST
Jeśli martwisz się o to, co dzieje się podczas zamykania, istnieje sposób na manipulowanie czasem zamykania i sposobem, w jaki dane są opróżniane na dysk, szczególnie jeśli masz dużo danych InnoDB w puli buforów
SUGESTIA # 1
Jeśli masz dużo brudnych stron, możesz obniżyć innodb_max_dirty_pages_pct do 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Ustaw to około 15-30 minut przed wyłączeniem. To da mysqld najmniejszą możliwą ilość brudnych stron do zapisania na dysku.
SUGESTIA # 2
Domyślnie innodb_fast_shutdown wynosi 1. Istnieją trzy wartości dla tej opcji
- 0: InnoDB wykonuje powolne zamykanie, pełne czyszczenie i bufor wstawiania łączy się przed zamknięciem.
- 1: InnoDB pomija te operacje podczas zamykania, proces znany jako szybkie zamykanie.
- 2: InnoDB opróżnia logi i zamyka się na zimno, jakby MySQL się zawiesił; żadne zatwierdzone transakcje nie zostaną utracone, ale operacja odzyskiwania po awarii powoduje, że następne uruchomienie trwa dłużej.
Dokumentacja mówi dalej:
Powolne zamykanie może potrwać minuty, a nawet godziny w skrajnych przypadkach, gdy znaczne ilości danych są nadal buforowane. Użyj techniki powolnego zamykania przed aktualizacją lub obniżeniem wersji między głównymi wersjami MySQL, aby wszystkie pliki danych były w pełni przygotowane na wypadek, gdyby proces aktualizacji zaktualizował format pliku.
Użyj innodb_fast_shutdown = 2 w sytuacjach awaryjnych lub rozwiązywania problemów, aby uzyskać absolutnie najszybsze zamknięcie, jeśli dane są narażone na uszkodzenie.
Domyślne ustawienia dla innodb_max_dirty_pages_pct i innodb_fast_shutdown powinny być w większości przypadków w porządku.
tmpwatch
usuwa go wraz ze wszystkim innym/tmp
, co ma atime starszy niż skonfigurowany próg.