¿Por qué todas las tablas MySQL InnoDB están fragmentadas?

10

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_MBcolumna (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?

Clive
fuente
¿De verdad crees que 7 MB gratis es un problema?
David Schwartz
@DavidSchwartz No tengo ni idea, por eso pregunté;) Hay 2314 tablas, cada una con 7MB gratis, y no sé qué significa eso. No estoy seguro de por qué mysqltuner me mostraría esa cifra si no fuera un motivo de preocupación potencial. Esperaba que alguien aquí pudiera decirme qué tan preocupado se me dan los números y qué puedo hacer para mitigar el problema ya que los métodos 'estándar' no funcionan
Clive
Migrar esta pregunta según la solicitud del usuario en una bandera.
Daniel Beck
La mayoría de los detalles que muestra mysqltuner es solo para información. No todo es un problema. Si es un problema, lo dirá claramente. ¿Se indicó esto como un problema?
John Gardeniers
@JohnGardeniers Creo que sí, el mensaje es: [!!] Total fragmented tables: 2314estoy seguro de que indica un problema (con los dos signos de exclamación rojos)
Clive

Respuestas:

5

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.

John Gardeniers
fuente
3

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 .ibdarchivo 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

ALTER TABLE table_name ENGINE=INNODB;

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

ACTUALIZACIÓ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)

RolandoMySQLDBA
fuente
1
Ahhh ok, las cosas tienen mucho más sentido ahora, gracias. Terminé exportando los datos, limpiando MySQL por completo, luego reinstalando (pero agregando innodb_file_per_tableal 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 ejecutar innodb_force_recoveryen 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
Clive
¡increíble! Esto es muy informativo. Gracias @RolandoMySQLDBA!
Sudhi