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)

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.