Automatisches Backup und Replizierung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Automatisches Backup und Replizierung

    Hallo Gemeinde,

    Hier stelle ich euch insgesamt drei Skripte vor die ich selbst benutze um automatisierte Backups von Datenbanken und Filesystem zu erstellen und diese dann auf einem anderen Server zu replizieren.

    Zuerst das Skript für die MySQL-Datenbanken:

    Shell-Script

    1. #!/bin/sh
    2. BACKUPDIR="/var/backups/webserver/mysql";
    3. DBFILTER="(information_schema|dev|tmp)";
    4. MYSQLDUMP="$(which mysqldump) --opt";
    5. DIRNAME=`date +%Y-%m`;
    6. FTP_PATH="/mysql";
    7. MYSQL=$(which mysql);
    8. TAR=$(which tar);
    9. GZIP=$(which gzip);
    10. NICE=$(which nice);
    11. EGREP=$(which egrep);
    12. NCFTPPUT=$(which ncftpput);
    13. MKDIR=$(which mkdir);
    14. mkdir -p "$BACKUPDIR/$DIRNAME";
    15. DBS=$($MYSQL -Bse "show databases");
    16. for db in $DBS
    17. do
    18. if !(echo $db | $EGREP $DBFILTER > /dev/null);
    19. then
    20. FILENAME="$db-`date +%Y_%m_%d_%H_%M_%S`.sql.gz";
    21. $MKDIR $BACKUPDIR/$db
    22. $MKDIR $BACKUPDIR/$db/$DIRNAME
    23. $NICE -n 20 $MYSQLDUMP $db | $NICE -n 20 $GZIP -c > "$BACKUPDIR/$db/$DIRNAME/$FILENAME";
    24. if ( [ "$NCFTPPUT" ] );
    25. then
    26. $NCFTPPUT -V -m -f /root/.backup.ftp "$FTP_PATH/$DIRNAME/" "$BACKUPDIR/$db/$DIRNAME/$FILENAME";
    27. fi
    28. fi
    29. done
    Alles anzeigen
    Dieses Script sichert alle Datenbanken außer diese stehen in der Variable $DBFILTER. Wenn die Datenbank gesichert wurde, wird diese mittels ncftpput auf einen FTP-Server kopiert. Die Verbindungsdaten für den FTP-Server stehen in der Datei /root/.backup.ftp

    Nun kommt das Skript um die Dateien zu sichern:

    Shell-Script

    1. #!/bin/sh
    2. BACKUPDIR="/var/backups/webserver/files";
    3. FILEFILTER="(tmp)";
    4. FILEDIR="/home/www";
    5. DIRNAME=`date +%Y-%m`;
    6. FTP_PATH="/files";
    7. TAR=$(which tar);
    8. NICE=$(which nice);
    9. EGREP=$(which egrep);
    10. NCFTPPUT=$(which ncftpput);
    11. mkdir -p "$BACKUPDIR/$DIRNAME";
    12. FILES=$(ls "$FILEDIR");
    13. for dir in $FILES
    14. do
    15. if !(echo $dir | $EGREP $FILEFILTER > /dev/null);
    16. then
    17. FILENAME="$dir-`date +%Y_%m_%d_%H_%M_%S`.tar.gz";
    18. cd $FILEDIR;
    19. mkdir $BACKUPDIR/$dir
    20. mkdir $BACKUPDIR/$dir/$DIRNAME
    21. $TAR cvzpf $BACKUPDIR/$dir/$DIRNAME/$FILENAME $dir --same-owner --exclude=tmp/* --exclude=logs/* --exclude=php-fcgi/* > /dev/null
    22. if ( [ "$NCFTPPUT" ] );
    23. then
    24. $NCFTPPUT -V -m -f /root/.backup.ftp "$FTP_PATH/$DIRNAME/" "$BACKUPDIR/$dir/$DIRNAME/$FILENAME";
    25. fi
    26. fi
    27. done
    Alles anzeigen
    Diese Datei arbeitet vom Prinzip her genau wie die mysqlbackup.sh. Die verwendeten Parameter kann man in den man-Pages nachlesen.

    Nun sind die Dateien auf zwei Servern gespeichert. Einmal lokal im Verzeichnis /var/backups/webserver und einmal auf einem FTP-Server. Was aber wenn die lokale Platte ausfällt und gleichzeitig der FTP-Server ausfallen, z.B. wenn beide Server im gleichen Rechenzentrum stehen und das Rechenzentrum einen schwerwiegenden Defekt hat?
    Dafür gibt es noch die Möglichkeit die gesicherten Daten mittels rsync auf einen dritten Server zu kopieren:

    Shell-Script

    1. #!/bin/sh
    2. BACKUPDIR=/var/backups/webserver
    3. TARGETUSER=remotebackup
    4. TARGETDIR=/home/remotebackup/backup_`date +'%Y-%m-%d_%H%M%S'`
    5. EXCLUDES=/root/rsync-excludes.conf
    6. BACKUPSERVER=SERVER
    7. if ( nmap $BACKUPSERVER -p 22 | grep "open" -q ) ; then
    8. rsync -avz --numeric-ids -e ssh --delete --delete-excluded --stats --exclude-from="$EXCLUDES" $BACKUPDIR $TARGETUSER@$BACKUPSERVER:$TARGETDIR
    9. else
    10. echo $BACKUPSERVER > /dev/null;
    11. fi
    Alles anzeigen
    Generell kann man auch alle drei Skripte in eine Datei fassen. Um aber die Dateien von den Datenbanken besser zu trennen und auch die Replizierung extra zu halten, habe ich das in drei Dateien gesplittet. So ist es auch einfach möglich das Backup mittels cronjobs zu automatisieren und unterschiedliche Ausführungszeiten festzulegen. So wird bei mir die Datenbank täglich gesichert, die Dateien wöchentlich und die Replizierung per rsync ebenfalls wöchentlich.

    lg
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden
  • mhm ok so kann man es auch machen
    ich habe bei mir ein php script auf dem server
    der jeden monat am ersten sich bei meinem hoster einloggt
    und dort das backup system von diesem auslöst
    somit wird einmal mein ganzes file system geclont und auf einen server in einem anderen RZ gespeichert
    wenn dann etwas ist kann ich es einfach zurück spielen

    hier noch das script ;)

    PHP-Quellcode

    1. <?php
    2. /* HTTPConnector.class.php - HTTP Connector Class - ZNCAdmin
    3. * Copyright (C) 2011-2012 Philipp Kreil (pk910)
    4. *
    5. * This program is free software: you can redistribute it and/or modify
    6. * it under the terms of the GNU General Public License as published by
    7. * the Free Software Foundation, either version 3 of the License, or
    8. * (at your option) any later version.
    9. *
    10. * This program is distributed in the hope that it will be useful,
    11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13. * GNU General Public License for more details.
    14. *
    15. * You should have received a copy of the GNU General Public License
    16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17. */
    18. class HTTPConnector {
    19. private $cookies = array();
    20. public function post($host, $post) {
    21. $ssl = false;
    22. if(strtolower(substr($host, 0, 7)) == 'http://') {
    23. $host = substr($host, 7);
    24. } else if(strtolower(substr($host, 0, 8)) == 'https://') {
    25. $host = substr($host, 8);
    26. $ssl = true;
    27. }
    28. $hexp = explode('/', $host, 2);
    29. $pexp = explode(':', $hexp[0]);
    30. $host = $pexp[0];
    31. if(count($pexp) > 1)
    32. $port = $pexp[1];
    33. else
    34. $port = 443;
    35. $rhost = $host;
    36. if($ssl){
    37. $rhost = "ssl://".$host;
    38. }
    39. $path="/".$hexp[1];
    40. $data = "";
    41. $fp = fsockopen($rhost, $port);
    42. fputs($fp, "POST $path HTTP/1.1\r\n");
    43. foreach($post as $key => $val) {
    44. if(is_array($val)) {
    45. foreach($val as $subval) {
    46. if($data != "") { $data.="&"; }
    47. $data .= $key."=".$subval;
    48. }
    49. } else {
    50. if($data != "") { $data.="&"; }
    51. $data .= $key."=".$val;
    52. }
    53. }
    54. fputs($fp, "Accept-Language: de-DE\r\n");
    55. fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
    56. fputs($fp, "Accept-Encoding: deflate\r\n");
    57. fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2)\r\n");
    58. fputs($fp, "Host: ".$host."\r\n");
    59. foreach($this->cookies as $cookiename => $cookievalue) {
    60. fputs($fp, "Cookie: ".$cookiename."=".$cookievalue."\r\n");
    61. }
    62. fputs($fp, "Content-Length: ".strlen($data)."\r\n");
    63. fputs($fp, "Connection: Keep-Alive\r\n");
    64. fputs($fp, "Cache-Control: no-cache\r\n");
    65. fputs($fp, "\r\n");
    66. fputs($fp, $data);
    67. $res = "";
    68. while(!feof($fp)) {
    69. $res .= fread($fp, 256);
    70. }
    71. $exp = explode("\n", str_replace("\r", "", $res));
    72. for($i=0;$i<count($exp);$i++) {
    73. $expb = explode(" ",$exp[$i],2);
    74. if($expb[0] == "Set-Cookie:") {
    75. $cookie = explode("=", $expb[1], 2);
    76. $cookieval = explode(";", $cookie[1]);
    77. $this->cookies[$cookie[0]] = $cookieval[0];
    78. } else if($exp[$i] == "") {
    79. break;
    80. }
    81. }
    82. fclose($fp);
    83. return $res;
    84. }
    85. public function get($host) {
    86. $ssl = false;
    87. if(strtolower(substr($host, 0, 7)) == 'http://') {
    88. $host = substr($host, 7);
    89. } else if(strtolower(substr($host, 0, 8)) == 'https://') {
    90. $host = substr($host, 8);
    91. $ssl = true;
    92. }
    93. $hexp = explode('/', $host, 2);
    94. $pexp = explode(':', $hexp[0]);
    95. $host = $pexp[0];
    96. if(count($pexp) > 1)
    97. $port = $pexp[1];
    98. else
    99. $port = 443;
    100. $rhost = $host;
    101. if($ssl){
    102. $rhost = "ssl://".$host;
    103. }
    104. $path="/".$hexp[1];
    105. $fp = fsockopen($rhost, $port);
    106. fputs($fp, "GET $path HTTP/1.1\r\n");
    107. fputs($fp, "Accept-Language: de-DE\r\n");
    108. fputs($fp, "Accept-Encoding: deflate\r\n");
    109. fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2)\r\n");
    110. fputs($fp, "Host: ".$host."\r\n");
    111. foreach($this->cookies as $cookiename => $cookievalue) {
    112. fputs($fp, "Cookie: ".$cookiename."=".$cookievalue."\r\n");
    113. }
    114. fputs($fp, "Connection: Keep-Alive\r\n");
    115. fputs($fp, "Cache-Control: no-cache\r\n");
    116. fputs($fp, "\r\n");
    117. $res = "";
    118. while(!feof($fp)) {
    119. $res .= fread($fp, 256);
    120. }
    121. $exp = explode("\n", str_replace("\r", "", $res));
    122. for($i=0;$i<count($exp);$i++) {
    123. $expb = explode(" ",$exp[$i],2);
    124. if($expb[0] == "Set-Cookie:") {
    125. $cookie = explode("=", $expb[1], 2);
    126. $cookieval = explode(";", $cookie[1]);
    127. $this->cookies[$cookie[0]] = $cookieval[0];
    128. } else if($exp[$i] == "") {
    129. break;
    130. }
    131. }
    132. fclose($fp);
    133. return $res;
    134. }
    135. }
    136. $reset = array("01.01","01.02","01.03","01.04","01.05","01.06","01.07","01.08","01.09","01.10","01.11","01.12");
    137. $stamp = time();
    138. if(in_array(date("d.m",$stamp), $reset)){
    139. $a=new HTTPConnector();
    140. $post = array(
    141. "login_id" => "xxxxxxxxxx",
    142. "passwd" => "xxxxxxxxxx"
    143. );
    144. $post2 = array(
    145. "vserver_os" => "debian-5.0-x86_32-minimal",
    146. "hmin" => "6:00",
    147. "createcronbackup" => "1",
    148. "backup_add" => "1"
    149. );
    150. echo $a->post("https://www.proplay.biz/logged.php",$post);
    151. echo $a->post("https://www.proplay.biz/kunde/vserver_backup-1.html",$post2);
    152. echo $a->get("https://www.proplay.biz/logout.php");
    153. }
    154. ?>
    Alles anzeigen

    ist jetzt nicht das schönste aber es funzt
    also der cronjob ist so eingestellt dass er jede nacht um 1uhr das php script aufruft
    das überprüft dann eigenständig welsches datum wir haben
    haben wir den ersten des monats wird das backupsystem gestartet

    wenn das jemand nutzen möchte muss es er anpassen :D

    ps. copyright liegt nicht bei mir
    habe die HTTPConnector class aus einem opensource projekt kopiert
  • mag sein dass es per http/https abläuft
    dafür hab ich ein grantiertes backup beim hoster wo ich mir keine gedanken machen muss

    und ob sich das mehr lonht und schneller geht bezweifel ich ^^
    da ich nur auf meinen hoster verbinden muss und dann bei ihm das automatische backup starte
    somit muss ich nichts kopieren sondern nur den auftrag in arbeit geben und habe ein vollständiges backup und brauch keinen zweiten server um die backups zu lagern da dies alles der hoster übernimmt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Stricted ()