Diferencia sustancial entre el tamaño de la base de datos en MySQL y el tamaño real en el disco

8

Cuando verifico 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 verifico el tamaño en el 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 el espacio usado y el libre proporcionado por Maria DB y lo comparo con las cifras del 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 la ejecución de 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)
Max
fuente
Todas las tablas de InnoDB? Cuantas mesas
gbn

Respuestas:

5

Si está utilizando tablas InnoDB, el tamaño de sus archivos ibdata crecerá con el tiempo. Entonces, si emite una DELETEdeclaración, el tamaño de su base de datos se reducirá, pero el archivo ibdata seguirá siendo el mismo (no se reducirá).

Si no está utilizando la innodb_file_per_tableopción, la única forma de recuperar el espacio es volcando la base de datos y restaurando desde el archivo de volcado.

Sin embargo, si está utilizando innodb_file_per_table, puede emitir un

ALTER TABLE foo ENGINE=InnoDB;

en tablas que crecen demasiado para reclamar el espacio en disco.

Derek Downey
fuente
¿Por qué el tamaño de los archivos ibdata no se reduce si el tamaño de la base de datos lo hace?
Max
Aparentemente es una 'decisión de diseño' hecha por los desarrolladores de innodb, explicada brevemente en los comentarios de este error . Hace unos años se realizó una solicitud de función similar , pero no se ha hecho nada al respecto. No estoy de acuerdo con la decisión de diseño personalmente, pero es lo que es.
Derek Downey el
¿Por qué no optimizar el espacio de recuperación de la tabla? ¿o es solo "ordenado", no "encogimiento"?
gbn
1
@gbn "Para las tablas InnoDB, OPTIMIZE TABLE se asigna a ALTER TABLE, que reconstruye la tabla para actualizar las estadísticas del índice y liberar espacio no utilizado en el índice agrupado". src Entonces sí, solo un poco ordenado. La misma razón por la que un AlTER TABLE foo ENGINE=InnoDBsin innodb_file_per_table=1no encogerá la ibdata.
Derek Downey el