Diferencia sustancial entre el tamaño de la base de datos bajo MySQL y el tamaño real en el disco
Pregunta
Cuando reviso el tamaño de mis bases de datos en MySQL, obtengo esto:
MariaDB [(none)]> SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB", sum( data_free )/ 1024 / 1024 "Free Space in MB" FROM information_schema.TABLES GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco | 245.75000000 | 34.00000000 |
| drupal | 892.15625000 | 216.00000000 |
+--------------------+----------------------+------------------+
Cuando reviso el tamaño del disco, obtengo esto:
$ sudo du -h --max-depth=1 /var/lib/mysql/
317M /var/lib/mysql/alfresco
1.4G /var/lib/mysql/drupal
Si combino espacio usado y libre dado por Maria DB y lo comparo con las cifras de disco, tengo lo siguiente:
alfresco: DB=279MB DISK=317MB (+14%)
drupal: DB=1100MB DISK=1433MB (+30%)
P: ¿Es normal tener tanta sobrecarga en el disco / ¿Hay algo que pueda hacer para reducirlo?
Para su información, pensé que ejecutar una optimización mysql ayudaría (Usando ese comando), redujo el tamaño de las bases de datos, pero no cambió el tamaño de los archivos en el disco.
Información adicional:
server: ubuntu server 10.04 LTS
DB server: MariaDB
DB engine: InnoDB v10 (for all tables)
Table collation: utf8_general_ci
Nb Drupal tables: 416 (0.80MB overhead per table)
Nb Alfresco tables: 84 (0.45MB overhead per table)
Solución
Si está utilizando tablas innoDB, el tamaño de sus archivos IBData crecerá con el tiempo. Entonces, si emites DELETE
Declaración, el tamaño de su base de datos se reducirá, pero el archivo IBData seguirá siendo el mismo (no reducir).
Si no esta usando innodb_file_per_table
Opción, la única forma de reclamar el espacio es descargar la base de datos y restaurar desde el archivo de basura.
Sin embargo, si estás usando innodb_file_per_table
, puedes emitir un
ALTER TABLE foo ENGINE=InnoDB;
en tablas que crecen demasiado para reclamar el espacio del disco.