¿Qué tan grande es demasiado grande para el archivo ibdata?

9

Mi archivo ibdata es muy grande, al menos me parece muy grande. ¿Es esto excesivo o no tan malo?

-rw-rw---- 1 mysql mysql  15G Apr 18 10:11 ibdata1
nachito
fuente
44
Su archivo ibdata es muy pequeño.
Jeff Ferland
¿Dividir ese archivo en fragmentos más pequeños (digamos 4G) sería mejor o peor para el rendimiento?
nachito

Respuestas:

13

Cuando esto puede ser un problema

Si se ejecuta show table statusen una tabla y el Data_freecampo constituye la gran mayoría del ibdata1tamaño de su archivo, es posible que tenga mucho espacio desperdiciado. Una gran cantidad de inserción / eliminación hará que eso sea un problema. Si ese es el caso y las inserciones y eliminaciones transitorias constituyen la mayor parte de sus datos, entonces tiene un buen caso para el archivo por tabla.

Sin embargo, ese no es un "sí" automático. Se habla mucho en el mundo sobre la fragmentación interna dentro de los archivos de InnoDB, pero ponerlos en un sistema de archivos como archivo por tabla simplemente mueve su fragmentación al nivel del sistema de archivos en lugar del nivel de la base de datos.

Por qué esto generalmente no es un problema

Piense en su archivo InnoDB como un sistema de archivos en lugar de un archivo. Si tiene muchos archivos, necesitará un gran sistema de archivos.

En su mayor parte, los sistemas de archivos funcionan muy bien para escalar y manejar terabytes de datos y un sinnúmero de archivos. A veces se topan con problemas con una indexación deficiente (por ejemplo, límites en la cantidad de archivos en un directorio antes de un impacto en el rendimiento), pero en su mayor parte el sistema de archivos moderno puede alcanzar el rango de terabytes.

InnoDB funciona de la misma manera. El tamaño de su archivo de datos puede ser enorme ... y, al igual que los grandes sistemas de archivos, puede presentar problemas con la copia de seguridad de sus datos. Sin embargo, al igual que dividir su sistema de archivos en múltiples particiones no ayuda con este problema, tampoco lo hace tratar de manipular innodb. Si bien puedes usar innodb_file_per_table , rara vez lo recomiendo.

Al igual que su sistema de archivos, la mejor respuesta es conocer los límites internamente y trabajar dentro de eso. Comprender los índices y aplicarlos adecuadamente. No intentes dividir InnoDB, no está hecho para eso.

Como estoy luchando por transmitir el concepto de manera constructiva, he aquí una lectura rápida de las palabras mejor que yo: los terabytes no son grandes datos, los petabytes sí .

Recuerdo una diapositiva de marketing de MySQL muy antigua en la que el cliente estaba ejecutando un almacén de datos con algunos terabytes. Hace muchos años. InnoDB o MyISAM, ambos funcionarían. Esto es estándar en el rack de cosas de MySQL.

No se preocupe por una base de datos de 15 GB.

Jeff Ferland
fuente
Parece que estoy por debajo del 50% utilizado. InnoDB free: 7364608 kB
nachito
@nachito Parece que debería estar bien. Si cree que necesita recuperar el espacio para el sistema de archivos, reclámelo. Si solo te preocupa el rendimiento, no lo hagas. Además, para el rendimiento, lo mejor es mantener los archivos de la base de datos en su propia partición, de modo que si se concentra en el rendimiento, no vería una reclamación utilizable de todos modos.
Jeff Ferland
6

los archivos ibdata no se reducen; si recientemente eliminó algunas tablas o eliminó muchas filas, innodb en su configuración no liberará el espacio libre de nuevo al sistema de archivos. te sugeriría:

  • copia de seguridad de todos sus datos, por ejemplo, con mysqldump
  • agregar a my.cnf directiva innodb_file_per_table
  • reiniciar mysql
  • descartar todas las bases de datos usando el motor innodb
  • deja de mysql
  • eliminar el archivo ibdata
  • rm ib_logfile [01]
  • inicie mysql, verifique syslog si todo está bien
  • recarga tu basurero

de esta forma, podrá recuperar el espacio cada vez que suelte una tabla / base de datos innodb; los archivos idb asociados se eliminarán de inmediato.

pQd
fuente
Entiendo que nunca se reducirá sin descargar y volver a cargar las tablas. Sin embargo, si eliminé las bases de datos de InnoDB, ¿utilizará ese espacio "libre" antes de que comience a crecer nuevamente?
nachito
1
@nachito Sí, lo hará.
Jeff Ferland
Su respuesta es solo una sugerencia directa sin nublar el problema como parece haber hecho mi respuesta. +1 !!!
RolandoMySQLDBA
1
Bueno, la respuesta es una solución para reducir el espacio utilizado por los archivos de datos, pero no es una discusión sobre el mérito relacionado con eso, y esa es la pregunta mientras la leo. ¿Es un archivo ibdata de 15 GB un gran problema?
Jeff Ferland