mysqlcheck

La herramienta mysqlcheck es una utilidad de línea de comandos que permite verificar, reparar, analizar y optimizar tablas de MySQL sin necesidad de conectarte al cliente mysql y ejecutar sentencias SQL manualmente. Es especialmente útil para tareas de mantenimiento automatizadas porque puedes integrarla fácilmente en scripts y programarla con cron.

Sintaxis general

mysqlcheck [opciones] nombre_base_de_datos [nombre_tabla ...]

La herramienta se conecta al servidor MySQL como cualquier otro cliente, por lo que necesita credenciales de acceso. La opción que determines (--check, --repair, --analyze, --optimize) indica qué operación ejecutar. Si no especificas ninguna opción de operación, mysqlcheck realiza una verificación por defecto.

Verificar tablas

La operación de verificación comprueba si las tablas tienen errores de integridad. Es equivalente a ejecutar CHECK TABLE desde SQL:

mysqlcheck --check tienda_mysql -u root -p
tienda_mysql.categorias                            OK
tienda_mysql.clientes                              OK
tienda_mysql.detalle_pedidos                       OK
tienda_mysql.envios                                OK
tienda_mysql.pedidos                               OK
tienda_mysql.productos                             OK

El resultado muestra cada tabla seguida de su estado. OK significa que la tabla no tiene errores. Si una tabla está corrupta, verás un mensaje diferente indicando el problema.

Para verificar una tabla específica, pásala como argumento después del nombre de la base de datos:

mysqlcheck --check tienda_mysql pedidos -u root -p
tienda_mysql.pedidos                               OK

Verificar todas las bases de datos

La opción --all-databases verifica cada tabla de cada base de datos en el servidor:

mysqlcheck --check --all-databases -u root -p
mysql.columns_priv                                 OK
mysql.component                                    OK
mysql.db                                           OK
mysql.general_log
note     : The storage engine for the table doesn't support check
mysql.user                                         OK
tienda_mysql.categorias                            OK
tienda_mysql.clientes                              OK
tienda_mysql.pedidos                               OK
...

Algunas tablas del sistema pueden mostrar notas indicando que su motor de almacenamiento no soporta la verificación. Esto es normal y no indica un problema.

Reparar tablas

La opción --repair intenta reparar tablas corruptas. Es equivalente a ejecutar REPAIR TABLE:

mysqlcheck --repair tienda_mysql pedidos -u root -p
tienda_mysql.pedidos                               OK

Para reparar todas las tablas de una base de datos:

mysqlcheck --repair tienda_mysql -u root -p

Recuerda que REPAIR TABLE funciona principalmente con tablas MyISAM. Para tablas InnoDB, la reparación se traduce en una recreación de la tabla si es necesario.

Analizar tablas

La opción --analyze actualiza las estadísticas de distribución de claves que usa el optimizador de consultas:

mysqlcheck --analyze tienda_mysql -u root -p
tienda_mysql.categorias                            OK
tienda_mysql.clientes                              OK
tienda_mysql.detalle_pedidos                       OK
tienda_mysql.pedidos                               OK
tienda_mysql.productos                             OK

Después de una carga masiva de datos o de eliminaciones significativas, ejecutar --analyze ayuda al optimizador a tomar mejores decisiones sobre qué índices usar.

Optimizar tablas

La opción --optimize reorganiza el almacenamiento físico de las tablas para recuperar espacio desperdiciado y desfragmentar los datos:

mysqlcheck --optimize tienda_mysql -u root -p
tienda_mysql.categorias
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
tienda_mysql.clientes
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
tienda_mysql.pedidos
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

La nota sobre Table does not support optimize aparece para tablas InnoDB y es completamente normal. MySQL recrea la tabla internamente, lo que logra el mismo resultado.

Combinar operaciones

Puedes combinar varias operaciones en una sola ejecución. Por ejemplo, para verificar y luego optimizar:

mysqlcheck --check --optimize tienda_mysql -u root -p

Sin embargo, la forma más común es ejecutar cada operación por separado para tener un control más claro sobre los resultados.

Verificar múltiples bases de datos

La opción --databases permite especificar varias bases de datos:

mysqlcheck --check --databases tienda_mysql inventario_app logs_sistema -u root -p
tienda_mysql.categorias                            OK
tienda_mysql.clientes                              OK
tienda_mysql.pedidos                               OK
inventario_app.almacenes                           OK
inventario_app.movimientos                         OK
logs_sistema.accesos                               OK
logs_sistema.errores                               OK

Opciones de conexión

Las opciones de conexión son las mismas que para cualquier cliente MySQL:

# Conexión básica con usuario y contraseña
mysqlcheck --check tienda_mysql -u root -p
 
# Especificar host y puerto
mysqlcheck --check tienda_mysql -h 192.168.1.100 -P 3306 -u admin -p
 
# Usar archivo de configuración de credenciales
mysqlcheck --check tienda_mysql --defaults-file=/etc/mysql/mantenimiento.cnf

El uso de --defaults-file es recomendable para scripts automatizados, ya que evita escribir la contraseña en el propio script o en la línea de comandos, donde sería visible en el historial de bash o en la lista de procesos.

El archivo de configuración tiene este formato:

# /etc/mysql/mantenimiento.cnf
[client]
user=admin_mantenimiento
password=contraseña_segura
host=localhost
# Proteger el archivo de configuración
chmod 600 /etc/mysql/mantenimiento.cnf

Opciones adicionales útiles

La opción --auto-repair combina verificación con reparación automática. Primero verifica todas las tablas y luego repara automáticamente las que tengan errores:

mysqlcheck --check --auto-repair tienda_mysql -u root -p

La opción --quick realiza una verificación más rápida que no escanea las filas para comprobar enlaces incorrectos:

mysqlcheck --check --quick tienda_mysql -u root -p

La opción --extended realiza una verificación exhaustiva que tarda más pero detecta más tipos de problemas:

mysqlcheck --check --extended tienda_mysql -u root -p

Automatización con cron

La verdadera potencia de mysqlcheck está en la automatización. Puedes configurar tareas de mantenimiento programadas usando cron.

Para verificar todas las bases de datos cada noche:

# Editar crontab
crontab -e
 
# Verificar todas las bases de datos a las 2 AM
0 2 * * * mysqlcheck --check --all-databases --defaults-file=/etc/mysql/mantenimiento.cnf >> /var/log/mysql-check.log 2>&1

Para optimizar las tablas principales cada semana:

# Optimizar todos los domingos a las 3 AM
0 3 * * 0 mysqlcheck --optimize tienda_mysql --defaults-file=/etc/mysql/mantenimiento.cnf >> /var/log/mysql-optimize.log 2>&1

Para analizar estadísticas después de procesos de carga diarios:

# Analizar todos los días a las 6 AM (después de la carga ETL de las 5 AM)
0 6 * * * mysqlcheck --analyze tienda_mysql --defaults-file=/etc/mysql/mantenimiento.cnf >> /var/log/mysql-analyze.log 2>&1

Script de mantenimiento completo

Un script más robusto puede combinar varias operaciones y enviar notificaciones:

#!/bin/bash
# /usr/local/bin/mysql-mantenimiento.sh
 
FECHA=$(date '+%Y-%m-%d %H:%M:%S')
LOG="/var/log/mysql-mantenimiento.log"
CONF="/etc/mysql/mantenimiento.cnf"
 
echo "=== Mantenimiento MySQL: $FECHA ===" >> $LOG
 
# Paso 1: Verificar todas las tablas
echo "-- Verificación --" >> $LOG
mysqlcheck --check --all-databases --defaults-file=$CONF >> $LOG 2>&1
 
# Paso 2: Reparar las que tengan errores
echo "-- Reparación automática --" >> $LOG
mysqlcheck --repair --all-databases --defaults-file=$CONF >> $LOG 2>&1
 
# Paso 3: Analizar estadísticas
echo "-- Análisis de estadísticas --" >> $LOG
mysqlcheck --analyze --all-databases --defaults-file=$CONF >> $LOG 2>&1
 
# Paso 4: Optimizar (solo la base principal)
echo "-- Optimización --" >> $LOG
mysqlcheck --optimize tienda_mysql --defaults-file=$CONF >> $LOG 2>&1
 
echo "=== Fin mantenimiento ===" >> $LOG
# Dar permisos de ejecución
chmod +x /usr/local/bin/mysql-mantenimiento.sh
 
# Programar ejecución semanal
0 3 * * 0 /usr/local/bin/mysql-mantenimiento.sh

mysqlcheck vs sentencias SQL

La tabla siguiente resume la correspondencia entre mysqlcheck y las sentencias SQL equivalentes:

mysqlcheckSQL equivalente
mysqlcheck --checkCHECK TABLE
mysqlcheck --repairREPAIR TABLE
mysqlcheck --analyzeANALYZE TABLE
mysqlcheck --optimizeOPTIMIZE TABLE

La diferencia principal es que mysqlcheck se ejecuta desde el shell del sistema operativo y puede procesar múltiples tablas y bases de datos de forma automatizada, mientras que las sentencias SQL requieren una conexión activa al cliente mysql.

Permisos necesarios

El usuario de MySQL que utilices con mysqlcheck necesita los privilegios SELECT para verificar tablas, INSERT adicional para reparar, y SELECT e INSERT para analizar y optimizar. Un usuario con el privilegio PROCESS global puede ver todas las tablas del servidor.

La herramienta mysqlcheck es la forma más práctica de mantener las tablas MySQL en buen estado de forma automatizada. Combina todas las operaciones de mantenimiento en una sola utilidad que se integra naturalmente con las herramientas de administración del sistema operativo.

Escrito por Eduardo Lázaro