• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Anleitung] MySQL Shell-Skripts für Datendump/Performance

Bulli

Newbie
Hi,

ich habe hier zwei Scripts für Mysql-Datenbanken , die ich für sehr nützlich halte. Ich habe immer nach solchen Lösungen gesucht und nun ganz passable Lösungen für die Probleme Datensicherung und Performance-Erhalt gefunden.

Als Administrator bin ich bemüht, den Server und die Komponenten schnell zu halten. Bei MySQL-Datenbanken wird die Performance nach vielen Änderungen am Datenbestand deutlich schlechter. Darum werden Seiten immer langsamer geladen, wenn sie Daten aus der Datenbank abrufen müssen. Der Grund ist, weil Datenbanken eben auch auf der Festplatte gespeichert werden und allmählich Fragmentieren - also auf der Festplatte verstreut werden. Das kann man schon durch gute Planung berücksichtigen und Tabellen, bei denen viele Änderungen zu erwarten sind, in eine eigene Datenbank setzen. Aber das ist nicht immer möglich und wer Erfahrung hat, weiß, dass man Anfangs nicht immer wissen kann, ob das nötig oder überhaupt zweckmäßig ist.

Ganz sicher ist es, die Datenbanken regelmäßig neu aufsetzen. Also löschen und wiederherstellen. Ich habe das bisher von Hand einmal in der Woche gemacht. Das war kein großes Problem, aber es geht auch einfacher. Mit einem Shell-Skript ( FILE 1 ) habe ich das Problem nun gelöst. Das Script wird automatisch per Cronjob (bei mir einmal pro Tag) aufgerufen und setzt die Datenbanken neu auf. Also erst wird die Datenbank gedumpt, dann alle alten Tabellen aus der Datenbank gelöscht und schließlich wieder hergestellt.Am Ende werden die Dumpfiles wieder gelöscht und das Verzeichnis bereinigt.

Für den Sicherheitsdump von Datenbanken, um Datenverlust vorzubeugen, nutze ich ein anderes Shell-Script ( FILE 2 ). Es erstellt alle drei Stunden Dumpfiles aller Datenbanken und ich kann zur Not jede Datenbank daraus wiederherstellen. Dazu werden die Datenbanken komprimiert auf dem Server gespeichert. Jeder Dump wird drei Tage aufbewahrt, bevor er (auch automatisch vom Script) gelöscht wird. So kann ich zur Not den aktuellsten (heilen) Datenbestand herunterladen und die Datenbanken per PhpMyAdmin von Hand (oder natürlich auch per SSH) wiederherstellen.


Wie gehe ich vor, um das einzurichten:

Zunächst lege ich im Root-Verzeichnis zwei Ordner an. Bei mir sind das /root/dbbacks für die Sicherheitsdumps und /root/dbreset für die Performancedumps. Getrennte Verzeichnisse müssen sein, weil die Dumps unterschiedlich schnell vom jeweiligen Script entsorgt werden. Das könnte man sicher auch Programmiererisch lösen, aber ich finde es so einfach übersichtlicher.

Im Terminal ausführen:

ssh: mkdir /root/dbbacks
ssh: mkdir /root/dbreset


Den erstellten Verzeichnissen verpasse ich nun die bötigen Rechte, damit Dateien erstellt,gelöscht und ausgeführt werden können.

Also die Rechte am Besten auf 777 setzen:

ssh: chmod 777 /root/dbbacks
ssh: chmod 777 /root/dbreset


Dann lade ich die beiden Shell-Scripts auf den Server in das Root-Verzeichnis. Dahin, weil sie sich innerhalb der angelegten Ordner natürlich selbst löschen würden, wenn sie aufgerufen werden. Das Hochladen kann man auf verschiedenen Wegen machen (FTP,SSH oder SCP). Als Root, solltet ihr wissen, wie das geht. Wichtig ist, die Scripts ausführbar zu machen.

Also:

cd /root
ssh: chmod 777 dbbacks.sh
ssh: chmod 777 dbreset.sh


Zuletzt müssen die Cronjobs angelegt werden. Ich verwende Plesk dafür und kann dort für den Root Cronjobs anlegen. Aber es geht auch per SSH mit einem Editor (vi). Dazu die Datei crontab öffnen...

crontab -e

...und folgende Zeilen anhängen:

5 */3 * * * /root/dbbacks.sh >/dev/null 2>&1
30 6 * * * /root/dbreset.sh >/dev/null 2>&1


Der erste Cronjob wird täglich alle 3 Stunden in Minute 5 (also 3:05, 6:05, 9:05 usw.) ausgeführt. Der Untere täglich um 6:30 Uhr. Natürlich kann das individuell angepasst werden.

Dann die Datei wieder speichern:

:wq

Prüfen, ob das Eintragen erfolgreich war:

ssh: crontab -l


Fertig!

LG Bulli


Hier noch die Dateien. Nicht vergessen, vor dem Ausprobieren, eine Sicherheitskopie der Datenbank(en) erstellen !

Für die Verwendung, einfach den Namen des Datenbankbenutzers, dessen Passwort und den Datenbanknamen austauschen:


FILE 1 (dbreset.sh):

Code:
#!/bin/sh

# Variablen definieren
RESETDIR=/root/dbreset/
DBUSER=USERNAME ANGEBEN
DBPASS=PASSWORT ANGEBEN

# Pfade suchen
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)


####################################################  Diesen Teil je Datenbank wiederholt in das Script eintragen.

DBASE=DATENBANKNAME ANGEBEN
DBASEFILE=$RESETDIR$DBASE.sql

# Datenbank speichern
mysqldump -u $DBUSER -p$DBPASS $DBASE > $DBASEFILE

# Gespeicherte Datei ausfuehrbar machen
chmod u=rwx,g-rwx,o+rwx $DBASEFILE 

# Alle Tabellen der Datenbank loeschen
TABLES=$($MYSQL -u $DBUSER -p$DBPASS $DBASE -e 'show tables' | $AWK '{ print $1}' | $GREP -v '^Tables' )

for t in $TABLES
do
	$MYSQL -u $DBUSER -p$DBPASS  $DBASE -e "drop table $t"
done

# Datenbank wiederherstellen
$MYSQL -u $DBUSER -p$DBPASS $DBASE < $DBASEFILE


####################################################

# Zuletzt die gespeicherte(n) Dateien loeschen
find $RESETDIR -exec rm {} \;

# Script beenden
exit 0;

FILE 2 (dbbacks.sh):

Code:
#!/bin/sh

DATUM=`date +%y%m%d%H`
DUMPDIR=/root/dbbacks/
DBUSER=USERNAME ANGEBEN
DBPASS=PASSWORT ANGEBEN

####################################################  Diesen Teil je Datenbank wiederholt in das Script eintragen.

DBASE=DATENBANKNAME ANGEBEN
DBASEFILE=$DUMPDIR$DBASE$DATUM.sql

# Datenbank speichern
mysqldump -u $DBUSER -p$DBPASS $DBASE > $DBASEFILE

# Gespeicherte Datei ausfuehrbar machen
chmod u=rwx,g-rwx,o+rwx $DBASEFILE

# Gespeicherte Datei komprimieren
gzip $DBASEFILE

####################################################

# Zuletzt die Dateien loeschen, die aelter als 3 Tage sind
find $DUMPDIR -mtime +3 -exec rm {} \;

# Script beenden
exit 0;
 
OP
B

Bulli

Newbie
Hier noch ein Teil, der die Datenbank dann an euer Mailfach sendet, falls ihr die auch Lokal abspeichern wollt. Damit nicht jeder Dump auch gesendet wird, setze ich eine Bedingung. Nur den 12 Uhr-Dump senden. Den folgenden Codeteil einfach an die jeweiligen Abschnitte der Datei dbbacks.sh hängen.

Code:
MAILADR=deine@mailadresse.tl
DATEI=$DBASEFILE.gz

# Komprimierte Dateien als Mail versenden

if [[ `date +%H` == 12 ]]
then

mail -a $DATEI -s "DBDumps" $MAILADR

fi

Hinweis: Mit -a $DATEI1 -a $DATEI2 -a $DATEI3 können auch mehrere Dateien angehängt werden.
 
Oben