DB-Schema zweier DBs abgleichen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
mr.no-name
Mitglied
Beiträge: 1883
Registriert: 20.10.2003 12:07
Wohnort: Hannover

DB-Schema zweier DBs abgleichen

Beitrag 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...
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
mr.no-name
Mitglied
Beiträge: 1883
Registriert: 20.10.2003 12:07
Wohnort: Hannover

Beitrag 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!
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
mr.no-name
Mitglied
Beiträge: 1883
Registriert: 20.10.2003 12:07
Wohnort: Hannover

Beitrag 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.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“