Backup von Datenbank-Tabellen

sheeba1507

Erfahrenes Mitglied
Hi zusammen,

für ein Projekt stehen mir 5 Datenbänke zur Verfügung, wobei die ersten drei die Arbeits-Tabellen
aufnehmen, die vierte als Backup und die fünfte zur Reserve/Tests verwendet wird.

Nun habe ich nach einer Möglichkeit gesucht, die Tabellen aus den Datenbänken 1-3 in die
Datenbank 4 zu sichern. Dabei wollte ich aber keine 1:1 Kopie mit MySql-Dump erzeugen, sondern
bei der Sicherung die Datensatz-ID auch gleich neu anordnen.
Als Beispiel dazu würde das Gästebuch dienen, wo auch mal Einträge (Spam) entfernt werden
und die ID-Folge Lücken aufweist.

Für jede zum Backup vorgesehene DB-Tabelle gibt es einen Datensatz in der Tabelle "datenbanken"
mit dem Namen der Datenbank und dem Namen der Tabelle.
Bislang habe ich dazu die nachfolgende Lösung gefunden :
PHP:
<?php
$db_backup = "Name_der_Backupdatenbank";

$id = $_GET["id"]; // URL-Parameter
mysql_connect($db_host,$db_root,$db_pass) or die(mysql_error()); // Verbindung mit Datenbank 1
mysql_select_db($db_bank) or die(mysql_error());
$sqlabfrage = "SELECT * FROM $tb_datenbanken WHERE id='$id'";
$ergebnis = mysql_query($sqlabfrage) or die(mysql_error());
$datensatz = mysql_fetch_array($ergebnis);

$tabelle = $datensatz["tabelle"];
$backup_ziel = $db_backup.$datensatz["tabelle"];
$backup_von = $datensatz["datenbank"].$datensatz["tabelle"];

// Backup-Tabellen-Inhalt löschen
mysql_connect($db_host,$db_root,$db_pass) or die(mysql_error()); // Verbindung mit Datenbank 4
mysql_select_db($db_bank) or die(mysql_error());
$query = "TRUNCATE $tabelle";
mysql_query($query) or die (mysql_error());

// Tabellen-Inhalt sichern
mysql_connect($db_host,$db_root,$db_pass) or die(mysql_error());
$sql_copy = "INSERT INTO $backup_ziel SELECT * FROM $backup_von";
mysql_query($sql_copy) or die (mysql_error()); 
?>
(bislang noch nicht getestet)

Diese Form der Sicherung würde aber (vieleicht) nur funktionieren, wenn die Zugangs-Daten
zu allen Datenbänken identisch wären.
In diesem Fall sind aber $db_root und $db_pass bei allen 5 Datenbänken verschieden.

Wie kann ich nun diese unterschiedlichen Datenbank-Verbindungen so einbinden, daß die jeweilige
Datenbank auch angesprochen werden kann ?

Da Google mir in dieser Angelegenheit keine Antworten liefern konnte, bin ich auf die Hilfe
der PHP-Experten in diesem Forum angewiesen.
Dafür schon mal Danke im voraus.

Gruß, Mike
 
Hey,

such mal nach einer MySQL Klasse; damit kannst du die Datenbanken voneinander trennen.

Da Google mir in dieser Angelegenheit keine Antworten liefern konnte, bin ich auf die Hilfe
der PHP-Experten in diesem Forum angewiesen.



Das mit den "ID Lücken" könntest du mit einer for Schleife lösen.
Gehe dabei alle Einträge durch und füge die in der "neuen" Datenbank hinzu.

bo
 
Hm, bin zwar kein PHP-Experte, aber um gleichzeitig mehrere Verbindungen zu verschiedenen Datenbanken aufzubauen und zu handlen müssten ja nur die Rückgabewerte von
PHP:
mysql_connect
und
PHP:
mysql_select_db
in Variablen gespeichert werden, und dann die Queries entsprechend abgeschickt werden.

So wie Du sie jetzt verwendest, also ohne die zurückgelieferten Ressourcen zu speichern, ist es ja nur eine Vereinfachung, bei der die Standard-Werte genutzt werden.

Und wenn tatsächlich alle Datensätze einzeln in die Backup-DB eingefügt werden sollen, würde ich (sofern möglich) empfehlen, auto-increments für die IDs zu verwenden.
Dann könntest Du Dir mit
SQL:
SHOW TABLES;
einfach alle Tabellen der zu sichernden Datenbank liefern lassen, und dann jeweils über eine WHILE-Schleife die Inhalte der Tabellen auslesen und in die passende Tabelle der Backup-DB einfügen.

Das führt natürlich zu Problemen mit den Fremdschlüsseln, falls Du welche verwendest.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

aber um gleichzeitig mehrere Verbindungen zu verschiedenen Datenbanken aufzubauen und zu handlen
müssten ja nur die Rückgabewerte von ...
... in Variablen gespeichert werden, und dann die Queries entsprechend abgeschickt werden.
diese Idee hatte ich auch schon gehabt.

Leider weiß ich nicht, wie ich diese Sequenzen ...
PHP:
$db1 = mysql_connect("localhost", "User1", "Passwort1", true);
$db2 = mysql_connect("localhost", "User2", "Passwort2", true);
mysql_select_db("datenbank1", $db1);
mysql_select_db("datenbank2", $db2);
... hier ...
PHP:
$backup_ziel = $db_backup.$datensatz["tabelle"];
$backup_von = $datensatz["datenbank"].$datensatz["tabelle"];

$sql_copy = "INSERT INTO $backup_ziel SELECT * FROM $backup_von";
mysql_query($sql_copy) or die (mysql_error());
... unterbringen kann.

Gruß, Mike
 
Hey,


ja das stimmt schon.
Ich finde es persönlich aber schöner bei so vielen Datenbanken dies über OOP ( objektorientierter Programmierung) zu konzipieren :)

Hier mal ein Beispiel:

http://www.tsql.de/php/mysql_php_klasse

Es gibt sehr viele vorgefertigte MySQL Klassen.


bo
 
Hi,


diese Idee hatte ich auch schon gehabt.

Leider weiß ich nicht, wie ich diese Sequenzen ...
PHP:
$db1 = mysql_connect("localhost", "User1", "Passwort1", true);
$db2 = mysql_connect("localhost", "User2", "Passwort2", true);
mysql_select_db("datenbank1", $db1);
mysql_select_db("datenbank2", $db2);
... hier ...
PHP:
$backup_ziel = $db_backup.$datensatz["tabelle"];
$backup_von = $datensatz["datenbank"].$datensatz["tabelle"];

$sql_copy = "INSERT INTO $backup_ziel SELECT * FROM $backup_von";
mysql_query($sql_copy) or die (mysql_error());
... unterbringen kann.

Gruß, Mike

Hey,

PHP:
$result = $db1->query($sql);

hoffe es hilft :)

bo
 
Also ich würde es eher so machen:
PHP:
$conn1 = mysql_connect("localhost", "User1", "Passwort1", true);
$conn2 = mysql_connect("localhost", "User2", "Passwort2", true);
mysql_select_db("datenbank1", $conn1);
mysql_select_db("datenbank2", $conn2);
dann kannst Du die Queries so abschicken:
PHP:
$result = mysql_query($sql_einlesen, $conn1);
//...
$erfolg = mysql_query($sql_sichern, $conn2);
 
Zuletzt bearbeitet:
Hi,

vielen Dank an euch beiden.
Eure Tipps werden mir sicher helfen, meinem Ziel etwas näher zu kommen und
vieleicht sogar das Problem vollständig zu lösen.

Sollten dennoch Fragen aufkommen, melde ich mich wieder.

Gruß, Mike
 
Nachtrag

Leider habe ich wohl immer noch einen kleinen Denk-Fehler in meinem Aufbau.
Dieser sieht mittlerweile wie folgt aus :
PHP:
<?php
$connect_ziel = mysql_connect($db_host,$root_ziel,$db_pass) or die(mysql_error());
$sql_ziel = "$datenbank_ziel.$tabelle, $connect_ziel";
$connect_quelle = mysql_connect($db_host,$root_quelle,$db_pass) or die(mysql_error());
$sql_quelle = "$datenbank_quelle.$tabelle, $connect_quelle";

$sql_copy = "INSERT INTO $sql_ziel SELECT * FROM $sql_quelle";
mysql_query($sql_copy) or die (mysql_error());
?>
Diese Code-Sequenz erzeugt bei mir einen Syntax-Error, den ich so nicht ganz
nachvollziehen kann :
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '' at line 1
Wo muß ich jetzt diesen Fehler suchen ?

Thx im voraus für eure Hilfe.

Gruß, Mike
 
PHP:
echo $sql_copy.'<br>';
;)

Und du musst dem mysql_query noch eine Verbindung zuweisen.
 
Zurück