2011-08-16 15 views
11

Cuando se trata de la corrupción de bases de datos MySQL, si el archivo de índice MYI no se encuentra o está dañado si su encabezado no se puede utilizar un comando myisamchk:¿Cómo se pueden reparar todas las tablas en todas las bases de datos desde el símbolo del sistema de MySQL cuando el archivo MYI está dañado o falta?

myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI 

Tienes que hacer la reparación desde la línea de comandos de MySQL con la opción USE_FRM:

repair tbl_name use_frm; 

por MySQL documentation's on repairing tables

el USE_FRM opción está disponible para su uso si el archivo de índice .MYI es missin g o si su encabezado está dañado. Esta opción le dice a MySQL que no confíe en la información del encabezado del archivo .MYI y que vuelva a crearla con la información del archivo .frm. Este tipo de reparación no se puede hacer con myisamchk.

Con demyisamchk, que puede caer fácilmente en cada carpeta de base de datos y reparar cada tabla mediante asteriscos al final del comando:

/var/lib/mysql/*/*.MYI 

No se puede hacer nada parecido desde la línea de comandos de MySQL.

Hay una pregunta StackOverflow con una respuesta que explica how to repair all tables within one specific database from the MySQL command prompt with a procedure:

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE MYDATABASE.repair_all() 
BEGIN 
    DECLARE endloop INT DEFAULT 0; 
    DECLARE tableName char(100); 
    DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE(); 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1; 

    OPEN rCursor; 
    FETCH rCursor INTO tableName; 

    WHILE endloop = 0 DO 
    SET @sql = CONCAT("REPAIR TABLE `", tableName, "`"); 
    PREPARE statement FROM @sql; 
    EXECUTE statement; 

    FETCH rCursor INTO tableName; 
    END WHILE; 

    CLOSE rCursor; 
END 

¿Es posible modificar un procedimiento como este para recorrer todos sus bases de datos MySQL y reparar todas las mesas dentro de esas bases de datos?

Creo que esto podría ser útil para cualquiera que tenga una gran cantidad de bases de datos y se encuentre con serios daños.

+0

¿Fue realmente necesario su comentario sarcástico? Estoy en una situación donde no es factible en el futuro predecible cambiar a InnoDB. – Drew

Respuesta

16

mysqlcheck es una interfaz de línea de comandos más conveniente para el MySQL CHECK, REPAIR, ANALYZE y OPTIMIZE declaraciones.

mysqlcheck --repair --use-frm --all-databases 
+0

Al igual que myisamchk, mysqlcheck no funciona si falta el archivo de índice .MYI o si el encabezado está dañado. ** Solo ** se puede hacer desde el símbolo del sistema de MySQL. – Drew

+1

No lo he probado yo mismo, pero la existencia de la opción '--use-frm' parecería estar en desacuerdo. Mayormente 'mysqlcheck' es exactamente equivalente a ejecutar manualmente las declaraciones. –

+0

¡Tienes razón! MySQL probablemente debería actualizar su documentación para REPAIR TABLE para que la gente sepa que también se puede usar mysqlcheck. ¡Gracias por ser persistente al decirme que estoy equivocado! "mysqlcheck es similar en función a myisamchk, pero funciona de manera diferente. ** La principal diferencia operativa es que mysqlcheck debe utilizarse cuando el servidor mysqld se está ejecutando **, mientras que myisamchk debe usarse cuando no lo esté. El beneficio de usar mysqlcheck es que no tiene que detener el servidor para realizar el mantenimiento de la tabla ". ¡Gracias! – Drew

1

aquí está mi solución para cuando tenía que solucionar todos los archivos MyISAM en mi DB:

find ./ -name "*.MYI" -exec myisamchk -r {} \; 

Atraviesa todas las bases de datos.

Cuestiones relacionadas