PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inkrementell Sicherung der MySQL Datenbank



mr_kaktus
12.02.07, 16:41
Hi @all

ich hab mir ein kleines Skript geschrieben, der mir mit mysqldump und hilfe des Crond die MySQL Datenbank jeden abend Vollständig sichert. Nach einer bestimmten Zeit lösche ich ich die Alten Sicherungen weg, damit das System nicht voll läuft.
Jetzt wollte ich mal in die Runde fragen, gibt es schon fertige Skripte mit denen man die MySQL Datenbank Automatisch Inkrementell jedenabend sichern kann? Ich hab schon im Forum und im netzt gesucht, aber ich hab nicht genau das gefunden, was ich gesucht habe.
Vielleicht hat mir jemand ein Tipp?

403
12.02.07, 18:33
3. google Link:

z.B.:

http://sourceforge.net/projects/phpmyib

mr_kaktus
13.02.07, 09:12
Das hatte ich schon gesehen, aber ich das ist doch in PHP geschriben, ich will das es über Cron läuft.
Aber jetzt habe ich mir das Skript mal genauer angeschaut, verstehe ich das richtig, hier wird PHP über die Konsole ausgeführt?!

marce
13.02.07, 10:22
Sieht so aus. Stört Dich das?

mr_kaktus
13.02.07, 10:33
Naja, sagen wir das mal so, Perl oder Bash wäre mir lieber gewesen.
Ich schau mir das mal genauer an, mal schauen vielleicht kann ich da noch was lernen. THX

403
13.02.07, 16:40
ja php geht in der Konsole:

Testten kannst du das nach EIngabe von php in der Komsole mit:


<?php
phpinfo();
?>


Am besten schaust du mal in das Skript herein, und fuehrst es als user aus, um mal zu
sehen was fuer Fehler kommen. Der Rest ist dann Arbeit.

IN PERL:

http://www.zzee.com/zmdb/


noch ein google Link :ugly:

bla!zilla
13.02.07, 16:42
Wie wäre es mit einer selbst geschriebenen Kombination aus mysqldump und diff?

framp
13.02.07, 19:00
Multipost! => http://www.linux-club.de/ftopic76635.html

rudi_m
13.02.07, 19:43
ich habe mir mal etwas gebastelt speziell wegen unserer sehr grossen tables.

Dazu habe ich erstmal das perl script "mysqlhotcopy" so veraendert, so dass es rsync statt cp verwendet.

Dann ein backup bash script geschrieben das prinzipiell folgendes macht:
1. rsync des kompletten /var/lib/mysql nach /backup/mysql
(also erstmal ohne table locks - das backup koennte noch inkonsistent sein)
2 mysqlhotcopy nach backup/mysql
(also diesmal mit table locks, geht aber sehr schnell weil ja kurz vorher schon rsynced wurde)

achja mysqlhotcopy mit --noindices aufgerufen, da man die Indices im Fall der Faelle eh neu bauen kann (myisamchk -rq).

Wenn das backupscript fertig ist laeuft ein anderes script das mehrere snapshots rotieren laesst und mittels hardlinks (platzsparend) den neusten snapshot anlegt.

mr_kaktus
13.02.07, 20:36
@403
Danke für den Link.

@bla!zilla
Ich hab mir da schon was überlegt, ich werde wenn es fertig ist mal posten!

@framp :ugly: :rolleyes:

@rudi_m
Ist auch eine Sehr Interessante Lösung, kannst mal bitte posten?

rudi_m
13.02.07, 21:54
Ist auch eine Sehr Interessante Lösung, kannst mal bitte posten?
Meine Loesung war recht fix zusammengeschustert - lief aber immerhin 1 Jahr stabil.

Als erstes solltest Du dich ein bisschen mit mysqlhotcopy vertraut machen.
http://dev.mysql.com/doc/refman/5.0/en/mysqlhotcopy.html

Mann kann damit also die table files von mysql physisch (aber in konsistentem Zustand) kopieren.

Da sich viele tables aber gar nicht jeden Tag aendern (bzw. vor dem hotcopy eh rsynced wird) habe ich um Zeit zu sparen in mysqlhotcopy die Zeile
my $cp = $method;
mit
my $cp = "cp -u";
ersetzt.
(Oben hatte ich geschrieben dass ich hier auch rsync benutze - das hatte sich aber als unguenstig erwiesen, da im lokalen Fall rsyncen keine Zeitersparnis gegenueber "cp -u" bringt, aber mehr CPU frisst als das stupide drueber kopieren.)

das eigentliche backupscript sieht dann so aus:

#!/bin/bash
bakdir=/media/disk/mysql_hotcopy/

#first rsync - then patched mysqlhotcopy (cp -u)

echo -e "`date +%Y%m%d-%H:%M:%S` - local rsync start\n"
rsync -av --delete --exclude="*.MYI" --exclude="*.ISM" --exclude="mysql.sock" --delete-excluded /var/lib/mysql/ "$bakdir"

sleep 1
echo -e "\n`date +%Y%m%d-%H:%M:%S` - local rsync done, now mysqlhotcopy....\n"
/root/bin/mysqlhotcopy.patched -u root -p password --addtodest --noindices --regexp=".*" "$bakdir"

echo -e "\n`date +%Y%m%d-%H:%M:%S` - mysqlhotcopy done - bye\n"


Danach hat man also ein lokales konsistentes backup seiner mysql-DB (ohne Indices).
- auch bei grossen/vielen tables recht schnell
- die tables waren nur kurze Zeit locked

Dieses lokale backup sichere ich dann mittels folgender methode incrementell ueber netzwerk. Mehrere Snashots werden platzsparend aufbewahrt:
http://www.heinlein-support.de/web//rsync-backup/
(ein paar sachen habe ich in diesen scripten allerdings auch veraendert)

PS: Man koennte auch Direkt ueber netz sichern wenn man eben doch rsync statt "cp -u" verwendet - in meinem Fall war es allerdings besser erst ein lokales backup zu erzeugen das man dann in aller Ruhe (mit nur 768 kb/s upload) nach remote rsyncen kann.