El proceso mysqld es el corazón de MySQL. Cuando hablamos del "servidor MySQL", nos referimos exactamente a este programa: un demonio (daemon) que se ejecuta en segundo plano, escucha conexiones de clientes y procesa todas las sentencias SQL. Sin mysqld en ejecución, no hay servidor de bases de datos. Comprender cómo funciona, qué opciones acepta y cómo verificar su estado es conocimiento esencial para cualquier administrador.

Qué es mysqld

El nombre mysqld viene de "MySQL Daemon". En sistemas Unix y Linux, un daemon es un proceso que se ejecuta continuamente en segundo plano sin interacción directa del usuario. Cuando instalas MySQL y lo configuras como servicio, el sistema operativo se encarga de iniciar mysqld automáticamente en el arranque y mantenerlo en ejecución.

El binario mysqld generalmente se encuentra en /usr/sbin/mysqld o /usr/local/mysql/bin/mysqld, dependiendo del método de instalación. Puedes verificar su ubicación exacta con:

which mysqld
/usr/sbin/mysqld

O si fue instalado desde un paquete oficial de Oracle:

ls -la /usr/local/mysql/bin/mysqld

Verificar si mysqld está en ejecución

Antes de intentar cualquier operación con MySQL, conviene confirmar que el proceso está activo. En sistemas Linux modernos con systemd, el comando más directo es:

systemctl status mysqld
● mysqld.service - MySQL Server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
     Active: active (running) since Mon 2025-03-10 08:15:23 UTC; 12 days ago
       Docs: man:mysqld(8)
   Main PID: 2847 (mysqld)
     Status: "Server is operational"
     Memory: 892.4M
        CPU: 2h 14min 33.421s
     CGroup: /system.slice/mysqld.service
             └─2847 /usr/sbin/mysqld

También puedes buscar el proceso directamente:

ps aux | grep mysqld
mysql     2847  1.2  22.3 2148392 892416 ?   Ssl  Mar10  134:33 /usr/sbin/mysqld

Desde dentro de una sesión MySQL, puedes confirmar que estás conectado al servidor y conocer su versión:

SELECT @@version, @@version_comment;
@@version@@version_comment
8.0.36MySQL Community Server

Puerto y socket

mysqld escucha conexiones de dos formas diferentes. Para conexiones remotas (desde otras máquinas), utiliza un puerto TCP, que por defecto es el 3306. Para conexiones locales (desde la misma máquina), puede utilizar un socket Unix, que es más eficiente porque evita la sobrecarga del protocolo de red.

SHOW VARIABLES LIKE 'port';
Variable_nameValue
port3306
SHOW VARIABLES LIKE 'socket';
Variable_nameValue
socket/var/lib/mysql/mysql.sock

Si administras múltiples instancias de MySQL en el mismo servidor, cada una debe usar un puerto y socket diferentes. Por ejemplo, una instancia de producción en el puerto 3306 y una de réplica en el 3307.

Opciones de línea de comandos

Aunque normalmente mysqld se inicia a través del sistema de servicios, también puede ejecutarse directamente desde la línea de comandos con opciones que sobrescriben la configuración del archivo my.cnf. Esto es útil para depuración o para iniciar instancias temporales.

Las opciones más comunes incluyen:

# Iniciar con un archivo de configuración específico
mysqld --defaults-file=/etc/mysql/my-custom.cnf
 
# Iniciar especificando el puerto
mysqld --port=3307
 
# Iniciar con un directorio de datos diferente
mysqld --datadir=/data/mysql-nuevo
 
# Iniciar en modo de depuración (más logging)
mysqld --log-error-verbosity=3
 
# Mostrar todas las opciones disponibles
mysqld --verbose --help

Para ver qué opciones se están usando en la instancia actual, puedes consultar desde dentro de MySQL:

SHOW VARIABLES LIKE 'datadir';
Variable_nameValue
datadir/var/lib/mysql/
SHOW VARIABLES LIKE 'log_error';
Variable_nameValue
log_error/var/log/mysql/mysqld.log

Caso práctico: diagnosticar un mysqld que no arranca

Uno de los escenarios más estresantes para un administrador es encontrarse con un servidor MySQL que no arranca. El primer paso siempre es revisar el log de errores:

tail -50 /var/log/mysql/mysqld.log

Supongamos que encuentras este mensaje:

[ERROR] [MY-012960] [InnoDB] Cannot create redo log files because data files
are corrupt or the database was not shut down cleanly.

Esto indica que el servidor se detuvo de forma abrupta (un corte de energía, un kill -9) y los archivos de redo log están inconsistentes. En muchos casos, InnoDB puede recuperarse automáticamente. Pero si el error persiste, puedes intentar iniciar con la opción de recuperación forzada:

mysqld --innodb-force-recovery=1

Los niveles de recuperación van del 1 al 6, donde cada nivel incrementa la agresividad de la recuperación a costa de posibles pérdidas de datos. El nivel 1 simplemente omite las páginas corruptas durante la recuperación, mientras que el nivel 6 deja el redo log completamente de lado. En producción, nunca debes usar un nivel superior a 1 sin antes hacer una copia completa del directorio de datos.

Caso práctico: ejecutar múltiples instancias de mysqld

En entornos de desarrollo o pruebas, a veces necesitas ejecutar más de una instancia de MySQL en la misma máquina. Cada instancia requiere su propio directorio de datos, puerto y socket.

Primero, inicializa un nuevo directorio de datos:

mysqld --initialize-insecure --datadir=/data/mysql-test --user=mysql

Luego, inicia la segunda instancia con configuración diferenciada:

mysqld --datadir=/data/mysql-test \
       --port=3307 \
       --socket=/tmp/mysql-test.sock \
       --pid-file=/tmp/mysql-test.pid \
       --log-error=/var/log/mysql/mysql-test.log &

Para conectarte a esta instancia específica:

mysql --socket=/tmp/mysql-test.sock -u root

O si prefieres usar TCP:

mysql --host=127.0.0.1 --port=3307 -u root

Señales del sistema operativo

El proceso mysqld responde a ciertas señales del sistema operativo. La más importante es SIGTERM, que indica al servidor que debe cerrarse de forma ordenada: completa las transacciones en curso, vacía los buffers a disco y cierra las conexiones limpiamente.

# Enviar SIGTERM (cierre limpio)
kill -TERM $(cat /var/run/mysqld/mysqld.pid)

Nunca debes enviar SIGKILL (kill -9) a mysqld excepto como último recurso absoluto, ya que esto termina el proceso inmediatamente sin darle oportunidad de cerrar archivos correctamente. El resultado puede ser corrupción de datos que requiera una recuperación de InnoDB al siguiente arranque.

Para encontrar el PID del proceso:

cat /var/run/mysqld/mysqld.pid
2847

Variables de estado del proceso

Desde dentro de MySQL, puedes consultar información sobre el proceso del servidor:

SHOW STATUS LIKE 'Uptime';
Variable_nameValue
Uptime1058423

Ese valor está en segundos. Para convertirlo a un formato legible:

SELECT SEC_TO_TIME(VARIABLE_VALUE) AS tiempo_activo
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Uptime';
tiempo_activo
294:00:23

Esto indica que el servidor lleva 294 horas (más de 12 días) en ejecución continua.

Comprender mysqld como el proceso central de MySQL te da el fundamento para las operaciones que veremos a continuación. En el siguiente artículo aprenderemos cómo iniciar el servidor MySQL correctamente en diferentes sistemas operativos.

Escrito por Eduardo Lázaro