¿Cómo reduzco el archivo innodb ibdata1 sin volcar todas las bases de datos?


24

InnoDB almacena todas las tablas en un archivo grande ibdata1.

Después de soltar una tabla grande, el archivo mantiene su tamaño sin importar cuán grande sea la tabla. ¿Cómo puedo reducir ese archivo sin tener que volcar y volver a importar toda la base de datos (que tiene varios Cien GB en total)?

Creo que la razón es porque todavía puede revertir la caída. En mi caso no necesito hacerlo.

Respuestas:


30

Este es uno de los temas más controvertidos con los que he tratado a lo largo de los años como DBA MySQL y en StackExchange de DBA.

Para decirlo suavemente, simplemente no hay otra forma de reducir ibdata1 . Con innodb_file_per_table deshabilitado, cada vez que se ejecuta OPTIMIZE TABLEen una tabla InnoDB, ibdata1 crece rápidamente. Los datos que se eliminan usando DROP TABLEy DROP DATABASEno se pueden deshacer porque son DDL, no DML. Creo que Oracle y MSSQL pueden revertir DDL. MySQL no puede hacer eso.

Hay varias clases de información que residen en ibdata1

  • Datos de tabla
  • Índices de tabla
  • Tabla MetaData
  • Datos de control de MVCC
  • Memoria intermedia de doble escritura (escritura en segundo plano para evitar la dependencia del almacenamiento en caché del sistema operativo)
  • Insert Buffer (Gestión de cambios en índices secundarios no únicos)

El uso innodb_file_per_table=1le permitirá crear nuevas tablas con datos de tabla e índices de tabla que se crean fuera de ibdata1. Puede extraer cualquier tabla que todavía esté dentro de ibdata1 usando ALTER TABLE ... ENGINE=InnoDB;o OPTIMIZE TABLEpero eso dejará ese gran espacio sin usar en ibdata1.

No obstante, debe limpiar la infraestructura de InnoDB. Ya escribí publicaciones de StackExchange sobre cómo y por qué hacer esto:

Buenas noticias

Solo tiene que volcar los datos, volver a cargar una vez más y nunca volver a visitar este problema nuevamente . La ejecución OPTIMIZE TABLEposterior reducirá el .ibdarchivo de espacio de tabla para cualquier tabla InnoDB.


1
Corrección menor: MSSQL y PostgreSQL pueden revertir DDL. Oracle no puede. De hecho, ¡Oracle emite una confirmación implícita cuando ve DDL!
Chris Travers

1
@RolandoMySQLDBA desde qué versión de MySQL funciona esta "buena noticia" de reducción automática?
Gavriel

@Gavriel - Creo que leíste mal. Todavía tienes que volcar; eliminar ibdata1; reiniciar; y recargar. Sin autoencogimiento de ibdata1. (Cambiar iblog * ahora es más simple.)
Rick James

2

InnoDB solo almacena todas sus tablas de InnoDB en ibdata1 si no utiliza la siguiente configuración en su archivo predeterminado my.cnf:

innodb_file_per_table = 1

DROP TABLE (y DROP DATABASE) no se puede revertir.

Esa no es la razón por la que no puede reducir ibdata1.

Esta es una explicación abreviada, pero ibdata1 contiene elementos internos de InnoDB además de los datos de su tabla. Según tengo entendido, reducirlo requeriría desfragmentarlo, lo que no es una operación compatible.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.