REPAIR TABLE
Cuando una tabla se corrompe, MySQL puede devolver errores inesperados al leer datos, índices inconsistentes o incluso negarse a abrir la tabla. La sentencia REPAIR TABLE intenta reconstruir la estructura interna de la tabla para devolverla a un estado funcional. Es una herramienta esencial en el mantenimiento de bases de datos, especialmente para tablas MyISAM.
Sintaxis
La forma general de REPAIR TABLE es la siguiente:
REPAIR TABLE nombre_tabla [, nombre_tabla2, ...]
[QUICK] [EXTENDED] [USE_FRM];Puedes reparar una o varias tablas en la misma sentencia separándolas por comas. Las opciones QUICK, EXTENDED y USE_FRM modifican el comportamiento de la reparación y pueden combinarse entre sí.
Cuándo se corrompe una tabla
Las tablas pueden corromperse por diversas razones. Un corte de energía durante una escritura, un proceso mysqld terminado abruptamente, un fallo de hardware en el disco, o incluso un bug en el motor de almacenamiento pueden dejar una tabla en estado inconsistente. También puede ocurrir si un programa externo modifica directamente los archivos de datos mientras MySQL los está usando.
Los síntomas más comunes de corrupción incluyen mensajes de error como Table 'nombre' is marked as crashed, resultados incompletos en consultas que antes funcionaban, o imposibilidad de insertar o actualizar registros.
Verificar antes de reparar
Antes de ejecutar REPAIR TABLE, conviene confirmar que la tabla realmente está corrupta usando CHECK TABLE:
CHECK TABLE pedidos;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.pedidos | check | warning | Table is marked as crashed |
| tienda_mysql.pedidos | check | error | Size of datafile is: 1024 Should be: 2048 |
| tienda_mysql.pedidos | check | status | Corrupt |
Cuando el resultado muestra Corrupt o mensajes de error, es momento de reparar.
Reparación básica
La forma más simple repara la tabla usando el método estándar:
REPAIR TABLE pedidos;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.pedidos | repair | status | OK |
MySQL reconstruye los índices leyendo las filas de datos, crea un nuevo archivo de índices y actualiza las estadísticas. Si el resultado es OK, la tabla ha sido reparada exitosamente.
Opción QUICK
La opción QUICK intenta reparar solo el archivo de índices sin tocar el archivo de datos. Es la reparación más rápida y la que menos riesgo conlleva:
REPAIR TABLE pedidos QUICK;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.pedidos | repair | status | OK |
Esta opción es ideal cuando sospechas que el problema está únicamente en los índices, por ejemplo después de un cierre inesperado del servidor. Si QUICK no resuelve el problema, prueba con la reparación estándar sin opciones.
Opción EXTENDED
La reparación extendida reconstruye los índices fila por fila en lugar de ordenarlos. Es más lenta pero más exhaustiva:
REPAIR TABLE pedidos EXTENDED;Esta opción se usa como último recurso cuando la reparación estándar no funciona. Recorre cada fila de datos y recrea cada entrada de índice individualmente, lo que puede recuperar datos que otros métodos no logran salvar.
Opción USE_FRM
La opción USE_FRM es la más drástica. Se utiliza cuando el archivo de índices .MYI está completamente perdido o dañado más allá de la reparación normal. MySQL usa el archivo de definición .frm para recrear los índices desde cero:
REPAIR TABLE pedidos USE_FRM;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.pedidos | repair | warning | Number of rows changed from 0 to 15234 |
| tienda_mysql.pedidos | repair | status | OK |
El aviso sobre el cambio en el número de filas es normal porque MySQL no tenía información previa del archivo de índices. Esta opción solo funciona con tablas MyISAM y no debe usarse si el archivo .frm también está corrupto.
Reparar múltiples tablas
Puedes reparar varias tablas en una sola sentencia:
REPAIR TABLE pedidos, detalle_pedidos, envios;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.pedidos | repair | status | OK |
| tienda_mysql.detalle_pedidos | repair | status | OK |
| tienda_mysql.envios | repair | status | OK |
MySQL procesa cada tabla secuencialmente y reporta el resultado individual de cada una.
MyISAM vs InnoDB
La sentencia REPAIR TABLE funciona principalmente con tablas MyISAM, ARCHIVE y CSV. Para tablas InnoDB, el comportamiento es diferente y generalmente innecesario.
InnoDB cuenta con un mecanismo de auto-recuperación llamado crash recovery. Cuando el servidor MySQL se reinicia después de un fallo, InnoDB revisa automáticamente sus logs de transacciones (redo logs) y aplica las operaciones pendientes o deshace las transacciones incompletas. Este proceso ocurre de forma transparente sin intervención del administrador.
Si una tabla InnoDB muestra problemas que la recuperación automática no resuelve, las alternativas son diferentes:
-- Forzar recuperación de InnoDB editando my.cnf
-- innodb_force_recovery = 1 (hasta 6 en casos extremos)
-- Después de recuperar acceso, exportar e importar la tabla
ALTER TABLE productos ENGINE=InnoDB;El comando ALTER TABLE ... ENGINE=InnoDB recrea la tabla desde cero, lo que equivale a una reparación completa para tablas InnoDB.
Estrategia recomendada de reparación
Cuando detectas una tabla corrupta, sigue un enfoque gradual empezando por el método menos invasivo:
-- Paso 1: verificar el estado
CHECK TABLE pedidos;
-- Paso 2: intentar reparación rápida
REPAIR TABLE pedidos QUICK;
-- Paso 3: si no funciona, reparación estándar
REPAIR TABLE pedidos;
-- Paso 4: si aún falla, reparación extendida
REPAIR TABLE pedidos EXTENDED;
-- Paso 5: último recurso (solo MyISAM)
REPAIR TABLE pedidos USE_FRM;Antes de ejecutar cualquier reparación, haz una copia de seguridad de los archivos de la tabla si es posible. Aunque REPAIR TABLE intenta preservar los datos, una reparación fallida podría empeorar la situación.
Reparación desde línea de comandos
Para tablas MyISAM, también puedes usar la herramienta myisamchk directamente sobre los archivos, sin necesidad de que el servidor esté corriendo:
# Detener MySQL primero
sudo systemctl stop mysql
# Verificar la tabla
myisamchk /var/lib/mysql/tienda_mysql/pedidos.MYI
# Reparar
myisamchk --recover /var/lib/mysql/tienda_mysql/pedidos.MYI
# Reiniciar MySQL
sudo systemctl start mysqlEs fundamental que el servidor MySQL esté detenido mientras usas myisamchk, ya que modificar los archivos mientras MySQL los tiene abiertos causaría más corrupción.
Permisos necesarios
Para ejecutar REPAIR TABLE, el usuario necesita los privilegios SELECT e INSERT sobre la tabla que se va a reparar. Normalmente los administradores de base de datos son quienes ejecutan estas operaciones.
Prevención de la corrupción
La mejor estrategia es prevenir la corrupción antes de que ocurra. Usar InnoDB como motor de almacenamiento predeterminado reduce drásticamente el riesgo gracias a su sistema transaccional y crash recovery. Configurar un UPS para evitar cortes de energía, mantener el hardware en buen estado, y realizar backups regulares complementan una estrategia de prevención robusta.
La sentencia REPAIR TABLE es una herramienta de emergencia, no algo que debas ejecutar rutinariamente. Si te encuentras reparando tablas con frecuencia, investiga la causa raíz del problema, ya sea hardware defectuoso, un servidor que se reinicia constantemente u otra causa subyacente. En el siguiente artículo veremos ANALYZE TABLE, que sí es una operación de mantenimiento rutinario para mantener las estadísticas de índices actualizadas.
Escrito por Eduardo Lázaro
