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 TABLE
en una tabla InnoDB, ibdata1 crece rápidamente. Los datos que se eliminan usando DROP TABLE
y DROP DATABASE
no 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=1
le 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 TABLE
pero 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 TABLE
posterior reducirá el .ibd
archivo de espacio de tabla para cualquier tabla InnoDB.