Захват веб-сервера 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
должен работать, чтобы выключить сервер.
Я вижу две вероятные возможности:
Что значит 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.
Не уверен, что вы уже или нет ... если нет, вам нужно сделать одно из