¿Cuál es el archivo ibdata1 en mi directorio / var / lib / mysql?

32

Al iniciar sesión en mi panel de control de Webmin, noté que prácticamente todo mi espacio en disco está lleno. Busqué los diez archivos / directorios más grandes en mi sistema y descubrí que un archivo llamado ibdata1 ocupa alrededor de 94 GB de espacio. Reside en mi directorio / var / lib / mysql.

¿Qué hace ibdata1? ¿Estoy seguro de eliminarlo? Mi suposición es que es un tipo de basura, pero eso es una suposición descabellada.

James
fuente

Respuestas:

38

El archivo ibdata1es el espacio de tabla del sistema para la infraestructura de InnoDB.

Contiene varias clases de información vital para InnoDB

  • Páginas de datos de tabla
  • Páginas de índice de tabla
  • Diccionario de datos
  • Datos de control de MVCC
    • Deshacer espacio
    • Segmentos de reversión
  • Memoria intermedia de doble escritura (páginas escritas en segundo plano para evitar el almacenamiento en caché del sistema operativo)
  • Insertar búfer (cambios en los índices secundarios)

Tenga en cuenta el lugar de ibdata1 en el universo InnoDB (en el lado derecho)

Arquitectura InnoDB

Puede separar las páginas de datos e índices ibdata1habilitando innodb_file_per_table . Esto hará que cualquier tabla InnoDB recién creada almacene datos e páginas de índice en un .ibdarchivo externo .

Ejemplo

  • datadir es / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;crea /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table habilitado, Páginas de datos / índice almacenadas en /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table deshabilitado, Páginas de datos / índice almacenadas en ibdata1

No importa dónde esté almacenada la tabla InnoDB, la funcionalidad de InnoDB requiere buscar metadatos de tabla y almacenar y recuperar información MVCC para admitir el cumplimiento de ACID y el aislamiento de transacciones .

Aquí están mis artículos anteriores sobre la separación de datos de tablas e índices de ibdata1

QUE HACER SIGUIENTE

Puede continuar teniendo ibdata1 almacenado todo, pero eso hace que hacer instantáneas LVM sea un trabajo pesado (mi opinión personal).

Debe usar la publicación My StackOverflow y reducir ese archivo de forma permanente.

Por favor ejecute esta consulta:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Esto le dirá cuánto espacio desperdiciado puede recuperarse después de aplicar la limpieza de InnoDB.

RolandoMySQLDBA
fuente
Gracias por tu contribución. Desde entonces, mi cuota de disco se ha llenado por completo. Antes de seguir cualquiera de los consejos de sus publicaciones, ¿necesitaré espacio libre? Noto que su publicación original en SO menciona acerca de hacer un volcado de SQL, pero presumiblemente esto crearía un archivo de ~ 90GB sin ningún lugar a donde ir.
James
mysqldump solo mostrará la representación lógica de las páginas de datos, no los índices. Necesitará otro montaje en disco, quizás un servidor remoto, para volcar los datos.
RolandoMySQLDBA
99
Devuelve 91.25350952148438 para mí como SpaceToReclaim. ¿Está esto en megabytes? ¿por ciento? bytes?
Isaac
Sé que esto es demasiado viejo. Pero para cualquiera que venga aquí con el problema, debe reemplazar el número 94con el tamaño de su ibdata1archivo en GB y SpaceToReclaimle dará el tamaño en GB.
Anupsabraham
2

Si usa innodb como motor MySQL, por defecto almacenará todas sus bases de datos en ibdata1. También hay archivos de registro ib_logfile0 e ib_logfile1. No elimine esos archivos.

silviud
fuente
¿Qué es eliminar ese archivo en mi servidor?
Frank