Ich habe mir ein kleines backupscript geschrieben und folgendes ist das herausgekommen :
#!/bin/bash # # Website backupscript for demo_website, database and website content # (CC) BY-NC-SA by itoss # ######################## ### define variables ### ######################## WEBSITEDIR=demo_website # Website directory e.g my website DATABASENAME=demo_website # mySQL database name DATABASEUSER=demo_website # mySQL username DATABASEPASS=<PASSWORD> # mySQL password / set user and permission for this script to root.root @ 700 BCKDIRTMP=$HOME/demo_website$(date +%F_%H:%M) # Temporary directory including backupfiles and set backup TIME/DATE BCKOWNER=<USER> BACKUPSCRIPTNAME=restore.sh APACHEDIR=/var/www # Apache directory e.g. /var/www BCKDIRSTR=/home/backups/websites/$WEBSITEDIR # Storage directory for backup files DATE=$(date +%F_%H:%M) # same like -> date +%Y-%m-%d_%H:%M => e.g. 2012-11-17_03:39 ######################## ### define functions ### ######################## function makerestorescript () { touch $BACKUPSCRIPTNAME echo "#!/bin/bash" > $BACKUPSCRIPTNAME echo "#" >> $BACKUPSCRIPTNAME echo "# Website backup restore script for $WEBSITEDIR database and website content" >> $BACKUPSCRIPTNAME echo "# (CC) BY-NC-SA by itoss" >> $BACKUPSCRIPTNAME echo "#" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "########################" >> $BACKUPSCRIPTNAME echo "### define functions ###" >> $BACKUPSCRIPTNAME echo "########################" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "function restoredatabase ()" >> $BACKUPSCRIPTNAME echo "{" >> $BACKUPSCRIPTNAME echo " sudo mysql -u$DATABASEUSER -p$DATABASEPASS $DATABASENAME < $DATABASENAME.sql " >> $BACKUPSCRIPTNAME echo "}" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "function restoreapachefiles ()" >> $BACKUPSCRIPTNAME echo "{" >> $BACKUPSCRIPTNAME echo " 7z x apache_content.7z" >> $BACKUPSCRIPTNAME echo " cd $APACHEDIR" >> $BACKUPSCRIPTNAME echo " sudo rm -r $WEBSITEDIR" >> $BACKUPSCRIPTNAME echo " cd -" >> $BACKUPSCRIPTNAME echo " mv $WEBSITEDIR $APACHEDIR" >> $BACKUPSCRIPTNAME echo " chown -R www-data.www-data $APACHEDIR/$WEBSITEDIR" >> $BACKUPSCRIPTNAME echo "}" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "############################" >> $BACKUPSCRIPTNAME echo "## Chekking root status ##" >> $BACKUPSCRIPTNAME echo "############################" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo ' if [ `whoami` == "root" ] ; then' >> $BACKUPSCRIPTNAME echo " echo " >> $BACKUPSCRIPTNAME echo " else" >> $BACKUPSCRIPTNAME echo ' echo "Are You Root ?"' >> $BACKUPSCRIPTNAME echo " exit" >> $BACKUPSCRIPTNAME echo " fi" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "#########################" >> $BACKUPSCRIPTNAME echo "## start backupscript ##" >> $BACKUPSCRIPTNAME echo "#########################" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "restoreapachefiles" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo 'echo "Databaserestore in progress ..."' >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME echo "restoredatabase" >> $BACKUPSCRIPTNAME echo "" >> $BACKUPSCRIPTNAME chmod 731 $BACKUPSCRIPTNAME } function createbackup () { mkdir $BCKDIRTMP cd $BCKDIRTMP makerestorescript cd $APACHEDIR echo "+----------------------------------------------------------+" echo "|compress apache content from $APACHEDIR/$WEBSITEDIR ... |" echo "|for further information see logfile 7z.log |" echo "+--------------------------------------------------------- +" 7z a -olR $BCKDIRTMP/apache_content.7z $WEBSITEDIR &>$BCKDIRTMP/7z.log echo echo "+--------------------------------+" echo "|backup mysql $DATABASENAME database |" echo "+--------------------------------+" mysqldump --user=$DATABASEUSER --password=$DATABASEPASS --database $DATABASENAME > $BCKDIRTMP/$DATABASENAME.sql chown -R $BCKOWNER.$BCKOWNER $BCKDIRTMP chown root.$BCKOWNER $BCKDIRTMP/restore.sh echo echo "+----------------------------------------------------------+" echo "|Backup created in $BCKDIRTMP |" echo "|$(du -ach $BCKDIRTMP | grep gesamt) |" echo "+--------------------------------------------------------- +" echo } function storebackup () { echo "+-----------------------------------------------------------------+" echo "|Store $TIMESTEP backup in $BCKDIRSTR/$TIMESTEP ... |" sudo -u $BCKOWNER mkdir -p $BCKDIRSTR/$TIMESTEP/ cp -rp $BCKDIRTMP/ $BCKDIRSTR/$TIMESTEP/ echo "|=> DONE <= |" echo "+-----------------------------------------------------------------+" echo } ############################ ## Chekking root status ## ############################ if [ `whoami` == "root" ] ; then echo else echo "Are You Root ?" exit fi ######################### ## start backupscript ## ######################### createbackup # Create backupfiles case $(date +%d) in # store backupfiles in timestep specific storage directory 01|02|03|04|05|06|08|09|10|11|12|13|15|16|17|18|19|20|22|23|24|25|26|27|29|30|31) TIMESTEP=daily storebackup rm -r $BCKDIRTMP/ ;; 07|14|21|28) TIMESTEP=daily storebackup TIMESTEP=weekly storebackup rm -r $BCKDIRTMP/ ;; 30) TIMESTEP=daily storebackup TIMESTEP=weekly storebackup TIMESTEP=monthly storebackup rm -r $BCKDIRTMP/ ;; esac ################################################################################################ ################################### clear website backup dir ################################### ################################################################################################ ############################## ### define clear functions ### ############################## function cleardir () { find $BCKDIRSTR/$APPENDIXDIR -type d -mtime +$PASTTIMESTEP -print0 | xargs -0 rm -Rf find $BCKDIRSTR/$APPENDIXDIR -type f -mtime +$PASTTIMESTEP -print0 | xargs -0 rm -Rf } ######################### ## start clear script ## ######################### echo "clear old backup directories " echo APPENDIXDIR=daily PASTTIMESTEP=7 cleardir APPENDIXDIR=weekly PASTTIMESTEP=30 cleardir APPENDIXDIR=monthly PASTTIMESTEP=360 cleardir
Zwei Sachen sind aber noch nicht richtig gelöst :
1. Der Datenbankbackup, da der Backup im laufenden Betrieb gemacht wird. Gibt es eine Möglichkeit die Datenbank zu sperren ein Backup erstellen und wenn in dem Zeitraum Änderungen gemacht werden diese nach dem Backup und Aufhebung der Sperrung in die Datenbank zu aktualisieren ?
2. das Löschen alter Backups. Der find Befehl bezieht sich auf das Datum des letzten Zugriffs, daher bliebt der ein oder andere Ordner als Datenmüll zurück. Die Backupverzeichnisstruktur sieht folgendermaßen aus :
daily -> website-2014-04-03:20:00 -> website-2014-04-04:20:00 . . . -> website-2014-04-09:20:00
Es wäre besser sich an den Verzeichnisnamen zu orientieren und diese als Zeitpunkt zu nehmen, sprich alle Ordner die älter als 7 tage sind werden gelöscht. Den akteullen Ordner samt Pfad bekomme ich mit
find . -type d -name "*$(date +%F)*"
wie ändere ich den Pfad in 7 Tage voher ? Filtern mit sed wäre da auch suboptimal denn das würde erst ab dem 8 jeden Monats greifen. gibt es da vllt. eine bessere Option ?
EDIT :
find . -type d -name "*$(date -d "7 days ago" +%F)*"
wer hätte gedacht das es so einfach ist ?! bleibt nur noch die Frage wie ich es anstelle, das alles was vor diesem Datum liegt auch gelöscht wird. Spontan würde mir die Idee kommen die zahl 7 gegen eine variable zu tauschen, dann die ganze Ziele mit einer for Schleife 7 mal durch laufen zu lassen wobei dann bei jeder Schleife der Wert der Variablen um 1 erhöht wird ( dann würde alles was älter als 2 Wochen ist gelöscht, alles was älter als 3 Wochen ist würde nicht gelöscht )
1 2 3 4 5 6 7 8 9 10 | KEEPLASTDAYS=7 # keep backups last X days DELPERIOD=365 # delete backup period in days function DELETE () { find . -type d -name "*$(date -d "$KEEPLASTDAYS days ago" +%F)*" KEEPLASTDAYS=$[$KEEPLASTDAYS+1] } for i in `seq $DELPERIOD` ; do DELETE ; done |
funktioniert 😉 das ganze noch ins script und fertig, aber bei der Datenbankgeschichte weiß ich nicht weiter :/