Seite 1 von 1

DB-Schema zweier DBs abgleichen

Verfasst: 04.09.2007 23:28
von mr.no-name
Hallo,

ich befasse mich momentan damit, zwei phpBB Foren zusammenzuführen. Nennen wir das bisherige Forum Forum1 und das hinzukommende Forum Forum2.

Leider meckert der entsprechende merge-Mod rum, wenn die Forum2 Datenbank mehr Felder/Tabellen als die Forum1 Datenbank hat. Ist ja auch logisch und sinnvoll, damit auch wirklich alle Inhalte in Forum1 übernommen werden können.
Da die Datenbanken leider etwas unübersichtlich sind, wäre eine Überprüfung per Hand relativ zeitaufwändig.

Daher meine Frage:
Wie kann ich dafür sorgen, dass ich eine neue Datenbank habe, deren Struktur die Vereinigung der Strukturen der Datenbanken von Forum1 und Forum2 sind?
Ich kann natürlich DB-Dumpfiles der Struktur ohne Daten erstellen, aber wie kann ich diese kombinieren?

Wenn ich nämlich die Struktur von Forum1 zugrunde lege, kann ich leider nicht die Daten von Forum2 dort einfügen, da Forum2 leider auch Felder hat, die in Forum1 nicht vorhanden sind, aber eben unwichtig für meinen Zweck sind...

Verfasst: 05.09.2007 01:26
von gn#36
Du willst die zusätzlichen Felder aus DB 2 nicht mehr haben?
Sind denn alle Felder aus DB 1 in DB 2 vorhanden oder gilt das ganze auch andersherum?

Du kannst natürlich einen Vergleich per Skript versuchen. Du liest die Felder aus DB 1 ein und holst dann genau diese Felder aus DB 2. Tritt dabei ein Fehler auf (weil z.b. ein Feld nicht existiert) dann musst du per Skript alle Felder testen und die Weglassen die nicht funktionieren.

Aufbau des skriptes wäre grob so:

Code: Alles auswählen

$sql = 'SHOW tables';
$tables1 = $db1->sql_query($sql);
while($table = $db1->sql_fetchrow(...))
{
$table_array1[] = $table;
}
//Gleiches für die andere DB

//Vergleichen
foreach($table_array1 as $tabelle)
{
if(!in_array($tabelle,$table_array2))
{
$fehlt_in_db2[] = $tabelle;
}
else
{
$in_beiden[] = $tabelle;
}
//Analog noch mal für die andere DB (aber ohne else), jetzt kennen wir alle zusätzlichen Tabellen, und können diese z.b. per SQL Befehl anlegen.

//Ähnliches Vorgehen für die einzelnen Tabellenfelder:
foreach($in_beiden as $tabelle)
{
$sql = "SHOW fields FROM $table";
$felder = $db1->sql_query($sql);
//Das gleiche für Tabelle 2
//Dann vergleichen analog oben, auch hier können die Felder angelegt werden.
}
Genau ausformulieren musst du das noch selbst, aber grob so könntest du es automatisieren.

Verfasst: 05.09.2007 10:03
von mr.no-name
Hmm - ich merke gerade, dass ich gestern Abend etwas wirr geschrieben habe, bzw. es genau falsch herum formuliert habe :oops:

Also nochmal richtig:
Ich muss dafür sorgen, dass die Datenbank2 um alle fehlenden Felder/Tabellen von Datenbank1 erweitert wird.

Komplette Tabellen zu ergänzen ist kein Problem, da man dann ja einfach eine Sicherung der Struktur von Datenbank1 zugrunde legen kann.
Aber das eigentliche Problem sind also die fehlenden Felder in schon vorhandenen Tabellen...

"Einfach" die Struktur von Datebank1 zugrunde legen kann ich leider nicht, da dann wiederum das Einfügen der Daten in Datenbank2 nicht funktioniert, da Datenbank2 auch Felder hat, die Datenbank1 nicht hat.

Ich werde mir aber mal dein Script ansehen, trotzdem bin ich für weitere Tipps dankbar!

Verfasst: 05.09.2007 11:48
von gn#36
Wenn du das oben angegebene Skript lauffähig machst (die Kommentare beachten und ... ersetzen) dann sollte es genau das können (und ergänzt nebenbei auch die fehlenden Tabellen. Du musst vorher lediglich zu beiden Datenbanken eine Verbindung aufbauen (sofern es unterschiedliche Datenbanken sind), z.b. mit den Objekten db1 und db2. Wenn es nur eine DB ist musst du in dem Skript oben die Tabellen nach dem Prefix filtern statt die Abfrage zwei mal auszuführen, ansonsten ist das Vorgehen aber analog.

Verfasst: 05.09.2007 14:21
von mr.no-name
Ich glaube, ich stehe gerade irgendwie auf dem Schlauch...bzw. bekomme das Script nicht zum Laufen, da ich in der Richtung bisher zu wenig Erfahrung habe.

Wie schaffe ich es denn, eine Verbindung zu beiden Datenbanken aufzubauen und die Objekte den Variablen db1 und db2 zuzuweisen?
Ich würde das Script halt gerne als stand-alone Variante nutzen können, da ich in Zukunft öfters solche Dinge (nicht nur im Zusammenhang mit phpBB) erledigen muss.

Also schonmal vielen Dank für dieses Script, aber es wäre super, wenn du mir da noch etwas weiterhelfen könntest, mit konkreten Beispielen oder so.

Verfasst: 05.09.2007 14:39
von gn#36
Verbindung zu beiden Datenbanken - auf Basis des phpbb Datenbankobjekts geht so:

Code: Alles auswählen

define('IN_PHPBB',true); //Um keinen Skriptabbruch zu erhalten
$phpbb_root_path = './'; //Zur Sicherheit, eigentlich unnötig
$phpEx = 'php';
include('db/mysql.php');
$db1 = new sql_db('HOST', 'USER', 'PASSWORT', 'DATENBANKNAME', false);
$db2 = new sql_db('HOST', 'USER', 'PASSWORT', 'DATENBANKNAME', false);
Du musst nur die Daten der Datenbanken entsprechend ersetzen.

Du könntest natürlich auch ohne das DB Objekt mit den mysql_xx Funktionen arbeiten, das hat aber den großen Nachteil, dass du ständig darauf achten musst, dass du die richtige Verbindungs-ID mitangibst, das erledigt die Klasse für dich automatisch. Der Rest des Skriptes ist ja im Prinzip nicht phpbb spezifisch, sondern nimmt einfach alle Tabellen und synchronisiert die Tabellen. Aufpassen musst du allerdings bei Feldern die sich z.b. in ihrer Länge oder ihrem Typ Ändern. Das ist nicht abgedeckt und wird auch nicht erkannt.