Problem:

MySQL liefert bei einer sehr großen Datenbank plötzlich: "The table is full".
Dies kann Grundsätzlich drei Gründe haben:
a) Der Datenspeicher (Festplatte) ist voll.
b) Das Dateisystem kann keine größeren Dateien mehr verwalten.
c) Man hat mehr als 4G Einträge in der Datenbank-Tabelle.

Erklärung und Lösungen:

a) Festplatte voll:
Einfach Lösung: Neue Festplatte!

b) Dateisystem:
Das alte DOS/Windows-Format FAT kann lediglich Dateien bis 2 Gigabyte verwalten.
Das neuere Windows-Format FAT32 (VFAT) immerhin schon 4 GByte und NTFS sogar 2 Terrabyte.
Ältere Linux-Kernel (<2.2) schaffen ebenfalls nur bis 2 GByte (mit LFS sogar 4 GB). Das neuere Ext3-Filesystem mit einem Kernel ab 2.4 aber bis 4 TByte.
Der Vollständigkeit halber: MacOS schafft ebenfalls 2 TB.

Eine Lösung gibt es nur in Form eines anderen Dateisystems.

c) 4 Giga Einträge:
Keiner hätte es gedacht, aber es gibt es doch: Eine Beschränkung von MySQL auf 4 * 1024 * 1024 * 1024 = 4.294.967.296 Zeilen pro Tabelle.
Warum? Weil der Index mit 32-Bit-Zeiger ausgestattet ist.
In den meisten Fällen reicht dies auch vollkommen aus. In den wenigen Fällen wo er nicht ausreicht, sollte man sich eh überlegen auf ein stärkeres RDMS (z.B. Oracle) zu wechseln.

Wer dennoch bei MySQL bleiben will und eine 64-Bit-Hardware hat, kann aber den Index-Zeiger auf 64bit erweitern:

ALTER TABLE my_table MAX_ROWS=200000000000;

Aber Vorsicht: hiermit ist MySQL ne ganze Zeit lang beschäftigt da sowohl die MYI (die Index-Datei) als auch die MYD (die Daten-Datei) neu aufgebaut werden. Man braucht also ebenfalls nochmal soviel Platz auf dem Datenträger. Die Tabelle ist natürlich für die ganze Zeit gelockt.
(In meinem speziellen Fall hat es rund 48 Stunden gedauert.)

Kleiner Tipp noch: Wer bereits vorher weiß, daß seine Tabelle etwas größer wird, kann den MAX_ROWS-Parameter bereits beim CREATE TABLE mit angeben.

Kategorien:

Stichwörter:

mysql · table · full · alter · max_rows ·