einige unserer Kunden betreiben Dienste, welche große Datenmengen in MySQL Datenbanken speichern. Durch ständigen Traffic werden die betroffenen Tabellen über die Zeit relativ fragmentiert, was Performanceeinbußen bedeutet.
praktisches Bash-Skript
einfach folgendes Bash-Skript abspeichern
#!/bin/sh # Grenzwerte # Prozentwert wieviel mindestens fragmentiert sein soll PROZENT='55' # Mindestgroesse der Tabelle ZEILEN='300' # ----- ab hier nichts mehr ändern ---- echo -n "MySQL Benutzername: " ; read MYSQLROOTUSR echo -n "MySQL Passwort: " ; stty -echo ; read MYSQLROOTPW ; stty echo ; echo mysql -u $MYSQLROOTUSR -p"$MYSQLROOTPW" -NBe "SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH, DATA_FREE, (DATA_FREE*100/DATA_LENGTH) as PRC FROM INFORMATION_SCHEMA.TABLES WHERE (DATA_FREE*100/DATA_LENGTH) >= $PROZENT AND TABLE_ROWS >= $ZEILEN ORDER BY TABLE_SCHEMA, PRC DESC;" | while read TABLE_SCHEMA TABLE_NAME TABLE_ROWS DATA_LENGTH INDEX_LENGTH DATA_FREE PRC; do echo "$TABLE_SCHEMA.$TABLE_NAME is $PRC% fragmented and has $TABLE_ROWS rows." mysql -u "$MYSQLROOTUSR" -p"$MYSQLROOTPW" -NBe "OPTIMIZE TABLE $TABLE_NAME;" "$TABLE_SCHEMA" done
und mit chmod +x ausführbar machen.
Das Skript kann jetzt manuell ausgeführt werden, wobei jedes Mal nach Benutzername & Passwort des mysql-root-Accounts gefragt wird.
Automatisieren
Um das Skript auch mittels Eintrag in der Cron-Tabelle ausführen zu lassen, zB. nachts wenn der load auf dem Server am geringsten ist, muß ein paar kleine Änderungen vornehmen:
#!/bin/sh # Benutzername & Passwort des MySQL Root Users MYSQLROOTUSR='root' MYSQLROOTPW='passwort' # Grenzwerte # Prozentwert wieviel mindestens fragmentiert sein soll PROZENT='55' # Mindestgroesse der Tabelle ZEILEN='300' # ----- ab hier nichts mehr ändern ---- mysql -u $MYSQLROOTUSR -p"$MYSQLROOTPW" -NBe "SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH, DATA_FREE, (DATA_FREE*100/DATA_LENGTH) as PRC FROM INFORMATION_SCHEMA.TABLES WHERE (DATA_FREE*100/DATA_LENGTH) >= $PROZENT AND TABLE_ROWS >= $ZEILEN ORDER BY TABLE_SCHEMA, PRC DESC;" | while read TABLE_SCHEMA TABLE_NAME TABLE_ROWS DATA_LENGTH INDEX_LENGTH DATA_FREE PRC; do echo "$TABLE_SCHEMA.$TABLE_NAME is $PRC% fragmented and has $TABLE_ROWS rows." mysql -u "$MYSQLROOTUSR" -p"$MYSQLROOTPW" -NBe "OPTIMIZE TABLE $TABLE_NAME;" "$TABLE_SCHEMA" done
und mit sudo crontab -e folgende Zeile in die crontab eintragen:
0 02 * * * /pfad/zum/skript
Beim schließen wird der Eintrag geprüft und aktiviert. Von nun an wird jede Nacht um 2 Uhr morgens das Skript ausgeführt!
![Pin It PinExt [howto] fragmentierte Tabellen in MySQL optimieren](http://assets.pinterest.com/images/PinExt.png)
das dürfte auch interessant sein:
- Apache Patch für ISPConfig Sites wie kürzlich bekannt wurde, gibt es ein großes Loch im Apache Server aller couleur. Es betrifft alle Apache 1.3 Versionen, und alle Apache 2.0 Releases! [Update: es gibt sogar eine...
- [howto] sichere Passwörter generieren ohne Panik zu verbreiten oder in mathematische Sphären ausschweifen zu wollen: ein kompliziertes, aber auch langes Passwort eine der besten Möglichkeiten, sich und seine Daten vor fremdem Zugriff zu schützen....