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


28

Переймання веб-сервера Debian Etch із запуском MySQL.

Зазвичай я запускаю, зупиняю і перезавантажую msyql, використовуючи:

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

Чомусь на цій настройці я отримую наступне:

: ~ # /etc/init.d/mysql зупинка

Зупинка сервера баз даних 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-сервера (mysql-server-5.0; пакет mysql-сервера, ймовірно, лише заглушка). То вони, можливо, встановили над ним? Біг debsums mysql-server-5.0може сказати вам більше. dpkg --listfiles mysql-server-5.0може також допомогти ...

Що насправді в /etc/init.d/mysql? Я не перевіряв цю конкретну версію пакета, але це слід спробувати використати mysqladmin shutdown... Можливо, вам пощастило, і вони лише зламали це ...


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

Я підозрюю, що вони не використовували пакунки Debian для встановлення mysql
Derek Organ

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

22

Чому це відбувається

Це поширена проблема, якщо ви здійснюєте імпорт mysql і перезаписуєте саму базу даних mysql, наприклад, коли ви можете відновити з резервної копії mysqldump -A.

Це гарна річ: ви, мабуть, хочете створити резервну копію всіх користувачів mysql, дозволів тощо - але це може спричинити хаос із такими речами, як користувач debian-sys-maint, який використовується для чистого відключення mysql.

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

Скидання пароля root mysql (необов’язково)

Насамперед. Якщо пароль root mysql відрізнявся між старим та новим серверами, ви можете використовувати mysqladmin для його виправлення:

mysql -p -u root password 'newpassword'

Однак, коли ви apt-get install mysql-сервер, він, ймовірно, запропонував вам новий пароль root mysql, і ви, ймовірно, використовували той самий, який ви використовували раніше.

Виправте пароль maint debian sys.

Тому тепер знайдіть пароль debian sys maint, який debian створив для вас під час встановлення його на новому сервері. (Вам потрібен sudo, оскільки це повинен бути файл, який дуже захищений.)

sudo cat /etc/mysql/debian.cnf

Тепер увійдіть до mysql за допомогою кореневого пароля, який ви встановили вище:

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

Швидкий підказок

Якщо вам коли-небудь потрібно буде скинути кореневий пароль для сервера, не збиваючи сервер, цей обліковий запис користувача має повноваження робити це - просто введіть файл debian.cnf і ввійдіть у систему з цим користувачем. NB Захистіть цей обліковий запис користувача так само, як root.


2
Дякую, Джеймісон, це потенційно врятувало мені години роботи.
slhck

1
Дивовижно, і всім ласкаво просимо! Мені довелося потрапляти до цього файлу частіше, ніж хотілося б визнати;)
Джеймісон Бекер

1
Блискуча відповідь. Імпорт дампа бази даних (а з ним і кореневий пароль) був саме причиною в моєму випадку. Різниця полягає лише в тому, що мій файл debian.cnf використовував користувача mysql "root" замість "debian-sys-maint". Я просто ввожу корінь пароля в debian.cnf і тепер я можу керувати mysql через "сервіс mysql <command>".
Томаш П. Шинальський

6

Ще 2 підказки:

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

Це покаже вам команди, виконані сценарієм init.

встановіть debsums пакету, і ви можете перевірити, які пакунки були змінені (перевірте, чи доступний також RPM, але IMHO працює краще).


1
У мене була така ж проблема, що і в ОП, і запуск цієї команди запропоновано "Access denied for user 'debian-sys-maint'@'localhost'", що було абсолютно коректно: моя база даних mysql ще не призначила жодних дозволів, тому mysql stopне було дозволів у самій базі даних вимикатись. Посібник mysqladmin shutdownпрацював чудово.
jevon

5
pkill mysql

обов'язково спрацює


Це те, що вирішило моє питання "не вдалося зупинити сервер бази даних mysql mysqld". Ви повинні отримати мільйон очок!
Ганс Вассінк

2

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


Скрипт init не використовує pid-файл для зупинки сервера.
theterreceive

2

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


1

Ви можете технічно закінчити це:

pkill -9 mysqld

Але ви можете втратити дані?

Вам може бути краще запитати когось за адресою http://www.serverfault.com


Я знаю, що роблю це саме так, але дефолію не те, що я хочу робити регулярно.
Орган Дерека

1

Використання "pkill mysql" також, ймовірно, втратить ваші дані, особливо якщо їх буде використано як "pkill -9" :(

Я також рекомендую використовувати "sh -x", щоб побачити проблему зі скриптом init, і ви також можете заглянути в журнали помилок для 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коли там з'явилося повідомлення «не вдалося», у вас з'явився цей рядок:

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: не вдалося підключитись до сервера на "localhost"

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

Перевірте, чи виконується mysqld і що сокет: '/var/run/mysqld/mysqld.sock' існує!

Тож я подивився /etc/mysql/debian.cnfі дізнався, що це погана розетка.


0

використовувати таку команду:

$ mysqladmin вимкнення

це має бути доступним у каталозі / usr / bin у вашому випадку.


0

вам потрібно бути суперкористувачем, щоб почати зупиняти mysql (та більшість інших сервісів) на debian.

Не впевнений, ви вже чи ні ... якщо ні, то вам потрібно зробити один із

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