Назад | Перейти на главную страницу

Не удается запустить / остановить службу mysql

Захват веб-сервера Debian Etch с запущенным MySQL.

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

/etc/init.d/mysql перезапуск

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

: ~ # /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 shutdown действительно работает, но мне все еще интересно, почему не работают команды /etc/init.d/mysql.

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 ... Может тебе повезло и они сломали только это ...

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

Это обычная проблема, если вы выполняете импорт 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'

Однако, когда вы установили mysql-server с помощью apt-get, он, вероятно, запросил у вас новый пароль 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 и войдите в систему с этим пользователем. N.B. Защитите эту учетную запись пользователя так же, как root.

pkill mysql

обязательно будет работать

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

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

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

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

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

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

Технически вы можете закончить это следующим образом:

pkill -9 mysqld

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

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

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

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

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

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

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

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

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 и выяснил, что это была плохая розетка.

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

$ mysqladmin выключение

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

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

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

  • войти как root
  • поместите sudo перед командой /etc/init.d/mysql restart (она попросит вас ввести пароль, и вам нужно будет быть в группе sudoers)