Backup von Datenbank-Tabellen

Hi,

vielen Dank erst einmal für deine Mühe, den Code komplett hier auszuarbeiten.
Ich habe ihn auch gleich übertragen und mit den notwendigen Modifikationen
meiner Vorgaben aufbereitet.

Hier das Ergebnis :
PHP:
$conn1 = mysql_connect($db_host,$root1,$db_pass, true) or die(mysql_error());
$conn2 = mysql_connect($db_host,$root2,$db_pass, true) or die(mysql_error());

// Je eine DB wählen
mysql_select_db($datenbank1, $conn1);
mysql_select_db($datenbank2, $conn2);

// Tabellen der zu sichernden DB holen
$res_tabellen = mysql_query("SHOW TABLES", $conn1);

// Zu sichernde Tabellen durchlaufen
while ($tabelle = mysql_fetch_row($res_tabellen))
  {
  // Datensätze einer zu sichernden Tabelle einlesen
  $res_datensaetze = mysql_query("SELECT * FROM ".$tabelle[0]." ORDER BY ID", $conn1);
    
  // Inhalt der Backup-Tabelle löschen
  mysql_query("TRUNCATE $tabelle", $conn2) or die (mysql_error());
      
  // Datensätze durchlaufen
  $id = 1;
  while ($datensatz = mysql_fetch_assoc($res_datensaetze))
    {
    // Zu ersetzende ID speichern
    $alte_id = $datensatz['ID'];
    if (is_null($alte_id)) { $alte_id = $datensatz['id']; }
    if (is_null($alte_id)) { $alte_id = $datensatz['Id']; }
    if (is_null($alte_id)) { $alte_id = $datensatz['iD']; }
      
    $daten = "'".implode("', '", $datensatz)."'";
    $qry_backup = "INSERT INTO `".$tabelle[0]."` VALUES (".substr($daten, 0, strlen($daten)).")";
    // Zeile in Backup-Tabelle einfügen
    $erfolg = mysql_query($qry_backup, $conn2);
        
    if (!is_null($alte_id))
      {
      // Wenn eine alte ID vorhanden ist, den entsprechenden Datensatz der 
      // Backup-Tabelle mit der neuen, fortlaufenden überschreiben
      $qry_idupdate = "UPDATE `".$tabelle[0]."` SET ID = ".$id." WHERE ID = ".$alte_id;
      $erfolg = mysql_query($qry_idupdate, $conn2);
      //Fortlaufende ID um 1 erhöhen
      $id++;
      }
    }
  }
//Verbindungen schließen
mysql_close($conn1);
mysql_close($conn2);
Nach dem Start erscheint jedoch die Meldung :
Table 'rhh_db685770.array' doesn't exist
Die Datenbank "rhh_DB658770" ist die Backup-Datenbank, also das Ziel.
Die Tabelle ist aber vorhanden, allerdings ohne Inhalt.
Dieser wurde duch die ganzen Testläufe bereits gelöscht.

Woher kommt jetzt diese Fehler-Meldung ?
Habe ich bei der Übertragung eventuell etwas übersehen ?

Vielen Dank nochmal für eure Hilfe.

Gruß, Mike
 
Hmm, nochmal zum Verständnis - handelt es sich dabei um eine Datenbank oder eine Tabelle?

Edit: Der Fehler liegt wohl hier:
PHP:
mysql_query("TRUNCATE $tabelle", $conn2) or die (mysql_error());
es sollte heißen
PHP:
mysql_query("TRUNCATE $tabelle[0]", $conn2) or die (mysql_error());
da $tabelle ein Array ist, dessen 1. (Stelle 0) Element Du auslesen möchtest.
 
Zuletzt bearbeitet:
Nachtrag

Soeben habe ich den Fehler selbst entdeckt. :eek:
PHP:
mysql_query("TRUNCATE $tabelle", $conn2) or die (mysql_error());

Nachdem ich diesen Befehl deaktiviert hatte, wurde das Script ohne Fehler
auch ausgeführt.
Zu meiner Überraschung habe ich danach jedoch festgestellt, daß hierbei ja
alle Tabellen der betreffenden Datenbank gesichert wurden.
Diesen Ablauf hatte ich bei der Übertragung des Scriptes garnicht bemerkt.

Da ich jetzt aber eine Vorlage habe, sollte es mir möglich sein, diese so
umzubauen, daß nicht alle Tabellen der Datenbank gemeinsam gesichert
werden, sondern ich gezielt eine bestimmte Tabelle ansprechen kann.
Das wäre auch sinnvoll für die Restore-Funktion, bei der man ja ebenfalls
gezielt eine bestimmte Tabelle wieder herstellen möchte.

Trotzdem noch einmal vielen Dank für deine Hilfe.
Dadurch bin ich schon mal ein ganzes Stück weitergekommen.

Gruß, Mike
 
Kein Problem.
Wenn Du den Befehl deaktiviert lässt, gibt es aber spätestens beim 2. Backup Probleme :).
Ändere ihn doch lieber so ab, wie in meinem Post zuvor.

Zum gezielten Backup würde ich Dir dann entsprechende Prefixe oder Suffixe empfehlen, z.B. Tabellenname_b, dann kannst du mit
SQL:
SHOW TABLES LIKE '%_b'
ganz einfach alle entsprechenden Tabellen auswählen.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

es ist vollbracht. :-)

Dank deiner Hilfe habe ich jetzt das Script so umbauen können, daß ich
gezielt eine bestimmte Datenbank-Tabelle auswählen und sichern kann.
PHP:
    $conn1 = mysql_connect($db_host,$root1,$db_pass, true) or die(mysql_error());
    $conn2 = mysql_connect($db_host,$root2,$db_pass, true) or die(mysql_error());

    // Je eine DB wählen
    mysql_select_db($datenbank1, $conn1);
    mysql_select_db($datenbank2, $conn2);

    // Datensätze einer zu sichernden Tabelle einlesen
    $res_datensaetze = mysql_query("SELECT * FROM $tabelle ORDER BY ID", $conn1);
      
    // Inhalt der Backup-Tabelle löschen
    mysql_query("TRUNCATE $tabelle", $conn2) or die (mysql_error());
      
    // Datensätze durchlaufen
    $id = 1;
    while ($datensatz = mysql_fetch_assoc($res_datensaetze))
      {
      // Zu ersetzende ID speichern
      $alte_id = $datensatz['ID'];
      if (is_null($alte_id)) { $alte_id = $datensatz['id']; }
      if (is_null($alte_id)) { $alte_id = $datensatz['Id']; }
      if (is_null($alte_id)) { $alte_id = $datensatz['iD']; }
        
      $daten = "'".implode("', '", $datensatz)."'";
      $qry_backup = "INSERT INTO $tabelle VALUES (".substr($daten, 0, strlen($daten)).")";
      // Zeile in Backup-Tabelle einfügen
      $erfolg = mysql_query($qry_backup, $conn2);
        
      if (!is_null($alte_id))
        {
        // Wenn eine alte ID vorhanden ist, den entsprechenden Datensatz der 
        // Backup-Tabelle mit der neuen, fortlaufenden überschreiben
        $qry_idupdate = "UPDATE $tabelle SET ID = ".$id." WHERE ID = ".$alte_id;
        $erfolg = mysql_query($qry_idupdate, $conn2);
        //Fortlaufende ID um 1 erhöhen
        $id++;
        }

      }
    //Verbindungen schließen
    mysql_close($conn1);
    mysql_close($conn2);

Für die Restore-Funktion muß ich jetzt lediglich die Quell- und Ziel-Daten
vertauschen und kann wiederum gezielt eine bestimmte Tabelle wieder
herstellen.

Hieran sieht man, daß ich noch einiges zu Lernen habe, wenn es um MySql geht.
Deshalb bin ich immer wieder dankbar, User wie dich zu finden, die mir bereitwillig
unter die Arme greifen.

Gruß, Mike
 
Hey :)


schön zu hören, dass es jetzt funktioniert.

Für die Restore-Funktion muß ich jetzt lediglich die Quell- und Ziel-Daten
vertauschen und kann wiederum gezielt eine bestimmte Tabelle wieder
herstellen.

Üb´ doch ein wenig mit PHP-OOP, dann brauchst du in dem Sinne nichts mehr "vertauschen" ;)
Wäre ein schönes Thema für Objekte/Klassen.

mfg

bo

PS: Falls das Thema "fertig" ist, dann markiere es als "Erledigt" ;)
 
Zurück