«

»

Feb 14

Artikel drucken

[howto] fragmentierte Tabellen in MySQL optimieren

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!

PinExt [howto] fragmentierte Tabellen in MySQL optimieren

das dürfte auch interessant sein:

  1. 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...
  2. [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....

Permanentlink zu diesem Beitrag: http://blog.diegelernten.de/2012/02/14/howto-fragmentierte-tabellen-in-mysql-optimieren/

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Connect with Facebook