No se puede iniciar / detener el servicio mysql

28

Asumir un servidor web Debian Etch con MySQL en ejecución.

Normalmente inicio, detengo y reinicio msyql usando:

/etc/init.d/mysql restart

Por alguna razón en esta configuración obtengo lo siguiente:

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

Detención del servidor de bases de datos MySQL: ¡falló mysqld!

El proceso mysql está funcionando bien:

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

Estoy seguro de que hay una forma realmente fácil de hacerlo, pero también quiero entender lo que está sucediendo. ¿Por qué la forma típica no funciona para mí?

EDITAR ACTUALIZACIÓN como una actualización:

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 funciona pero todavía tengo curiosidad por qué los comandos /etc/init.d/mysql no funcionan.

Derek Organ
fuente
Para mí, el problema era que la instalación hecha a mano buscaba en /tmp/mysql.socklugar de /var/run/mysqld/mysqld.sock. Entonces, el script de los mantenedores de Debian emitía un error, en silencio. Sólo tienes que fijar socket=en el/etc/mysql/debian.cnf
Yvan

Respuestas:

25
mysqladmin shutdown

debería funcionar para apagar el servidor.

Veo dos posibilidades probables:

  1. MySQL tiene un problema y se niega a cerrar por alguna razón.
  2. El administrador anterior hizo algo extraño. Modificó el script init.d o no se molestó en usar los paquetes de Debian para instalar MySQL.

Que dpkg --list mysql\*dice

¿Qué dice /var/log/mysql.err? ¿O los otros registros de mysql?

EDITAR:

Así mysqladmin shutdowntrabajado?

De acuerdo con eso, el paquete mysql-server está instalado (mysql-server-5.0; el paquete mysql-server es probablemente solo un trozo). Entonces, ¿pueden haberse instalado sobre él? Correr debsums mysql-server-5.0podría decirte más. dpkg --listfiles mysql-server-5.0también podría ayudar ...

¿Qué hay realmente en /etc/init.d/mysql? No he comprobado esa versión específica del paquete, pero debería intentar usar mysqladmin shutdown... Tal vez tengas suerte y solo rompieron eso ...

freiheit
fuente
aplausos, agregó más información a la publicación.
Derek Organ
Sospecho que no usaron los paquetes de Debian para instalar mysql
Derek Organ
alguien usó un paquete Debian una vez, al menos. Es posible que hayan compilado desde el código fuente y sobrescrito los archivos reales, o se rompió de alguna otra forma ...
Freiheit
22

¿Por qué está pasando esto?

Este es un problema común si realiza una importación de mysql y sobrescribe la base de datos mysql, como cuando podría estar restaurando desde una copia de seguridad mysqldump -A.

Esto es algo bueno: probablemente desee hacer una copia de seguridad de todos sus usuarios, permisos, etc. de mysql, pero puede causar estragos en cosas como el usuario debian-sys-maint utilizado para cerrar mysql limpiamente.

Aunque esta nueva base de datos posiblemente cambiará tanto la contraseña de root como la contraseña de debian-sys-maint, por supuesto, no cambiará automáticamente la contraseña esperada de debian-sys-maint en /etc/mysql/debian.cnf. De hecho, a menos que también haya hecho una copia de seguridad de ese archivo, ¡probablemente ya ni siquiera sepa cuál es esa contraseña!

Restablecer la contraseña de root de mysql (opcional)

Lo primero es lo primero. Si la contraseña de root de mysql era diferente entre los servidores antiguos y nuevos, puede usar mysqladmin para solucionarlo:

mysql -p -u root password 'newpassword'

Sin embargo, cuando instala mysql-server, es probable que le solicite la nueva contraseña de root de mysql y probablemente haya utilizado la misma que usaba anteriormente.

Arregle la contraseña de mantenimiento del sistema Debian.

Así que ahora busque la contraseña de debian sys maint que debian creó para usted cuando la instaló en el nuevo servidor. (Necesita sudo porque este debería ser un archivo altamente protegido).

sudo cat /etc/mysql/debian.cnf

Ahora, inicie sesión en mysql usando la contraseña de root que configuró anteriormente:

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

Restablezca la contraseña para el usuario debian-sys-maint y no olvide eliminar los privilegios:

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

Prueba para asegurarte de que funciona:

sudo /etc/init.d/mysql restart

Consejo rapido

Si alguna vez necesita restablecer la contraseña de root para el servidor sin tener que derribar el servidor, esta cuenta de usuario tiene la autoridad para hacerlo, solo tome el archivo debian.cnf e inicie sesión con ese usuario. Nota: proteja esta cuenta de usuario como root.

Jamieson Becker
fuente
2
Gracias, Jamieson, esto potencialmente me ahorró horas de trabajo.
slhck
1
Impresionante, y totalmente bienvenido! He tenido que recurrir a ese archivo más de lo que me gustaría admitir;)
Jamieson Becker
1
Brillante respuesta. Importar un volcado de base de datos (y con él, la contraseña de root) fue exactamente la razón en mi caso. La única diferencia es que mi archivo debian.cnf utilizaba el usuario "root" de mysql en lugar de "debian-sys-maint". Simplemente puse la contraseña de root en debian.cnf y ahora puedo controlar mysql a través de "service mysql <command>".
Tomasz P. Szynalski
6

2 pistas más:

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

Esto le mostrará los comandos ejecutados por el guión de inicio.

instale los debsums de paquetes y puede probar qué paquetes se modificaron (verificar también está disponible para RPM, pero en mi humilde opinión funciona mejor).

elcuco
fuente
1
Tuve el mismo problema que OP y la ejecución de este comando sugirió "Access denied for user 'debian-sys-maint'@'localhost'", lo cual era absolutamente correcto: mi base de datos mysql aún no había asignado ningún permiso, por mysql stoplo que no tenía los permisos en la base de datos para cerrar. Un manual mysqladmin shutdownfuncionó perfectamente.
jevon
5
pkill mysql

definitivamente funcionará

Jonathan
fuente
Esto es lo que resolvió mi pregunta "al detener el servidor de base de datos mysql mysqld falló" ¡Deberías obtener un millón de puntos!
Hans Wassink
2

Asumiendo que el paquete es algo extraño, el problema podría ser el archivo pid. Sospecho que los nuevos paquetes o la instalación compilada no crearon / var / run / mysql / o lo que sea estándar en Debian para que se escriba el archivo pid o el script de inicio busque el archivo mysqld.pid en otro lugar. Si puede solucionar el desajuste del archivo init / pid, las cosas probablemente deberían funcionar.

kashani
fuente
El script de inicio no utiliza el archivo pid para detener el servidor.
theotherrecibir
2

El script de cierre de mysql utiliza el usuario debian-sys-maint para ejecutar 'cierre de mysqladmin', leyendo la contraseña para el usuario en /etc/mysql/debian.cnf. Debe verificar que este archivo existe y que puede ejecutar el apagado de mysqladmin como este usuario.

el otro recibir
fuente
1

Técnicamente podría terminar con:

pkill -9 mysqld

¿Pero podrías perder datos?

Puede que sea mejor preguntarle a alguien en http://www.serverfault.com

John Kurlak
fuente
Soy consciente de hacerlo de esa manera, pero definitivamente no es lo que estoy buscando hacer regularmente.
Derek Organ
1

El uso de "pkill mysql" también probablemente perderá sus datos, particularmente si se invoca como "pkill -9" :(

También recomendaría usar 'sh -x' para ver cuál podría ser el problema con el script de inicio, y también puede echar un vistazo a los registros de errores de MySQL (/ var / log / mysql o / var / lib / mysql, dependiendo de la configuración) para ver si está atascado en una consulta de ejecución muy larga o algo y, por lo tanto, no está dispuesto a abandonar con gracia todavía.

nixgeek
fuente
1

Para seguir el comentario sobre su pregunta, escribiré una respuesta completa:

El problema es que el socket predeterminado es /tmp/mysql.sockcon la fuente MySQL y /var/run/mysqld/mysqld.sockcon los binarios de Debian.

La solución es fijar la trayectoria de socket en /etc/mysql/debian.cnf, proporcionando el bien socket=. O manteniéndolo, pero luego cambia el que está adentro /etc/mysql/my.cnf.

Así es como descubrí esto: /etc/init.d/mysqlcuando aparece el mensaje "fallido", tiene esta línea llamada:

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

Esto me señaló $MYADMIN ping, que es mysqladmin --defaults-file=/etc/mysql/debian.cnf ping. Ejecutar este mismo comando termina en:

/ usr / bin / mysqladmin: falló la conexión al servidor en 'localhost'

error: 'No se puede conectar al servidor MySQL local a través del socket' /var/run/mysqld/mysqld.sock '(2)'

¡Compruebe que mysqld se está ejecutando y que el socket: '/var/run/mysqld/mysqld.sock' existe!

Así que eché un vistazo /etc/mysql/debian.cnfy descubrí que ese era el enchufe defectuoso.

Yvan
fuente
0

usa el siguiente comando:

$ mysqladmin apagado

esto debería estar disponible en el directorio / usr / bin en su caso.

Masood Syed
fuente
0

necesita ser un súper usuario para comenzar a detener mysql (y la mayoría de los otros servicios) en debian.

No estoy seguro si ya lo estás o no ... si no, debes hacer uno de

  • iniciar sesión como root
  • ponga sudo antes de su comando /etc/init.d/mysql restart (le pedirá su contraseña y deberá estar en el grupo sudoers)
benlumley
fuente