Не могу запустить / остановить службу MySQL


28

Принятие веб-сервера Debian Etch с запущенным MySQL.

Я обычно запускаю, останавливаю и перезапускаю msyql используя:

/etc/init.d/mysql restart

По какой-то причине в этой настройке я получаю следующее:

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

Остановка сервера базы данных MySQL: сбой mysqld!

Процесс MySQL работает нормально:

:~# 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

Я уверен, что есть действительно простой способ сделать это, но я хочу понять, что происходит. Почему типичный способ не работает для меня?

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ как обновление:

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

Завершение работы mysqladmin работает, но мне все еще любопытно, почему не работают команды /etc/init.d/mysql.


Для меня проблема заключалась в том, что искали инсталляцию ручной работы /tmp/mysql.sockвместо /var/run/mysqld/mysqld.sock. Таким образом, сценарий сопровождающих Debian тихо выдавал ошибку. Вы просто должны исправить socket=в/etc/mysql/debian.cnf
Иван

Ответы:


25
mysqladmin shutdown

должно работать, чтобы выключить сервер.

Я вижу две вероятные возможности:

  1. MySQL имеет проблему и по какой-то причине отказывается закрываться.
  2. Предыдущий админ сделал что-то странное. Либо изменил скрипт init.d, либо вообще не стал использовать пакеты Debian для установки MySQL.

Что dpkg --list mysql\*говорит?

Что говорит /var/log/mysql.err? Или другие журналы mysql?

РЕДАКТИРОВАТЬ:

Так mysqladmin shutdownсработало?

В соответствии с этим установлен пакет mysql-server (mysql-server-5.0; пакет mysql-server, вероятно, просто заглушка). Таким образом, они могли установить над ним? Бег debsums mysql-server-5.0может рассказать вам больше. dpkg --listfiles mysql-server-5.0тоже могу помочь ...

Что на самом деле в /etc/init.d/mysql? Я не проверял эту конкретную версию пакета, но он должен попытаться использовать mysqladmin shutdown... Может быть, вам повезло, и они только сломали это ...


ура, добавил еще немного информации к посту.
Дерек Орган

Я подозреваю, что они не использовали пакеты Debian для установки mysql
Дерек Орган

кто-то использовал пакет Debian, по крайней мере, один раз. Возможно, они скомпилированы из исходного кода и перезаписали фактические файлы, или разбили его другим способом ...
freiheit

22

Почему это происходит

Это распространенная проблема, если вы выполняете импорт mysql и перезаписываете саму базу данных mysql, например, когда вы можете восстанавливать данные из резервной копии mysqldump -A.

Это хорошая вещь: вы, вероятно, хотите сделать резервную копию всех ваших пользователей mysql, разрешений и т. Д. - но это может нанести ущерб таким вещам, как пользователь debian-sys-maint, используемый для чистого отключения mysql.

Хотя эта новая база данных, возможно, изменит как пароль root, так и пароль debian-sys-maint, конечно, она не изменит автоматически ожидаемый пароль debian-sys-maint в /etc/mysql/debian.cnf. На самом деле, если вы не сделали резервную копию этого файла, вы, вероятно, даже не знаете, что это за пароль!

Сброс пароля root для mysql (необязательно)

Обо всем по порядку. Если пароль root для mysql был разным на старом и новом серверах, вы можете использовать mysqladmin, чтобы исправить это:

mysql -p -u root password 'newpassword'

Тем не менее, когда вы устанавливаете apt-get mysql-server, он, вероятно, запросил у вас новый пароль root для mysql, и вы, вероятно, использовали тот же пароль, который использовали ранее.

Исправьте пароль Debian Sys Maint.

Итак, теперь ищите пароль Debian sys maint, который Debian создал для вас, когда вы установили его на новом сервере. (Вам нужен sudo, потому что это должен быть файл с высокой степенью защиты.)

sudo cat /etc/mysql/debian.cnf

Теперь войдите в mysql, используя пароль root, который вы установили выше:

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

Сбросьте пароль для пользователя debian-sys-maint и не забудьте сбросить привилегии:

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

Проверьте, чтобы убедиться, что это работает:

sudo /etc/init.d/mysql restart

Быстрая подсказка

Если вам когда-нибудь понадобится сбросить пароль root для сервера без необходимости выключения сервера, эта учетная запись пользователя имеет полномочия сделать это - просто скопируйте файл debian.cnf и войдите в систему с этим пользователем. NB Защитите эту учетную запись пользователя, как root.


2
Спасибо, Джеймисон, это потенциально спасло мне часы работы.
slhck

1
Потрясающе и полностью приветствуется! Мне приходилось обращаться к этому файлу чаще, чем я хотел бы признать;)
Джеймисон Беккер,

1
Блестящий ответ. Импорт дампа базы данных (а вместе с ним и пароля root) был именно той причиной в моем случае. Единственное отличие состоит в том, что в моем файле debian.cnf вместо «debian-sys-maint» используется «root» пользователь mysql. Я просто вставил пароль root в debian.cnf и теперь могу управлять mysql через "service mysql <command>".
Томаш П. Шинальски

6

Еще 2 подсказки:

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

Это покажет вам команды, выполняемые сценарием инициализации.

установите пакеты debsums, и вы можете проверить, какие пакеты были изменены (проверка также доступна для RPM, но IMHO работает лучше).


1
У меня была та же проблема, что и у OP, и выполнение предложенной команды "Access denied for user 'debian-sys-maint'@'localhost'"было абсолютно правильным: моей базе данных mysql еще не назначены какие-либо разрешения, поэтому mysql stopу нее не было разрешений на отключение в самой базе данных. Мануал mysqladmin shutdownработал отлично.
Джевон

5
pkill mysql

определенно будет работать


Это то, что мой вопрос решил «остановка сервера базы данных mysql завершилась неудачно». Вы должны получить миллион очков!
Ханс Вассинк,

2

Предполагая, что пакет несколько странный, проблема может быть в файле pid. Я подозреваю, что новые пакеты или скомпилированная установка не создали / var / run / mysql / или что-то стандартное в Debian для файла pid, который нужно записать, или сценарий init ищет файл mysqld.pid в другом месте. Если вы можете исправить несоответствие файла init / pid, вероятно, все должно работать.


Сценарий инициализации не использует файл pid для остановки сервера.
theotherreceive

2

Скрипт отключения mysql использует пользователя debian-sys-maint для запуска «отключения mysqladmin», считывая пароль для пользователя из /etc/mysql/debian.cnf. Вы должны проверить, что этот файл существует, и что вы можете запустить mysqladmin shutdown от имени этого пользователя.


1

Технически вы можете закончить это:

pkill -9 mysqld

Но вы можете потерять данные?

Возможно, вам лучше спросить кого-нибудь на http://www.serverfault.com


Я знаю, что делаю это таким образом, но не понимаю, что я хочу делать регулярно.
Дерек Орган,

1

Использование «pkill mysql» также может привести к потере ваших данных, особенно если вызывается как «pkill -9» :(

Я также рекомендовал бы использовать sh-x, чтобы увидеть, в чем может быть проблема со скриптом инициализации, и вы также можете заглянуть в журналы ошибок для MySQL (/ var / log / mysql или / var / lib / mysql, в зависимости от конфигурации), чтобы увидеть, не застрял ли он в действительно долго выполняющемся запросе или что-то в этом роде и, таким образом, пока не желает завершать работу изящно.


1

Чтобы прокомментировать ваш вопрос, я напишу полный ответ:

Проблема заключается в том, что сокет по умолчанию имеет /tmp/mysql.sockисходный код MySQL и /var/run/mysqld/mysqld.sockдвоичные файлы Debian.

Решение состоит в том, чтобы установить путь сокета в /etc/mysql/debian.cnf, пути обеспечения хорошего socket=. Или сохраняя его, но затем измените его в /etc/mysql/my.cnf.

Вот как я это выяснил: /etc/init.d/mysqlкогда появляется сообщение «fail», эта строка называется:

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

Это указало мне на то $MYADMIN ping, что есть mysqladmin --defaults-file=/etc/mysql/debian.cnf ping. Выполнение этой самой команды заканчивается на:

/ usr / bin / mysqladmin: не удалось подключиться к серверу на локальном хосте

ошибка: «Не удается подключиться к локальному серверу MySQL через сокет« /var/run/mysqld/mysqld.sock '(2)'

Убедитесь, что mysqld запущен и что сокет: /var/run/mysqld/mysqld.sock существует!

Я посмотрел /etc/mysql/debian.cnfи обнаружил, что это плохая розетка.


0

используйте следующую команду:

$ mysqladmin shutdown

это должно быть доступно в каталоге / usr / bin в вашем случае.


0

вам нужно быть суперпользователем, чтобы начать останавливать mysql (и большинство других сервисов) в Debian.

Не уверен, если вы уже или нет ... если нет, вам нужно сделать один из

  • войдите как root
  • поставьте sudo перед командой /etc/init.d/mysql restart (она спросит ваш пароль, и вам нужно будет войти в группу sudoers)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.