Nie można uruchomić / zatrzymać usługi mysql

28

Przejęcie serwera WWW Debian Etch przy uruchomionym MySQL.

Zwykle uruchamiam, zatrzymuję i restartuję msyql używając:

/etc/init.d/mysql restart

Z jakiegoś powodu w tej konfiguracji otrzymuję następujące informacje:

: ~ # /etc/init.d/mysql stop

Zatrzymywanie serwera bazy danych MySQL: mysqld nie powiodło się!

Proces mysql działa poprawnie:

:~# ps aux | grep mysql 
root      2045  0.0  0.1   2676  1332 ?        S    Jun25   0:00 /bin/sh /usr/bin/mysqld_safe
mysql     2082  0.6 10.7 752544 111188 ?       Sl   Jun25  18:49 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock
root      2083  0.0  0.0   1568   504 ?        S    Jun25   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root     11063  0.0  0.0   2856   716 pts/0    S+   17:29   0:00 grep mysql

Jestem pewien, że jest na to naprawdę łatwy sposób, ale chcę też zrozumieć, co się dzieje. Dlaczego typowy sposób nie działa dla mnie?

EDYTUJ AKTUALIZACJĘ jako aktualizację:

JBRLSVR001:/var/log/mysql# mysqladmin shutdown
JBRLSVR001:/var/log/mysql# dpkg --list mysql\*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed 
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name                                         Version                                      Description
 +++-============================================-============================================-========================================================================================================
un  mysql-client                                 <none>                                       (no description available)
un  mysql-client-4.1                             <none>                                       (no description available)
ii  mysql-client-5.0                             5.0.32-7etch8                                mysql database client binaries
ii  mysql-common                                 5.0.32-7etch8                                mysql database common files (e.g. /etc/mysql /my.cnf)
un  mysql-common-4.1                             <none>                                       (no description available)
ii  mysql-server                                 5.0.32-7etch8                                mysql database server (meta package depending on the latest version)
un  mysql-server-4.1                             <none>                                       (no description available)
ii  mysql-server-5.0                             5.0.32-7etch8                                mysql database server binaries

zamknięcie mysqladmin działa, ale nadal jestem ciekawy, dlaczego polecenia /etc/init.d/mysql nie działają.

Derek Organ
źródło
Dla mnie problemem było to, że /tmp/mysql.sockzamiast tego szukała ręcznej instalacji /var/run/mysqld/mysqld.sock. Tak więc skrypt napisany przez opiekunów Debiana cicho wydawał błąd. Musisz tylko naprawić socket=w/etc/mysql/debian.cnf
Yvan

Odpowiedzi:

25
mysqladmin shutdown

powinien działać, aby zamknąć serwer.

Widzę dwie prawdopodobne możliwości:

  1. MySQL ma problem i z jakiegoś powodu odmawia zamknięcia.
  2. Poprzedni administrator zrobił coś dziwnego. Zmodyfikowałem skrypt init.d lub nie zawracałem sobie głowy używaniem pakietów Debiana w celu instalacji MySQL.

Co dpkg --list mysql\*mówi

Co mówi /var/log/mysql.err? Lub inne dzienniki MySQL?

EDYTOWAĆ:

Tak mysqladmin shutdowndziałało?

Zgodnie z tym pakiet mysql-server jest zainstalowany (mysql-server-5.0; pakiet mysql-server to prawdopodobnie tylko skrótowy kod). Więc może zainstalowali nad nim? Bieganie debsums mysql-server-5.0może ci powiedzieć więcej. dpkg --listfiles mysql-server-5.0też może pomóc ...

Co tak naprawdę znajduje się w /etc/init.d/mysql? Nie sprawdziłem tej konkretnej wersji pakietu, ale powinna spróbować użyć mysqladmin shutdown... Może masz szczęście i tylko złamali ...

freiheit
źródło
na zdrowie, dodał więcej informacji do postu.
Derek Organ
Podejrzewam, że nie użyli pakietów Debiana do zainstalowania mysql
Derek Organ
przynajmniej ktoś użył pakietu Debian. Mogli skompilować ze źródła i nadpisać rzeczywiste pliki lub złamać je w inny sposób ...
freiheit
22

Dlaczego tak się dzieje

Jest to powszechny problem podczas importowania mysql i zastępowania samej bazy danych mysql, na przykład podczas przywracania z kopii zapasowej mysqldump -A.

To dobra rzecz: prawdopodobnie chcesz wykonać kopię zapasową wszystkich użytkowników mysql, uprawnień itp. - ale może to siać spustoszenie w rzeczach takich jak użytkownik debian-sys-maint używany do czystego zamykania mysql.

Chociaż ta nowa baza danych prawdopodobnie zmieni zarówno hasło roota, jak i hasło debian-sys-maint, oczywiście nie zmieni automatycznie oczekiwanego hasła debian-sys-maint w /etc/mysql/debian.cnf. W rzeczywistości, chyba że utworzyłeś kopię zapasową tego pliku, prawdopodobnie nawet nie wiesz, jakie jest to hasło!

Resetowanie hasła root mysql (opcjonalnie)

Najpierw najważniejsze. Jeśli hasło roota mysql było inne między starymi i nowymi serwerami, możesz użyć mysqladmin, aby je naprawić:

mysql -p -u root password 'newpassword'

Jednak gdy apt-get zainstaluje serwer mysql, prawdopodobnie poprosił cię o nowe hasło roota mysql i prawdopodobnie użyłeś tego samego, którego używałeś wcześniej.

Napraw hasło do systemu Debian sys Maintenance.

Teraz spójrz teraz na hasło sys debian sys, które debian utworzył dla ciebie, gdy zainstalowałeś je na nowym serwerze. (Potrzebujesz sudo, ponieważ powinien to być plik wysoce chroniony).

sudo cat /etc/mysql/debian.cnf

Teraz zaloguj się do mysql przy użyciu hasła root ustawionego powyżej:

mysql -p -u root   # use your new password when prompted

Zresetuj hasło użytkownika debian-sys-maint i nie zapomnij opróżnić uprawnień:

>  SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('samepassword');
>  FLUSH PRIVILEGES;
>  QUIT

Sprawdź, czy działa:

sudo /etc/init.d/mysql restart

Szybka wskazówka

Jeśli kiedykolwiek będziesz musiał zresetować hasło roota do serwera bez konieczności wyłączania serwera, to konto użytkownika ma do tego uprawnienia - po prostu cat plik debian.cnf i zaloguj się z tym użytkownikiem. NB Chroń to konto użytkownika podobnie jak root.

Jamieson Becker
źródło
2
Dziękuję, Jamieson, to potencjalnie pozwoliło mi zaoszczędzić wiele godzin pracy.
slhck
1
Niesamowite i całkowicie mile widziane! Musiałem wracać do tego pliku częściej, niż chciałbym przyznać;)
Jamieson Becker,
1
Genialna odpowiedź. Zaimportowanie zrzutu bazy danych (a wraz z nim hasła roota) było w moim przypadku dokładnie przyczyną. Jedyna różnica polega na tym, że mój plik debian.cnf używał użytkownika mysql „root” zamiast „debian-sys-maint”. Po prostu wpisuję hasło roota w debian.cnf i teraz mogę kontrolować mysql poprzez „service mysql <polecenie>”.
Tomasz P. Szynalski
6

2 dodatkowe wskazówki:

sh -x /etc/init.d/mysql restart

Spowoduje to wyświetlenie poleceń wykonanych przez skrypt inicjujący.

zainstaluj pakiety sumy i możesz przetestować, które pakiety zostały zmodyfikowane (weryfikacja jest również dostępna dla RPM, ale IMHO działa lepiej).

elcuco
źródło
1
Miałem ten sam problem co OP i uruchomienie tego polecenia zasugerowało "Access denied for user 'debian-sys-maint'@'localhost'", co było absolutnie poprawne: moja baza danych mysql nie przypisała jeszcze żadnych uprawnień, więc mysql stopnie miała uprawnień w samej bazie danych do zamknięcia. Podręcznik mysqladmin shutdowndziałał idealnie.
jevon,
5
pkill mysql

na pewno zadziała

Jonathan
źródło
Właśnie dlatego rozwiązałem moje pytanie: „zatrzymanie serwera mysql bazy danych mysqld nie powiodło się”. Powinieneś zdobyć milion punktów!
Hans Wassink,
2

Zakładając, że pakiet jest nieco dziwny, problemem może być plik pid. Podejrzewam, że nowe pakiety lub skompilowana instalacja nie utworzyły / var / run / mysql / ani czegokolwiek, co jest standardem w Debianie dla pliku pid, który ma zostać zapisany, lub skrypt inicjujący szuka pliku mysqld.pid w innym miejscu. Jeśli możesz naprawić niezgodność pliku init / pid, prawdopodobnie powinno działać.

kashani
źródło
Skrypt inicjujący nie używa pliku pid do zatrzymania serwera.
theotherreceive
2

Skrypt mysql shutdown używa użytkownika debian-sys-maint do uruchomienia „mysqladmin shutdown”, odczytując hasło użytkownika z /etc/mysql/debian.cnf. Powinieneś sprawdzić, czy ten plik istnieje i czy możesz uruchomić zamknięcie mysqladmin jako ten użytkownik.

inne
źródło
1

Możesz technicznie zakończyć to:

pkill -9 mysqld

Ale możesz stracić dane?

Lepiej zapytaj kogoś na http://www.serverfault.com

John Kurlak
źródło
Wiem, że robię to w ten sposób, ale nie zmieniam tego, co regularnie robię.
Derek Organ
1

Użycie „pkill mysql” również prawdopodobnie spowoduje utratę danych, zwłaszcza jeśli zostanie wywołane jako „pkill -9” :(

Polecam również użycie „sh -x”, aby zobaczyć, jaki może być problem ze skryptem inicjującym, a także możesz zajrzeć do dzienników błędów MySQL (/ var / log / mysql lub / var / lib / mysql, w zależności od konfiguracji), aby sprawdzić, czy utknął na naprawdę długo działającym zapytaniu lub czymś, a tym samym nie chce jeszcze zejść z wdziękiem.

nixgeek
źródło
1

Aby śledzić komentarz do twojego pytania, wypiszę pełną odpowiedź:

Problem polega na tym, że domyślnym gniazdem jest /tmp/mysql.sockźródło MySQL i /var/run/mysqld/mysqld.sockpliki binarne Debiana.

Rozwiązaniem jest ustalenie ścieżki gniazdo w /etc/mysql/debian.cnf, dostarczając dobra socket=. Lub zachowując go, ale następnie zmień ten w /etc/mysql/my.cnf.

Oto, jak się o tym dowiedziałem: /etc/init.d/mysqlkiedy pojawia się komunikat „nieudane”, masz następującą linię:

echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug

To mnie wskazało $MYADMIN ping, to znaczy mysqladmin --defaults-file=/etc/mysql/debian.cnf ping. Uruchomienie tego polecenia kończy się na:

/ usr / bin / mysqladmin: nie udało się połączyć z serwerem na 'localhost'

błąd: „Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo” /var/run/mysqld/mysqld.sock '(2) ”

Sprawdź, czy mysqld działa i czy gniazdo: „/var/run/mysqld/mysqld.sock” istnieje!

Więc rzuciłem okiem /etc/mysql/debian.cnfi odkryłem, że to było złe gniazdo.

Yvan
źródło
0

użyj następującego polecenia:

$ mysqladmin zamknięcie

powinno to być dostępne w twoim katalogu / usr / bin.

Masood Syed
źródło
0

musisz być superużytkownikiem, aby rozpocząć zatrzymywanie mysql (i większości innych usług) na Debianie.

Nie jestem pewien, czy jesteś już, czy nie ... jeśli nie, musisz zrobić jedną z nich

  • zaloguj się jako root
  • umieść sudo przed komendą /etc/init.d/mysql restart (poprosi cię o hasło i musisz być w grupie sudoers)
benlumley
źródło