2011-01-15

InnoDB ist riesig ibdata1 verkleinern

Vor einiger Zeit, mitten im Landtagswahlkampf hatte ich massive Probleme mit einer meiner XEN Instanzen, die virtuelle Platte lief permanent voll. Nach einigem Suchen stellte ich folgendes fest:

websrv:~# ls -lah /var/lib/mysql/ibdata1
-rw-rw---- 1 mysql mysql 9,7G 15. Jan 01:52 /var/lib/mysql/ibdata1

Da ich damals und auch heute nach 30 Minuten immer noch keine Lösung hatte die Datei klein zu kriegen, habe ich einfach die Festplatte vergrößert. Interessanter weise stagnierte die Dateigröße bei diesen 9,7GB, es war mir trotzdem zuviel...

Heute habe ich mich erneut auf die Suche gemacht und nach knapp einer Stunde auch einen vielversprechenden Ansatz gefunden. Ich habe diesen auf meinem Debian lenny leicht abgewandelt umgesetzt:

  1. mysqldump --all-databases -p > dbs.sql
  2. "innodb_file_per_table" in den Abschintt [mysqld] meiner /etc/mysql/my.cnf geschrieben
  3. /etc/init.d/mysql stop
  4. (da ich Sicherheit liebe nicht direkt gelöscht) mkdir /root/old-ibdata
  5. mv /var/lib/mysql/ibdata1 /root/old-ibdata/
  6. mv /var/lib/mysql/ib_logfile* /root/old-ibdata/
  7. /etc/init.d/mysql start
  8. mysql -u root -p < dbs.sql
Ergebnis ist eine nur noch 18MB große InnoDB:

websrv:~# ls -lah /var/lib/mysql/ibdata1
-rw-rw---- 1 mysql mysql 18M 15. Jan 01:55 /var/lib/mysql/ibdata1

Meine Webseiten scheinen alle noch/wieder sauber zu laufen, dennoch lasse ich die Sicherung noch einen Moment lang liegen, man weiß ja nie. Was ich noch nicht gemacht habe ist "OPTIMIZE TABLE ", das schaue ich mir an, wenn ich das nächste Mal unzufrieden bin!

Kommentare:

Christian Rehkopf hat gesagt…

Der Schritt 2 führt zum totalausfall des mySQL-Servers, wenn man viele Datenbanken hat.
Wir haben ca. 120 Datenbanken und je ca. 40 cache-tables mit InnoDB und das war dann der overkill für den filehandler.
Kann man zwar in der myconf anpassen, aber ist ein unnötiger Speicherkiller.

MfG

C.R

www.crnet.de

gunni hat gesagt…

Klar ist die ibdata nur noch so klein. Die Daten liegen jetzt ja in /var/lib/mysql/DBNAME
Aber Platz sollte ja trotzdem gespart sein, nur den Platz in DBNAME muss man ja mit berücksichtigen.

scott grin hat gesagt…

Your blog is great. I would love to talk about this topic whole day..I shared it with my valuable friends. I like the way you are managing , I will be in touchscharmlippen verkleinerung