Erheblicher Unterschied zwischen der Datenbankgröße unter MySQL und der tatsächlichen Größe auf der Festplatte

8

Wenn ich die Größe meiner Datenbanken unter MySQL überprüfe, erhalte ich Folgendes:

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 |
+--------------------+----------------------+------------------+

Wenn ich die Größe auf der Festplatte überprüfe, erhalte ich Folgendes:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Wenn ich sowohl genutzten als auch freien Speicherplatz von Maria DB kombiniere und ihn mit Festplattenzahlen vergleiche, habe ich Folgendes:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

F: Ist es normal, so viel Overhead auf der Festplatte zu haben? Kann ich irgendetwas tun, um ihn zu reduzieren?

Zu Ihrer Information Ich dachte, das Ausführen einer MySQL-Optimierung würde helfen ( mit diesem Befehl ). Es hat zwar die Größe der Datenbanken verringert, aber die Größe der Dateien auf der Festplatte nicht geändert.

Zusätzliche Information:

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
quelle
Alle InnoDB-Tabellen? Wie viele Tische?
Gbn

Antworten:

5

Wenn Sie InnoDB-Tabellen verwenden, nimmt die Größe Ihrer ibdata-Dateien mit der Zeit zu. Wenn Sie also eine DELETEAnweisung ausgeben , wird Ihre Datenbankgröße reduziert, aber die ibdata-Datei bleibt gleich (nicht reduziert).

Wenn Sie die innodb_file_per_tableOption nicht verwenden , können Sie den Speicherplatz nur zurückfordern, indem Sie die Datenbank sichern und aus dem Dumpfile wiederherstellen.

Wenn Sie jedoch verwenden innodb_file_per_table, können Sie eine ausgeben

ALTER TABLE foo ENGINE=InnoDB;

auf Tabellen, die zu groß werden, um den Speicherplatz zurückzugewinnen.

Derek Downey
quelle
Warum verringert sich die Größe der ibdata-Dateien nicht, wenn die Größe der Datenbank dies tut?
Max
Es ist anscheinend eine 'Designentscheidung', die von Entwicklern von innodb getroffen wurde und in den Kommentaren dieses Fehlers kurz erklärt wird . Eine ähnliche Feature-Anfrage wurde vor einigen Jahren gestellt, aber es wurde nichts dagegen unternommen. Ich bin mit der Designentscheidung persönlich nicht einverstanden, aber es ist, was es ist.
Derek Downey
Warum wurde der Platz für die Tabellenrückgewinnung nicht optimiert? oder ist das nur "ordentlich" nicht "schrumpfen"?
Gbn
1
@gbn "Bei InnoDB-Tabellen wird OPTIMIZE TABLE ALTER TABLE zugeordnet, wodurch die Tabelle neu erstellt wird, um die Indexstatistik zu aktualisieren und nicht verwendeten Speicherplatz im Clustered-Index freizugeben." src Also ja, nur ordentlich. Der gleiche Grund, warum ein AlTER TABLE foo ENGINE=InnoDBohne innodb_file_per_table=1ibdata nicht schrumpft.
Derek Downey