Datenbank zyklisch importieren

Datenbank zyklisch importieren

am 01.04.2008 09:22:30 von usenet

Hallo NG,

ich stehe vor folgendem Problem:

Ein Demo-System, in dem Interessierte sich als Administratoren einloggen
können, soll täglich wieder auf den Ursprungszustand zurückversetzt
werden. Zu diesem Zweck habe ich einen Cronjob und ein entsprechendes
PHP-Script vorbereitet, das die Datenbank leeren und wieder mit dem Dump
des Ursprungszustands füllen soll.

Was mir letztendlich den Stock zwischen die Beine wirft sind die
CONSTRAINTS der Foreign-Keys, die ja verhindern, dass der Artikel
angelegt wird, bevor der entsprechende Benutzer auch an seinem Platz
ist. Dementsprechend stürzt das Script mit folgender Exception ab:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or
update a child row: a foreign key constraint fails (`livedemo/forms`,
CONSTRAINT `forms_ibfk_1` FOREIGN KEY (`sockets_ID`) REFERENCES
`sockets` (`ID`) ON DELETE CASCADE)

Was kann man hier machen? Kann ich beim Export mit PMA oder mysql selbst
die Reihenfolge beeinflussen? Eigentlich müssen ja nur die kritischen
Datensätze als erstes importiert werden, aber ich kann das ja nicht
händisch zusammenstöpseln.


Danke für Tipps,
Habbo

Re: Datenbank zyklisch importieren

am 01.04.2008 09:29:29 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Datenbank zyklisch importieren

am 01.04.2008 09:47:11 von usenet

Andreas Kretschmer wrote:
> wie ist der Dump erstellt? Wie wird er eingespielt?

Indem ich mit phpMyAdmin die entsprechenden Tabellen mit den richtigen
Einstellungen exportiere. Eingespielt wird er, indem ich das Dump
Zeilenweise einlese und per Query wieder an die Datenbank schicke.

> Einklich sollte sowas nicht passieren, wenn der Dump mit den Mitteln der
> DB erstellt wurde. Falls Du das gemacht hast, dann ist das eher ein
> Problem der DB und Du solltest in einer passenden Gruppe nachfragen.

Ich habe mir schon gedacht, dass der sauberste Weg auf die Boardmittel
von mysql selbst hinauslaufen wird, aber ich möchte gerne diesen
Algorithmus möglichst ohne die Kommandozeile abbilden, da der Cronjob
dafür Bestandteil des CMS wird und deswegen maximal portabel und
möglichst einfach zu nutzen sein soll.

> Hint: Man wird Dich nach der Versionsnummer der beteiligten Komponenten
> fragen. Falls Du schlau sein willst, solltest Du dieser Frage
> zuvorkommen.

Hab ich völlig vergessen, danke!

PHP Version 5.2.3
MySQL Version: 5.0.41


Gruß,
Habbo

Re: Datenbank zyklisch importieren

am 01.04.2008 09:56:44 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Datenbank zyklisch importieren

am 01.04.2008 10:10:09 von usenet

Andreas Kretschmer wrote:
> begin Jan Habbo Br?üning schrieb:
>> Indem ich mit phpMyAdmin die entsprechenden Tabellen mit den richtigen
>
> Mach Dich mal über den Begriff 'Mantra' in der MySQL-NG schlau.

Mir ist schon klar, dass das Problem dadurch verursacht wird, dass
phpMyAdmin die INSERTS in falscher Reihenfolge produziert. Das habe ich
meiner Meinung nach bei der Problembeschreibung auch schon deutlich
gemacht. Meine Frage zielt auch nicht darauf ab, *wieso* mein Import
fehlschlägt, sondern wie ich es besser lösen kann. Auch habe ich gesagt,
dass mir durchaus bewusst ist, dass ich mit der Ex- und Importfunktion
von MySQL selbst wahrscheinlich besser beraten bin. Ich habe aber auch
Gründe genannt, warum ich lieber nicht auf MySQLs Boardmittel
zurückgreifen will (was natürlich nicht heißt, dass ich nicht eines
besseren zu belehren wäre ...).

Von daher sehe ich mich hier zu unrecht auf das Mantra hingewiesen :-)


Gruß,
Habbo

Re: Datenbank zyklisch importieren

am 01.04.2008 10:15:56 von Niels Braczek

Jan Habbo BrŸüning schrieb:

> Mir ist schon klar, dass das Problem dadurch verursacht wird, dass=20
> phpMyAdmin die INSERTS in falscher Reihenfolge produziert. Das habe ich=
=20
> meiner Meinung nach bei der Problembeschreibung auch schon deutlich=20
> gemacht. Meine Frage zielt auch nicht darauf ab, *wieso* mein Import=20
> fehlschlägt, sondern wie ich es besser lösen kann.

Kannst du die Zeilen im Dump nicht manuell umstellen? Das muss ja nur
1mal gemacht werden...

MfG
Niels

--=20
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |=

| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |=

| Webdesign · Webhosting · e-Commerce · Joomla! Content Ma=
nagement |
------------------------------------------------------------ ------

Re: Datenbank zyklisch importieren

am 01.04.2008 10:30:59 von usenet

Niels Braczek wrote:
> Kannst du die Zeilen im Dump nicht manuell umstellen? Das muss ja nur
> 1mal gemacht werden...

An sich schon. Die Problematik besteht darin, dass das Demo-System
natürlich auch gepflegt und erweitert werden soll, und dann nicht
jedesmal großer Aufwand zur Synchronisierung entstehen soll.

Ich löse es im Moment folgendermaßen: Das Script durchläuft das Dump
vollständig und erzeugt ein assoziatives Array der Tabellennamen und
verteilt die INSERTs entsprechend auf dieses Array. Danach arbeitet es
dieses Array Tabelle für Tabelle ab und berücksichtigt dabei ein zweites
Array, in welchem ich die Reihenfolge des Imports festlege. Durch das
assoziative Array kann das Script dann gezielt die Queries der Tabellen
mit Priorität zuerst bearbeiten. Das funktioniert soweit genauso, wie
ich es mir gewünscht habe. Trotz Umsortiererei bleibt die
Ausführungszeit mit allem Drum und Dran unter 0.1 Sekunden.

Soweit ich das beurteilen kann, ist dies eine adäquate Lösung. Durch die
Transaktionen von InnoDB kann ich den Vorgang sogar atomisieren.


Schöne Grüße,
Habbo

Re: Datenbank zyklisch importieren

am 01.04.2008 21:54:49 von Claus Reibenstein

Jan Habbo BrŸüning schrieb:

> Mir ist schon klar, dass das Problem dadurch verursacht wird, dass
> phpMyAdmin die INSERTS in falscher Reihenfolge produziert.

Nein. Es wird dadurch erzeugt, dass Du beim Sichern die Option
"Fremdschlüsselüberprüfung deaktivieren" nicht aktiviert hast.

Du kannst die Überprüfung manuell vor dem import mit

SET FOREIGN_KEY_CHECKS=0

aus und danach mit

SET FOREIGN_KEY_CHECKS=1

wieder einschalten.

Gruß. Claus

Re: Datenbank zyklisch importieren

am 02.04.2008 08:33:51 von usenet

Claus Reibenstein wrote:
> Nein. Es wird dadurch erzeugt, dass Du beim Sichern die Option
> "Fremdschlüsselüberprüfung deaktivieren" nicht aktiviert hast.

Ich danke dir Claus.


Gruß,
Habbo