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.