Backup von Datenbank-Tabellen

Nun hast du mich vollends verwirrt. :eek:

Wo soll ich ...
PHP:
echo $sql_copy.'<br>';
... einfügen ?

Warum muß ich mysql_query noch eine Verbindung zuweisen,
wenn diese schon hier ...
PHP:
$sql_ziel = "$datenbank_ziel.$tabelle, $connect_ziel";
... und hier ...
PHP:
$sql_ziel = "$datenbank_quelle.$tabelle, $connect_quelle";
... zugewiesen wurde ?
 
PHP:
$link = mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_database,$link));

$link2 = mysql_connect($db_server2, $db_user2, $db_pass2);
mysql_select_db($db_database,$link2));



$sql_copy = "INSERT INTO xxx SELECT * FROM xxx";
mysql_query($sql_copy, DATENBANKLINK) or die (mysql_error());

DATENBANKLINK muss mit der gewünschten Datenbank ersetzt werden, jedoch wirde deine SQL so nicht funktionieren

Du musst die Daten in einer while Schleife in ein Array packen und mit einer weiteren while Schleife diese in die 2.Datenbank einfügen

Das echo habe ich nur erwähnt, damit du deine $sql - Queries, bevor du sie zur Datenbank schickst, einmal lesen kannst ;)

mfg

bo
 
Das bedeutet also, daß ich diese Funktion ...
PHP:
$sql_copy = "INSERT INTO xxx SELECT * FROM xxx";
... nur anwenden kann, wenn beide Datenbänke den gleichen
Zugriffs-Account verwenden.

Liegen die Datenbänke, wie im vorliegenden Fall, auf verschiedenen
Verzeichnissen und werden auch mit unterschiedlichen Passwörtern
abgesichert, ist es nicht möglich, diese unterschiedlichen Verbindungen
direkt mit einzubinden.
 
Nein, das heißt es eben nicht. Die Datenbanken können unterschiedliche Namen, Nutzer und zugehörige Kennwörter haben, und du kannst dennoch auf beide parallel zugreifen.
 
Wo aber muß ich nun die Datenbank-Verbindungen dazu einbauen ?

Und viel wichtiger wäre, woher kommt diese Syntax-Fehler-Meldung ?
 
Siehe hier:
PHP:
$link = mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_database,$link));

$link2 = mysql_connect($db_server2, $db_user2, $db_pass2);
mysql_select_db($db_database,$link2));



$sql_copy = "INSERT INTO xxx SELECT * FROM xxx";
mysql_query($sql_copy, DATENBANKLINK) or die (mysql_error());
DATENBANKLINK muss mit der gewünschten Datenbank ersetzt werden, jedoch wirde deine SQL so nicht funktionieren

Du musst die Daten in einer while Schleife in ein Array packen und mit einer weiteren while Schleife diese in die 2.Datenbank einfügen

Das echo habe ich nur erwähnt, damit du deine $sql - Queries, bevor du sie zur Datenbank schickst, einmal lesen kannst ;)

mfg

bo
 
Hey,

mach dich doch erstmal ein wenig schlauer über PHP/mySQL -> es guibt genügend Tuts -> dann weißt du woher einige Fehler kommen (können) ;)

Du musst die Datenbankverbindung aufbauen um die Daten von der ersten Datenbank zu holen; diese kannst du in einem Array abspeichern.
Die Verbindung kannst du anschließend schließen.

Dann öffnest du die zweite Datenbankverbindung und fügst via while oder for Schleife die Daten , die in deinem Array (von der ersten Datenbankverbindung) liegen, in die zweite Datenbank ein.


bo
 
Okay, hat mich mal gereizt es zu testen:

PHP:
//Verbindungen herstellen
$conn1 = mysql_connect("localhost", "User1", "Passwort1", true);
$conn2 = mysql_connect("localhost", "User2", "Passwort2", true);

//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);

	//Falls keine ID-Spalte vorhanden, ungeordnet auslesen
	if($res_datensaetze == false){
		$res_datensaetze = mysql_query("SELECT * FROM ".$tabelle[0], $conn1);
	}
	
    //Backup-Tabelle leeren
    mysql_query("TRUNCATE TABLE ".$tabelle[0], $conn2);
	
	//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);				
		
		//Wenn eine alte ID vorhanden ist, den entsprechenden Datensatz der Backup-Tabelle mit der neuen, fortlaufenden überschreiben
		if (!is_null($alte_id)){
			$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);

(!) Aber bitte beachten:
Prüfung auf Exceptions fehlt .
Transaktionen und eventuelle Fremdschlüssel wurden außer acht gelassen.
Du musst Dich selber um korrespondierende Tabellen in beiden DBs kümmern (Aufbau, Bezeichnungen, etc.).
 
Hey,

sieht doch schon mal gut aus, aber warum sind dir die IDs so wichtig?
Les doch einfach alle Einträge aus db1 in ein Array; dabei sortiere sie nach der Zeit/ID o.ä. und füge die via INSERT einfach in die db2 ein.

Sobald in der db2 ein primärschlüssel mit auto_increment existiert fügt er von selbst neue IDs ein ;)

Und kann es sein, dass du bei diesem Beispiel nur eine Tabelle "synchronisierst"?

mfg
bo
 
Hi!
Also bei mir hat er erfolgreich drei Tabellen synchronisiert. Er duchläuft ja ein Result-Set mit dem Ergebnis von
SQL:
SHOW TABLES
von daher sollte er keine übersehen. Sonst wäre ich ihm schon irgendwie böse ;).

Mir persönlich sind fortlaufende IDs nicht so wichtig, darum verstehe ich auch nicht ganz, warum Mike sie gerne reorganisieren möchte, aber das ist ja seine Sache; war halt eine Anforderung seiner Problemstellung.

Schau Dir meine Lösung bitte nochmal an, dann siehst Du, dass ich die Einträge sortiert nach der ID einlese (so denn eine vorhanden ist), und dann in die entsprechende Backup-Tabelle einfüge.
Problem dabei ist aber, dass auch die alten IDs eingefügt werden, so dass gar kein auto_increment-Wert erzeugt wird.

Um es nicht unnötig zu kompliziert zu machen, will ich Mike ersparen, auch noch für jede Tabelle die Spalten auszulesen und dann dynamisch in die INSERT-Anweisung mit den passenden Values einzubauen.
 
Zuletzt bearbeitet von einem Moderator:
Zurück