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

[SOLVED] Inkrementell Sicherung der MySQL Datenbank

mr_kaktus

Member
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?
 
OP
M

mr_kaktus

Member
Ich meine, dass nur dann ein Backup gemacht wird, wenn sich was in der Datenbank geändert hat. Aber wahrscheinlich kann man in MySQL kein richtiges Inkrementel backup machen oder, also sprich nur die Änderungen sichern. :?:
 

homer65

Hacker
Ein inkrementellen Backup gibt es nicht für MySQL. Ich habe aber mal ein Java Programm geschrieben, das einem die Sicherung erleichert:
http://mysql-backup.sourceforge.net
 

whois

Ultimate Guru
Hi homer

Ich brauch dein Programm schon eine ganze Zeit und wollte endlich mal Danke sagen. :)

cu
 

homer65

Hacker
Oh schick, noch jemand der das Programm benutzt :). Habe bisher noch überhaupt keine Rückmeldung erhalten. Von Sourceforge her hört man rein gar nichts :-(.
 
@kaktus: Um inkrementell zu sichern sollte es doch reichen die Logfiles zu sichern (zumindest was da neu dazukam seit der letzten Sicherung). Alle paar Tage solltest du aber komplett sichern ;)

@homer: Ist dein Programm nur ein nettes Frontend für mysql-dump mit einer "rotate" Funktion oder kann das mehr (bin aus der Sourceforge Beschreibung nicht schlau geworden)?
 

framp

Moderator
Teammitglied
Multipost http://www.linuxforen.de/forums/showthread.php?p=1499302#post1499302

[EDIT] Nachfolgend hatte sich eine OT Diskussion bzgl Multiposting ergeben. Sie wurde der Übersichtlichkeit dieses Threads wegen nach Rücksprache mit den ThreadAuthor gelöscht. Anläßlich dieser Diskussion habe ich mal hier einen separaten Thread zu Multiposting erstellt.[/EDIT]
 

homer65

Hacker
Das Progamm ist tatsächlich nur ein FrontEnd für mysqldump und kann nicht mehr als man auch manuell mit mysqldump könnte. Es erleichert nur ein wenig die Arbeit.
 
OP
M

mr_kaktus

Member
Hallo, bin schon früher fertig geworten, schaut euch das mal an.
Vielleicht könnt Ihr das mal selbst gebrauchen. Ich danke euch aufjedenfall für die Hilfe und Unterstützung.
Über Kritik und Feedback freue ich mich immer!
Code:
#!/usr/bin/perl 

use strict;
use Date::Calc qw(:all);		# Calender Modul
use Digest::MD5;			# md5sum Modul


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Globale Variablen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my $backupdir="MySQL_BACKUP";		# Backupverzeichnis
my $backupname="mysqldump_";		# anfang des Backupnamen
my @dumps=<$backupdir/$backupname*>;    # Alle Backupnamen
my $anzahl_dumps=@dumps;                # Anzahl der Backups
my $anzahl_grenze="7";                  # Anzahl der MySQLBackups generationen


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HAUPT PROGRAMM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# ================= #
# MySQL Dump ziehen #
# ================= #
&mysqldump; 				# aktueller DBump ziehen  
			
# ================ #
# Variablen Setzen #					
# ================ #	
my $NewFileDate=&SearchMaxDate; 	# aktuellster DateiDatum 	
my $OldFileDate=&SearchUnderMaxDate;	# vorletzter DateiDatum 
my $MD5_OldFile=&GetFingerPrint("$backupdir/$backupname$OldFileDate");	# md5sum der vorletzen Sicherung
my $MD5_NewFile=&GetFingerPrint("$backupdir/$backupname$NewFileDate");  # md5sum der letzten Sicherung

# ================================ #
# Pruefen ob ein Backup noetig ist #
# ================================ #
# Test ob die zupruefende Datei schon vorhanden ist. 
# Falls dem so ist, braucht man kein check durchzurfuehren,
# Da es sich um ein Aktuelles Update handelt.
# Das ist sinnvoll, wenn das Skript mehrmals am Tag ausgefuert wird.
if ("$NewFileDate" ne "$OldFileDate"){ 
  # Test ob die Checksummen des letzen und Aktuellen DBdump gleich sind.
  # Wenn Sie gleich sind, wird der Neue DBdump geloescht, 
  # da es keine Aenderugen gegeben hat.
  if ("$MD5_OldFile" eq "$MD5_NewFile"){
    # print "KEIN BACKUP noetig\n"; 	# Zu Test Zwecken
    unlink "$backupdir/$backupname$NewFileDate";
  }
}

# ===================== #
# Alte Backups loeschen #
# ===================== #
# In $anzahl stehen die Anzahl der MySQLBackups drin. 
# Die Schleife wird so lange durch laufen bis alle 
# alten Backups geloesch wurden. Die Anzahl der MySQLBackups generationen
# wird ueber die Variable $anzahl_grenze bestimmt. 
while ($anzahl_dumps > $anzahl_grenze) {
   my $min_date=&SearchMinDate;  			# alteste Datum der gesicherten Dateien
   unlink "$backupdir/$backupname$min_date";		# alte Backupdateien loeschen
   #print "$backupdir/$backupname$min_date geloesch"; 	# Zu Test zwecken
   #print " ==> $anzahl_dumps <== \n";			# Zu Test zwecken
   $anzahl_dumps--;					# Die Anzahl der Dumps immer um eins minimiren
}

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNKTIONEN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# ================================= #
# Berechnet die md5sum einer Datei  #
# ================================= #
sub GetFingerPrint {
  my $filename="$_[0]"; 
  open (FILE, $filename)  or die "Kann $filename nicht oeffnen: $!";
  binmode(FILE);
  my $md5 = Digest::MD5->new;

  while(<FILE>){
    $md5->add($_);
  }
  close (FILE);
  my $fingerPrint = $md5->hexdigest;

return $fingerPrint;
}

# ============================================== #
# Dump der MySQL Daten bank mit mysqldump ziehen #
# ============================================== #
sub mysqldump{
  if (! -d $backupdir){mkdir $backupdir, 0700 or warn "Kann das Verzeichnis $backupdir nicht anlegen: $!"};
  my ($year,$month,$day)=Today_and_Now(); 
  my $datetoday=sprintf "%02d%02d%02d",($year%100),$month,$day;
  my $password="xxx";
  `mysqldump -A -u root -p$password --lock-all-tables > $backupdir/$backupname$datetoday`;
}

# ========================================================================= #
# Sucht sich anhand des Dateinamen (Datum) die zuletzt gesicherte Datei     # 
# ========================================================================= #
sub SearchMaxDate{
  my @dumps = <$backupdir/$backupname*>;
  my $max_date=shift @dumps;
     $max_date=substr("$max_date",-6);

  foreach(@dumps){
    my $datum=substr("$_",-6);
    if ($datum > $max_date ){
       $max_date = $datum;
    }
  }
  return $max_date;
}

# ========================================================================= #
# Such anhand des Dateinamen (Datum) die vorletzte MySQL Sicherung          #
# ========================================================================= #
sub SearchUnderMaxDate{
  my $max_date=&SearchMaxDate;
  my @dumps = <$backupdir/$backupname*>;
  my $min_date=shift @dumps;
     $min_date=substr("$min_date",-6);

  foreach(@dumps){
    my $datum=substr("$_",-6);
    if ($datum < $max_date && $datum >= $min_date){
       $min_date = $datum;
    }
  }
  return $min_date;
}

# ========================================================================== #
# Sucht sich anhand des Dateinamen (Datum) die aelteste gesicherte Datei aus #
# ========================================================================== #
sub SearchMinDate{
  my @dumps = <$backupdir/$backupname*>; 
  my $min_date=shift @dumps;	         
     $min_date=substr("$min_date",-6);

  foreach(@dumps){
    my $datum=substr("$_",-6);
    if ($datum <= $min_date ){
       $min_date = $datum;
    }
  }
  return $min_date;
}
 
Oben