pw yet another blog

Datenbankimport bei 1und1

Hallo,

vor ein paar Tagen habe ich für einen Kumpel (Hat tip to Chris) ein leines Skript geschrieben, welches ein Dumpfile der 1und1-Datenbank wieder einspielt.
Dabei soll der Zustand einer Website alle zwei Stunden wiederhergestellt werden.
Bei 1und1 sind Datenbankverbindungen zum MySQL-Server von außen nicht möglich, daher habe ich den Cronjob auf meinem Server laufen und rufe folgendes Skript auf:

<?php
  $h =  'dbxxxx.1und1.de';
  $u =  'dboxxxxxxxxx';
  $p =  'xxxxxxxxxxxx';
  $db = 'dbxxxxxxxxx';
 
  // Datenbank leeren
  $c = mysql_connect($h, $u, $p) or die("Der Datenbankserver ist nicht erreichbar: ". mysql_error());
  $d = mysql_select_db($db) or die("Die Datenbank konnte nicht geoeffnet werden: ". mysql_error());
 
  $q = mysql_query("DROP TABLE `schcms_banner`, ..., `schcms_weblinks`") or die("Die Abfrage ist fehlgeschlagen: " .mysql_error());
 
  mysql_close($c) or die("Die Verbindung konnte nicht geschlossen werden: ". mysql_error()); 
 
  $r = system(sprintf('gunzip -c ./dumpDB.sql.gz | mysql -f -h %s -u %s -p%s %s', $h, $u, $p, $db));
  echo "$r<br/> + DONE";
?>

Dabei werden Systembefehle über das Skript ausgeführt und die Datei udmpDB.sql.gz entpackt und an mysql weitergepipet um wieder eingetragen zu werden.
Da man manuell keine Datenbanken löschen und wieder anlegen kann, muss der Umweg über “DROP TABLE” genommen werden, sollte aber kein Hindernis darstellen.

Und mit dem folgenden Cronjob werden alle zwei Stunden die Daten neu geschrieben:

15 0-23/2 * * * /usr/bin/curl -s http://www.server.tld/backupscript.php  2>&1 /dev/null

Will man neben dem reinen Rückspielen noch einen kleinen Counter bis zum nächsten Reset einbauen, dann sollte im Cronjob statt curl folgendes Shellscript aufgerufen werden:

#!/bin/bash
/usr/bin/curl -s http://www.server.tld/backupscript.php
let hour=`date +%H`+2
echo "<?php" > ~pw/www/.../date.inc
echo "\$y1 = '`date +%Y`';" >> ~pw/www/.../date.inc
echo "\$m1 = '`date +%m`';" >> ~pw/www/.../date.inc
echo "\$d1 = '`date +%d`';" >> ~pw/www/.../date.inc
echo "\$h1 = '$hour';" >> ~pw/www/.../date.inc
echo "\$min1 = '`date +%M`';" >> ~pw/www/.../date.inc
echo "\$s1 = '`date +%S`';" >> ~pw/www/.../date.inc
echo "?>" >> ~pw/www/.../date.inc

Um damit folgendes JavaScript über PHP zu generieren:

var y1=2008, m1=09, d1=28, h1=18, min1=09, s1=04;var z=new Date(y1,m1-1,d1,h1,min1,s1);
 
var countdown = function() {
  start=new Date();
 
  if(start<z)  {
    var y=0, m=0, d=0, h=0, min=0, s=0;
    while(start<z) {
      y++;
      start.setFullYear(start.getFullYear()+1);
    }
    start.setFullYear(start.getFullYear()-1);
    y--;
 
    while(start<z) {
      m++;
      start.setMonth(start.getMonth()+1);
    }
    start.setMonth(start.getMonth()-1);
    m--;
 
    while(start.getTime()+(24*60*60*1000)<z) {
      d++;
      start.setTime(start.getTime()+(24*60*60*1000));
    }
 
    h=Math.floor((z-start)/(60*60*1000));
    start.setTime(start.getTime()+h*60*60*1000);
 
    min=Math.floor((z-start)/(60*1000));
    start.setTime(start.getTime()+min*60*1000);
 
    s=Math.floor((z-start)/1000);
 
    (y!=1)?y=y+" Jahre,  ":y=y+" Jahr,  ";
    (m!=1)?m=m+" Monate,  ":m=m+" Monat,  ";
    (d!=1)?d=d+" Tage,  ":d=d+" Tag,  ";
    (h!=1)?h=h+" Stunden,  ":h=h+" Stunde,  ";
    (min!=1)?min=min+" Minuten  und  ":min=min+" Minute  und  ";
    if(s<10) s="0"+s;
    (s!=1)?s=s+" Sekunden":s=s+" Sekunde";
 
    document.getElementById('dout').innerHTML = "N&auml;chster Reset in "+h+min+s+"<br/>";
 
    setTimeout('countdown()',200);
  }
  // Anderenfalls alles auf Null setzen
  else document.getElementById('dout').innerHTML = "<b>Jetzt!</b>";
}
countdown();

Im Script, welches obigen Code ausliefert müssten die ersten Zeilen folgende sein:

<?php
header("Content-type: application/x-javascript");
include("./date.inc");
echo "var y1=$y1, m1=$m1, d1=$d1, h1=$h1, min1=$m1, s1=$s1;";
?>
... // restlicher JS-Code

Um es auf der gewünschten Seite einzubinden, wird das Script einfach nach dem schließenden HTML-Tag in den Quelltext geschrieben und an der gewünschten Position ein

<div id="dout">&nsbp;</div>

geschrieben, welches dann beliebig formatiert werden kann.

Viel Spaß damit :-)

PS: Komischerweise funktioniert es nur, wenn beim MySQL-Aufruf “-f” als Parameter übergeben wird und somit die Einträge erzwungen werden.

About

One Response to “Datenbankimport bei 1und1”

  • Jo – dank dir Peter für die schnelle und saubere Hilfe. Das Skript läuft einwandfrei – hast was gut ;)