MySQL-Datenverzeichnis verschieben

Thema der vergangenen zwei Stunden war eine ziemlich gefüllte root-Partition eines Servers.
Dank des Monitoring-Systems kam das Thema glücklicherweise rechtzeitig auf den Plan und konnte erledigt worden:
2011-11-03_182244

Der Datenkonsument war relativ schnell identifiziert: MySQL
2011-11-03_182648

Nun gibt es zwei Möglichkeiten:

1. die auf der MySQL-Homepage beschriebene Anleitung zur Verkleinerung der InnoDb-Logfiles (ib_logfile*): http://dev.mysql.com/doc/refman/5.0/en/innodb-data-log-reconfiguration.html

Zusammengefasst wird dort beschrieben, dass alle Datenbanken gesichert, die logfiles gelöscht und die Datenbanken wieder hergestellt werden sollen.
Nachdem die Sicherungsfiles der Datenbanken auch sehr viel Platz in Anspruch genommen haben, habe ich diese Möglichkeit als wenig sinnvoll verworfen.

2. die MySQL-Daten auf eine zusätzliche, größere Partition verschieben – die Möglichkeit der Wahl.

Folgende Schritte zur Reproduktion:

1. Weitere Festplatte einbauen / der virtuellen Maschine hinzufügen

2. Platte mit cfdisk partitionieren und via mkfs ein neues Filesystem anlegen

# cfdisk /dev/sdb
# mkfs.ext3 –m 1 /dev/sdb1

3. Den neu gewonnenen Speicherplatz per mnt an eine sinnvolle Stelle mounten

# mkdir /mnt/64GB
# mount /dev/sdb1 /mnt/64GB

4. Sinnvollerweise gleich mit Hilfe von vol_id die Volume-Id auslesen und in die fstab einfügen Zwinkerndes Smiley

5. Jetzt stoppen wir die MySQL-Instanz und verschieben die Daten auf die neue Partition. Der neue Platz wird per Symlink an die alte Position verlinkt – das spart eine Menge Konfigurationsarbeit.

# /etc/init.d/mysql stop
# mv /var/lib/mysql/ /mnt/64GB
# mv /var/lib/mysql /var/lib/mysql.bak
# ln –s /var/lib/mysql /mnt/64GB

6. Man könnte meinen, damit wäre alles erledigt und der MySQL-Daemon kann wieder gestartet werden – ganz so einfach ists nicht. Ubuntu hat noch ein nettes Gimmick “AppArmor” an Bord, das will über die neue Daten-Location informiert werden. Dafür editieren wir die entsprechende AppArmor-Konfiguration und fügen zwei Zeilen hinzu:

# vim /etc/apparmor.d/usr.sbin.mysqld
- jetzt nach folgenden beiden Zeilen suchen:
 /var/lib/mysql/ r,
 /var/lib/mysql/** rwk,
- diese beiden Zeilen werden dupliziert und mit der Information über die neue Partition versehen:
 /mnt/64GB/ r,
 /mnt/64GB/** rwk,
- die Datei speichern und den AppArmor-Daemon neu starten
# /etc/init.d/apparmor/restart

7. Nun ist auch der MySQL-Dienst bereit für die weitere Arbeit

# /etc/init.d/mysql start

Das wars schon – ich hoffe, der Post ist halbwegs verständlich. Smiley