Por alguna razón, todas las tablas de InnoDB en mi servidor MySQL se enumeran como fragmentadas cuando ejecuto mysqltuner. Solo instalé el servidor hace unas horas (en OSX Lion), y tiene un montón de datos nuevos importados de archivos por lotes.
Traté de convertir todas las tablas en una base de datos a MYISAM, y efectivamente la cantidad de tablas fragmentadas disminuyó. Aunque parezca extraño, tan pronto como volví a convertir esas tablas en InnoDB, el recuento de tablas fragmentadas volvió a subir. Esto es contrario a mi investigación hasta ahora, que sugiere que correr ALTER TABLE table_name ENGINE=INNODB;
debería solucionar la fragmentación.
Después de buscar un poco en Google, corrí:
SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0
Que supuestamente enumera todas las tablas fragmentadas (de hecho, devuelve el mismo número de resultados que las salidas de mysqltuner para el recuento de tablas fragmentadas). Cada entrada tiene exactamente el mismo número en la data_free_MB
columna (actualmente 7.00000000).
¿Es esto realmente un problema real o algo que mysqltuner está haciendo mal? Si es un problema, ¿cómo lo soluciono?
EDITAR
Cada vez sospecho más que soy un idiota y que la fragmentación de 7 MB es para todo el archivo, no para cada tabla. ¿Alguien puede confirmar si ese sería el caso?
[!!] Total fragmented tables: 2314
estoy seguro de que indica un problema (con los dos signos de exclamación rojos)Respuestas:
Según mis comentarios anteriores, no todos los resultados de sqltuner indican errores. A menos que el script indique claramente que es un problema, generalmente en la siguiente línea, seguido de sugerencias para la corrección, entonces es solo un elemento informativo.
fuente
Cuando habilitó innodb_file_per_table , todo lo que hizo fue configurar un protocolo para que las nuevas tablas de InnoDB se crearan en un
.ibd
archivo externo . Todas las tablas de InnoDB que creó antes de esto todavía están integradas en ibdata1.Con innodb_file_per_table deshabilitado, cada vez que ejecuta
todo lo que hace es agregar los datos de la tabla y las páginas de índice a ibdata1. Esto hará que la tabla exista en páginas contiguas y eliminará la fragmentación. La desventaja es que ibdata1 crece rápidamente.
RECOMENDACIÓN
Deberá exportar todos los datos, eliminar ibdata1, ib_logfile0, ib_logfile1 y volver a cargar.
Escribí cómo y por qué hacer esto
Oct 29, 2010
: Cómo: ¿Limpiar un motor de almacenamiento mysql InnoDB?Jul 05, 2012
: Mueva ibdata1, establezca innodb_data_file_pathACTUALIZACIÓN 2012-08-15 12:05 EDT
Es posible que desee examinar el script mysqltuner.pl en sí. En mi humilde opinión, creo que está utilizando una antigua fórmula para medir la fragmentación. Asegúrese de tener la última versión de mysqltuner.
En cuanto a la medición de la fragmentación de las tablas de InnoDB almacenadas externamente, escribí una publicación al respecto el 11 de abril de 2012 (consulte la actualización en la parte inferior para el 19 de abril de 2012)
fuente
innodb_file_per_table
al archivo conf antes de iniciar el servidor y volver a importar). Antes de eso, recibía todo tipo de errores de InnoDB (los tipos realmente malos ... ¡los que significaban que tenía que ejecutarinnodb_force_recovery
en el nivel 6 solo para obtener los datos!), Y todo tipo de 'la fecha del archivo de registro está en ¡el futuro!' errores Parece que se han detenido ahora, pero todavía tengo algunas tablas fragmentadas. Solo lo mantendré atento, gracias nuevamente por el aporte