MySQL Dump über Cronjob ( 2 von 3 laufen )

  • Thread starter Thread starter HxD
  • Start date Start date
H

HxD

Guest
Guten Tag,

folgendes Problem quält mich gerade ein bissal. Ich habe 3 Datenbanken, ai_chars, ai_realmd sowie ai_world. Nun wollte ich pro Tag von allen drei Datenbanken ein Backup machen. Nun habe ich mir gedacht, ich mache drei Shellscripte und lasse diese ( für jede Datenbank ein Shellscript ) zeitversetzt laufen.

Nun habe ich folgendes in die crontab geschrieben
Code:
13 3 * * * /ucb/chars_dump.sh
15 3 * * * /ucb/realmd_dump.sh
20 3 * * * /ucb/world_dump.sh

Die chars sowie realmd Datenbank sind gerademal 1-2 MB groß, die world Datenbank dagegen knapp 200 MB groß. Meine Shellscripte sehen wie folgt aus:

chars_dump.sh ( chmod 700 )
Code:
#!/bin/sh
FLDDATUM=`date '+%d-%m-%Y'`
Datum=`date '+%d-%m-%Y'`
mkdir /ucb/${FLDDATUM}
mysqldump -u root -pPASSWORT ai_chars > /ucb/ai_chars.sql
gzip -9 --best /ucb/ai_chars.sql
mv /ucb/ai_chars.sql.gz /ucb/${FLDDATUM}/ai_chars-${DATUM}.sql.gz

realmd_dump.sh ( chmod 700 )
Code:
#!/bin/sh
FLDDATUM=`date '+%d-%m-%Y'`
Datum=`date '+%d-%m-%Y'`
mysqldump -u root -pPASSWORT ai_realmd > /ucb/ai_realmd.sql
gzip -9 --best /ucb/ai_realmd.sql
mv /ucb/ai_realmd.sql.gz /ucb/${FLDDATUM}/ai_realmd-${DATUM}.sql.gz

world_dump.sh ( chmod 700 )
Code:
#!/bin/sh
FLDDATUM=`date '+%d-%m-%Y'`
Datum=`date '+%d-%m-%Y'`
mysqldump -u root -pPASSWORT ai_world > /ucb/ai_world.sql
gzip -9 --best /ucb/ai_world.sql
mv /ucb/ai_world.sql.gz /ucb/${FLDDATUM}/ai_world-${DATUM}.sql.gz

So, chars und realmd laufen durch, lediglich world nicht. Meistens tauchen die Backups von chars und realms direkt nach ein paar Sekunden auf, jedoch auch nach mehreren Minuten ( 15-30 Minuten ) spuckt mir der Server keine ai_world.sql.gz aus. Wenn ich jedoch die world_dump.sh manuell starte, dauert es keine 5 Minuten und das Backup wurde im entsprechenden Ordner ( Mit entprechendem Datum ) angelegt.

Wo ist mein Denkfehler? Der Cronjob geht nicht, obwohl die world_dump.sh exakt wie die realmd_dump.sh ist - Manuell funktioniert´se jedoch.

Irgendwie seh ich den Wald vor läuter Baumen nicht mehr :o

Bin für jede Hilfe dankbar!
 
Irgendwie seh ich den Wald vor läuter Baumen nicht mehr :o

Bin für jede Hilfe dankbar!

Ich vermute es kommt zu einem read lock.
Ich würde den Dump in einem Script anwerfen und in eine
Code:
for i in `echo schema1 schema2 schema3` ; do mysqldump --database $i  .... ; done
Schleife packen. Dann wird der nachfolgende Dump wirklich erst dann angestartet, wenn der vorherige beendet wurde.

selbstverständlich ist das Beispiel zum selber fertig schreiben.
 
PHP Script wa, ne, damit komm ich nicht klar, will ich auch garnicht, ich brauch eine Lösung auf Shellscript ebene...
 
Danke stuermer, wusste ich nicht, kannte das nur von PHP her! Werde mich dann mal ransetzen...
Kann geschlossen werden!
 
Bins doch nochmal, habe jetzt wie Matze vorgeschlagen hat, eine Schleife genommen, jedoch auch das funktioniert nicht wirklich. Ich verstehe jedoch nicht, wieso es bei einem read lock über Cronjob NICHT zu einer Sicherung kommt, aber zu einer, wenn ich das Script manuell starte?!

Nutze folgendes Script nun:

Code:
MyUSER="root"
MyPASS="passwd"
 
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

NOW="$(date +"%d-%m-%Y")"

DEST="/backup"

MBD="$DEST/$NOW"
 

FILE=""
DBS="chars realmd world"

IGGY="test mysql information_schema"
 
[ ! -d $MBD ] && mkdir -p $MBD || :
 
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
 
DBS="$($MYSQL -u $MyUSER -p$MyPASS -Bse 'show databases')"
 
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
	for i in $IGGY
	do
	    [ "$db" == "$i" ] && skipdb=1 || :
	done
    fi
 
    if [ "$skipdb" == "-1" ] ; then
	FILE="$MBD/$db.$NOW.sql.gz"
        $MYSQLDUMP -u $MyUSER -p$MyPASS $db | $GZIP -9 > $FILE
    fi
done

chars und realmd werden wiedermal angelegt, allerdings die world nicht. In diversen Foren und im MySQL Manual steht, man muss vorher den Zugriff auf die Datenbank beenden. Was jedoch bei dieser Anwendung nicht geht, also muss ich irgendwie die world automatisiert speichern können ohne die Anwendung vorher schließen zu müssen...
 
Poste mal die my.cnf. Eventuell ist die max_allowed_packet zu klein.

Bitte die Sektionen beachten.
[mysqldump]
socket = /var/run/mysql/mysql.sock
quick
max_allowed_packet = 16M

Also deutlich erhöhen bis es über den 200 MB ist.

Warum das nun per Hand klappt und per Cron nicht, kann mehrere Gründe haben.
Unter anderem konkurrierende Zugriffe.
Was Dir auf jeden Fall helfen dürfte, eine Blick in die messages, was denn für Meldungen von mysqldump ausgespuckt wurden.
Alternativ dessen Ausgabe in eine log umlenken.
Also
Code:
 >/var/log/dump.log 2>&1
z.B. dem Cronaufruf hinten anfügen.


Ansonsten hier noch die Optionen genau durchlesen z.B. lock-tables.
http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html
 
Last edited by a moderator:
Back
Top