Wie groß ist zu groß für eine ibdata-Datei?


9

Meine ibdata-Datei ist sehr groß, zumindest scheint sie mir sehr groß zu sein. Ist das übertrieben oder nicht so schlimm?

-rw-rw---- 1 mysql mysql  15G Apr 18 10:11 ibdata1

4
Ihre ibdata-Datei ist sehr klein.
Jeff Ferland

Wäre es für die Leistung besser oder schlechter, diese Datei in kleinere Teile (z. B. 4G) aufzuteilen?
Nachito

Antworten:


13

Wenn dies ein Problem sein kann

Wenn Sie show table statusauf einer Tabelle ausgeführt werden und das Data_freeFeld den größten Teil der ibdata1Dateigröße ausmacht, wird möglicherweise viel Speicherplatz verschwendet. Durch viel Einfügen / Löschen wird dies zu einem Problem. Wenn dies der Fall ist und vorübergehende Einfügungen und Löschungen den Großteil Ihrer Daten ausmachen, haben Sie ein gutes Argument für eine Datei pro Tabelle.

Das ist jedoch kein automatisches "Ja". Es wird weltweit viel über die interne Fragmentierung in InnoDB-Dateien gesprochen, aber wenn Sie sie als Datei pro Tabelle in ein Dateisystem einfügen, wird Ihre Fragmentierung nur auf die Dateisystemebene anstatt auf die Datenbankebene verschoben.

Warum dies normalerweise kein Problem ist

Stellen Sie sich Ihre InnoDB-Datei als Dateisystem und nicht als Datei vor. Wenn Sie viele Dateien haben, benötigen Sie ein großes Dateisystem.

Zum größten Teil können Dateisysteme sehr gut skaliert werden, um Terabyte an Daten und unzählige Dateien zu verarbeiten. Manchmal treten Probleme mit einer schlechten Indizierung auf (z. B. Begrenzung der Anzahl der Dateien in einem Verzeichnis vor einer Auswirkung auf die Leistung), aber zum größten Teil kann das moderne Dateisystem weit in den Terabyte-Bereich vordringen.

InnoDB funktioniert genauso. Die Größe Ihrer Datendatei kann sehr groß sein ... und wie bei großen Dateisystemen kann dies zu Problemen beim Sichern Ihrer Daten führen. Genauso wie das Aufteilen Ihres Dateisystems in mehrere Partitionen bei diesem Problem nicht hilft, hilft auch nicht der Versuch, innodb zu manipulieren. Obwohl Sie innodb_file_per_table verwenden können , empfehle ich es selten.

Ähnlich wie bei Ihrem Dateisystem besteht die bessere Antwort darin, die Grenzen intern zu kennen und darin zu arbeiten. Indizes verstehen und entsprechend anwenden. Versuchen Sie nicht, InnoDB aufzuteilen, es ist nicht dafür gedacht.

Da ich Schwierigkeiten habe, das Konzept konstruktiv zu vermitteln, lesen wir hier kurz, dass Wörter so besser sind als ich: Terabyte sind keine großen Datenmengen, Petabyte .

Ich erinnere mich an eine wirklich sehr alte MySQL-Marketingfolie, auf der der Kunde ein Data Warehouse mit einigen Terabyte betrieb. Vor vielen Jahren. InnoDB oder MyISAM, beide würden funktionieren. Dies ist Standard MySQL-Zeug von der Stange.

Schwitzen Sie nicht eine 15 GB Datenbank.


Es sieht so aus, als wäre ich zu knapp 50% ausgelastet. InnoDB free: 7364608 kB
Nachito

@nachito Das klingt so, als ob es in Ordnung sein sollte. Wenn Sie der Meinung sind, dass Sie den Speicherplatz für das Dateisystem wieder benötigen, fordern Sie ihn zurück. Wenn Sie sich nur Sorgen um die Leistung machen, tun Sie es nicht. Aus Gründen der Leistung ist es außerdem am besten, Ihre Datenbankdateien auf einer eigenen Partition zu belassen. Wenn Sie sich also auf die Leistung konzentrieren, wird ohnehin keine brauchbare Rückforderung angezeigt.
Jeff Ferland

6

ibdata-Dateien werden nicht verkleinert. Wenn Sie kürzlich einige Tabellen gelöscht oder viele Zeilen entfernt haben, gibt innodb in Ihrer Konfiguration den freien Speicherplatz nicht an das Dateisystem zurück. Ich würde dir vorschlagen:

  • Sichern Sie alle Ihre Daten, z. B. mit mysqldump
  • zur Anweisung my.cnf innodb_file_per_table hinzufügen
  • Starten Sie MySQL neu
  • Löschen Sie alle Datenbanken mit der innodb engine
  • hör auf mysql
  • Entfernen Sie die ibdata-Datei
  • rm ib_logfile [01]
  • Starten Sie MySQL und überprüfen Sie Syslog, ob alles in Ordnung ist
  • Laden Sie Ihren Dump neu

Auf diese Weise können Sie den Speicherplatz zurückfordern, wenn Sie eine Innodb-Tabelle / Datenbank löschen. Zugeordnete IDB-Dateien werden sofort entfernt.


Ich verstehe, dass es niemals schrumpfen wird, ohne die Tabellen zu entleeren und neu zu laden. Wenn ich jedoch InnoDB-Datenbanken gelöscht habe, wird dieser "freie" Speicherplatz verwendet, bevor er wieder wächst?
Nachito

1
@nachito Ja, das wird es.
Jeff Ferland


Ihre Antwort ist nur ein einfacher Vorschlag, ohne das Problem zu trüben, wie es meine Antwort anscheinend getan hat. +1 !!!
RolandoMySQLDBA

1
Nun, die Antwort ist eine Lösung, um den von den Datendateien belegten Speicherplatz zu reduzieren, aber es ist keine Diskussion über die damit verbundenen Vorteile, und das ist die Frage, wie ich sie lese. Ist eine 15-GB-Ibdata-Datei eine große Sache?
Jeff Ferland
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.