Nunca reinicie un misterio: qué capturar antes de un reinicio
Un reinicio borra el síntoma y con él las pruebas; en un sistema con estado, los cinco minutos dedicados primero a capturar el estado deciden si los datos sobreviven.
En este artículo 6 secciones
- Reiniciar un servicio sin estado es una corrección. Reiniciar uno con estado antes de conocer la causa es un experimento ejecutado sobre sus datos, y una parada no limpia es el mecanismo por el que algunos motores de tablas se corrompen.
- Un reinicio borra el estado de los procesos, los propietarios de los sockets, el ring buffer del kernel y la distinción entre una caída y un arranque fallido. Capture eso primero; lleva minutos.
- Snapshot antes de reparar, reparar antes de restaurar, y verificar en el límite que falló en lugar de en «el servicio está arriba».
Dónde el reflejo acierta, y dónde no
Apagar y encender funciona con un worker web bloqueado, un consumidor de colas atascado, un portátil. El estado que estaba mal se descarta y se reconstruye desde cero, porque nada de valor vivía en él. Las bases de datos, los brokers de mensajes, los daemons de storage y cualquier cosa con un write-ahead log son el caso contrario. El estado es el producto. Un reinicio no descarta el estado malo; descarta la información sobre cómo llegó a estar mal, y en algunos motores añade daños propios.
Qué borra un reinicio
La tabla de procesos y sus tiempos: qué proceso lleva ejecutándose desde cuándo, cuál está en sueño ininterrumpible y sobre qué. El propietario de cada socket y descriptor de fichero abierto, que le dice quién retenía el lock o el puerto. El ring buffer del kernel, que en una instalación por defecto no sobrevive a un reinicio y es donde un out-of-memory kill, un error de sistema de ficheros o un disco que falla se anuncian. El contenido en memoria del servicio, que un core dump puede conservar y un reinicio no. La cronología de apagado y arranque que separa una caída de un arranque fallido. Y en un motor de tablas sin recuperación ante caídas, la propia parada no limpia es la forma en que se daña la cabecera de un índice, de modo que el reinicio que iba a arreglar el servicio puede ser el evento que corrompe las tablas.
El kit de pruebas, en minutos
Todo lo que sigue es de solo lectura. Ejecútelo desde una shell en la máquina, redirija la salida a un fichero con marca de tiempo, y copie ese fichero fuera de la máquina antes de que nadie toque nada más.
$ uptime; last -x | head -20; journalctl --list-boots | tail -3
$ dmesg -T | tail -200
$ ps -eo pid,ppid,stat,etime,wchan:24,cmd --sort=-etime | head -60
$ ss -tnp state established | head -100
$ free -m; df -h; df -i
$ vmstat 1 5
$ top -b -n 1 | head -40Para una base de datos, añada la visión que el propio motor tiene de sí mismo mientras aún responde, y la cola de su registro de errores tanto si responde como si no.
mysql> SHOW FULL PROCESSLIST;
mysql> SHOW ENGINE INNODB STATUS\G
mysql> SHOW GLOBAL STATUS LIKE 'Threads_%';
$ tail -500 /var/log/mariadb/mariadb.logEl primer bloque responde si la máquina ya se ha reiniciado, si el kernel ha matado algo, qué está atascado y sobre qué, quién mantiene qué conexión, y si la máquina está bajo presión de memoria o de E/S. El segundo responde qué cree la base de datos que está pasando: una transacción larga que retiene locks, un hilo de replicación detenido, un deadlock, una tabla marcada como dañada.
Caída, o arranque fallido
La distinción más útil del registro es la que separa un servicio que se cayó de un servicio que se apagó limpiamente y después no consiguió volver. El primero necesita que se encuentre el desencadenante antes de reiniciar nada, porque reiniciar hacia un desencadenante activo reproduce la caída. El segundo es un problema de arranque o de política: una configuración cambiada, un disco lleno, un permiso, una unidad que no estaba habilitada. En el segundo caso los datos no corren riesgo, y tratarlo como una caída desperdicia el tiempo que habría devuelto el servicio. La cola del registro del servicio muestra cuál de los dos es: una línea de apagado completado seguida de un abort al arrancar es el segundo caso.
El camino reversible
Una vez conocido el desencadenante, la secuencia es la misma en todo sistema con estado. Detenga el desencadenante, para que la corrección no pueda deshacerse con otra caída a mitad de la recuperación. Tome el snapshot gratuito: detenga las escrituras, aparte el directorio de datos con un rename o haga un snapshot del volumen, y guarde una copia fuera de la máquina. A partir de ahí, cada paso puede revertirse. Repare antes de restaurar, porque un backup lleva fielmente lo que el sistema llevaba cuando se tomó, y si el fallo entró con los datos, el restore lo vuelve a plantar mientras descarta todo lo escrito desde entonces. Verifique en el límite que falló: la consulta que abortó, la tabla que informó de cero filas, la posición de replicación, no simplemente que el puerto está abierto. Despliegue el ajuste planificado solo cuando el paciente esté sano; recuperación y cambio son dos operaciones distintas.
| El reflejo | Lo que ocurre en realidad |
|---|---|
| Reiniciar el servicio | Con el desencadenante aún activo vuelve a caerse, y la segunda parada es tan poco limpia como la primera |
| Restaurar el backup de anoche | Todo lo escrito desde anoche desaparece, y un fallo que entró con los datos se restaura con ellos |
| Añadir memoria, parece de memoria | Si el abort es software recorriendo metadatos dañados, el hardware no cambia nada |
| Se cayó, así que algo está roto | Un apagado limpio seguido de un arranque fallido es un problema de reinicio sin riesgo para los datos |
Un recuento de filas a cero tras un reinicio brusco suele ser un índice dañado sobre filas intactas. En motores sin recuperación ante caídas, una reparación reconstruye el índice a partir de los datos; un restore tira los datos.
La cura, distinta de la recuperación
Una reparación es recuperación. La cura es eliminar lo que provoca paradas no limpias, y convertir las tablas que no pueden sobrevivir a una a un motor que sí puede. Ambas pertenecen al seguimiento, no al combate del incendio.
Respuestas directas
¿Debo reiniciar mi base de datos caída?+
No hasta que el registro le haya dicho si se cayó o si no consiguió arrancar, y cuál fue el desencadenante. Reiniciar hacia un desencadenante activo reproduce la caída y, en un motor sin seguridad ante caídas, puede dañar tablas. Capture primero en solo lectura, después decida.
Mi tabla muestra cero filas tras una caída. ¿Se han perdido los datos?+
A menudo no. En motores de tablas sin recuperación ante caídas, una parada no limpia daña la cabecera del índice mientras las filas siguen en disco, y el motor informa del recuento a partir de la cabecera. Haga un snapshot del directorio de datos, después ejecute la reparación del motor; una reparación normalmente reconstruye el índice a partir de las filas que siguen ahí. Restaure solo si la reparación falla.
¿Restaurar desde el backup es la recuperación más segura?+
Suele ser la más destructiva. Todo lo escrito desde el backup se descarta, y si el fallo ya estaba en los datos cuando se hizo el backup, vuelve con él. El restore es el último paso, después del diagnóstico y la reparación.
¿Qué hay que capturar antes de que nadie reinicie nada?+
La tabla de procesos con sus tiempos, los propietarios de los sockets abiertos, el ring buffer del kernel, la presión de memoria y de E/S, el uso de disco y de inodos, el historial de arranques, y el estado y el registro de errores del propio servicio. Escrito en un fichero y copiado fuera de la máquina. Lleva minutos, y es la única copia de esas pruebas que tendrá.
¿Caído ahora mismo y con el dedo sobre el botón de reinicio?
Hable con un ingeniero; diagnosticamos primero en solo lectura y hacemos snapshot antes de cualquier cosa que escriba.
Hable con un ingenieroHa llegado al final.
Ponga la lectura a trabajar
¿Qué está ejecutando?
Cuéntenos la carga de trabajo, el tráfico y los requisitos de recuperación. Empiece por el configurador de servidores o repase los detalles con un ingeniero.
Escrito por los ingenieros que construyen y operan la infraestructura que describe.Hable con un ingeniero
