Wie kann ich Database Integrity prüfen?

Wie kann ich Database Integrity prüfen?

am 31.08.2006 11:22:11 von Zsolt Koppany

Hi,

Ich habe in der Datenbank alte Daten die noch ohne FOREIGN KEY eingefügt
wurden (mysql hat damals keine FOREIGN KEYS unterstützt). Später haben wir
die FOREIGN KEYS hinzugefügt. Heute hat mysql-4.1.21 (mit Recht) ein INSERT
abgelehnt, weil ein Key nicht mehr existierte.

Ich habe versuch mit "mysqlcheck -e" solche bestehende Integrity Probleme zu
finden leider ohne Erfolg (alle Tabellen wurden mit OK gemeldet). Wenn ich
die Datenbank mit mysqldump exportiere und mit mysql importiere treten
(warum eigentlich nicht?) keine Probleme auf.

Ich habe mit google auf mysqlcheck mit FOREIGN gesucht aber nichts passendes
gefunden.

Wie kann ich die existierende Problem wenigstens rausfinden?

zsolt

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 11:38:42 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 11:49:40 von Kai Ruhnau

Zsolt Koppany wrote:
> Ich habe in der Datenbank alte Daten die noch ohne FOREIGN KEY eingefügt
> wurden (mysql hat damals keine FOREIGN KEYS unterstützt). Später haben wir
> die FOREIGN KEYS hinzugefügt.

Habt ihr InnoDB als Typ verwendet, dann werden, wenn der Constraint
angelegt wird, alle Referenzen überprüft und gegebenenfalls schlägt das
Hinzufügen des FOREIGN KEYs fehl. Die Datenbank ist anschließend also in
jedem Fall konsistent. Genau dieses Verhalten hatte mir bei meiner
Umstellung einige (sinnvolle!) Arbeit gekostet.

> Heute hat mysql-4.1.21 (mit Recht) ein INSERT
> abgelehnt, weil ein Key nicht mehr existierte.

Das ist doch gut.

> Ich habe versuch mit "mysqlcheck -e" solche bestehende Integrity Probleme zu
> finden leider ohne Erfolg (alle Tabellen wurden mit OK gemeldet).

Wieso ist das ein Integrity Problem, wenn ein INSERT aufgrund einer
fehlenden Referenz zurückgewiesen wird?

> Wenn ich
> die Datenbank mit mysqldump exportiere und mit mysql importiere treten
> (warum eigentlich nicht?) keine Probleme auf.

SET FOREIGN_KEY_CHECKS=0
in einem versionsabhängigen Kommentar zu Beginn des Dumps.

> Ich habe mit google auf mysqlcheck mit FOREIGN gesucht aber nichts passendes
> gefunden.
>
> Wie kann ich die existierende Problem wenigstens rausfinden?

Ich verstehe nicht, wo du ein Problem hast.

Grüße
Kai

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 12:22:53 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 12:23:47 von Zsolt Koppany

> Ich verstehe nicht, wo du ein Problem hast.



Das Problem ist, dass ich in der Datenbank schon inkonsistente Daten habe.
Die Ursache ist wahrscheinlich, dass wir die alte 3.x Daten (nur die die
Daten und kein CREATE TABLE ...) mit mysqldump exportiert haben und diese
inkonsistente Daten mit mysql ohne Problem importieren konnten, d.h. wir
haben immer noch inkonsistente Daten. Das Problem wird ein echtes Problem,
wenn wir falsche Daten dann kopieren (INSERT).



Zsolt

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 13:24:26 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 15:12:34 von Zsolt Koppany

Mein Boss wäre bestimm begeistert.

> Dann solltest Du die Datenbank entsorgen, sie taugt nix.

CREATE TABLE u1(
desc CHAR(100),
user_id INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id));

CREATE TABLE u2(
datum DATETIME,
user_id INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id));

SELECT user_id FROM u2 WHERE datum>'2006-08-30'

Ich bekomme z.B. user_id=1 und user_id=567 aber users.id=1 gibt es NICHT
mehr existiert.

INSERT u1(desc,user_id) VALUES('xy',1),('def',567)

Wird nicht funktionieren, beide werte gehen verloren.

Wir haben ca. 80 Tabellen mit ähnlichen Problemen. Wie kann ich die
Integrity Probleme mit einem Tool rausfinden?

Zsolt

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 15:57:06 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 16:49:28 von Zsolt Koppany

>> INSERT u1(desc,user_id) VALUES('xy',1),('def',567)
>
>> Wird nicht funktionieren, beide werte gehen verloren.
>
> Gehen einfach sang- und klanglos verloren? Oder erzeugen einen Fehler?

Doch, ich bekomme ein Exception.

>> Wir haben ca. 80 Tabellen mit ähnlichen Problemen. Wie kann ich die
>> Integrity Probleme mit einem Tool rausfinden?
>
> Abfragen, welche user_id in u1 _NICHT_ in users(id) sind?
Kann ich natürlich machen aber wir haben ca. 80 Tabellen und 20-30 FOREIGN
KEYS.

Zsolt

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 18:34:59 von Thomas Rachel

Zsolt Koppany wrote:

>>> INSERT u1(desc,user_id) VALUES('xy',1),('def',567)
>>
>>> Wird nicht funktionieren, beide werte gehen verloren.
>>
>> Gehen einfach sang- und klanglos verloren? Oder erzeugen einen Fehler?
>
> Doch, ich bekomme ein Exception.

Und was hindert Dich daran, den Wortlaut derselben hier zu posten? Immerhin
könnte sie evtl. dazu beitragen, daß man Dir helfen kann.

>>> Wir haben ca. 80 Tabellen mit ähnlichen Problemen. Wie kann ich die
>>> Integrity Probleme mit einem Tool rausfinden?
>>
>> Abfragen, welche user_id in u1 _NICHT_ in users(id) sind?
> Kann ich natürlich machen aber wir haben ca. 80 Tabellen und 20-30 FOREIGN
> KEYS.

Das ließe sich aber doch sicher mit Hilfe eines Skriptes in einer Dir
genehmen Sprache lösen: Tabellenpaar übergeben und ID-Liste erhalten.

SHOW INDEX FROM tbl_name oder SHOW CREATE TABLE tbl_name, Ergebnis
entsprechend parsen und daraus einen SQL-Query bauen, der die Verhältnisse
untereinander zeigt.

Zeigt SHOW INDEX bei InnoDB auch "Ziel"-Tabelle und -spalte, oder muß man
dafür die Ausgabe von SHOW CREATE TABLE parsen?

Wie auch immer, auf diesem Wege erhältst Du den Namen der verknüpften Felder
in beiden Tabellen und kannst eine Liste generieren lassen.

Zur Not gibst Du dem Skript Tabelle1, Feld1, Tabelle2, Feld2 mit und das
Skript setzt einfach ein.

Ob Du dafür Shell, Perl, Python, PHP, C oder eine beliebige andere Sprache,
für welche ein MySQL-Binding existiert, einsetzt, bleibt Dir überlassen.

HTH,


Thomas
--
Fernsehen ist die aktive Form des Faulenzens. (Henning Venske)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 18:56:34 von Zsolt Koppany

Thomas,

genau ein solches Tool hätte ich gerne.

Zsolt

"Thomas Rachel" schrieb im
Newsbeitrag news:ed733j$bnm$1@glglgl.ath.cx...
> Zsolt Koppany wrote:
>
>>>> INSERT u1(desc,user_id) VALUES('xy',1),('def',567)
>>>
>>>> Wird nicht funktionieren, beide werte gehen verloren.
>>>
>>> Gehen einfach sang- und klanglos verloren? Oder erzeugen einen Fehler?
>>
>> Doch, ich bekomme ein Exception.
>
> Und was hindert Dich daran, den Wortlaut derselben hier zu posten?
> Immerhin
> könnte sie evtl. dazu beitragen, daß man Dir helfen kann.
>
>>>> Wir haben ca. 80 Tabellen mit ähnlichen Problemen. Wie kann ich die
>>>> Integrity Probleme mit einem Tool rausfinden?
>>>
>>> Abfragen, welche user_id in u1 _NICHT_ in users(id) sind?
>> Kann ich natürlich machen aber wir haben ca. 80 Tabellen und 20-30
>> FOREIGN
>> KEYS.
>
> Das ließe sich aber doch sicher mit Hilfe eines Skriptes in einer Dir
> genehmen Sprache lösen: Tabellenpaar übergeben und ID-Liste erhalten.
>
> SHOW INDEX FROM tbl_name oder SHOW CREATE TABLE tbl_name, Ergebnis
> entsprechend parsen und daraus einen SQL-Query bauen, der die Verhältnisse
> untereinander zeigt.
>
> Zeigt SHOW INDEX bei InnoDB auch "Ziel"-Tabelle und -spalte, oder muß man
> dafür die Ausgabe von SHOW CREATE TABLE parsen?
>
> Wie auch immer, auf diesem Wege erhältst Du den Namen der verknüpften
> Felder
> in beiden Tabellen und kannst eine Liste generieren lassen.
>
> Zur Not gibst Du dem Skript Tabelle1, Feld1, Tabelle2, Feld2 mit und das
> Skript setzt einfach ein.
>
> Ob Du dafür Shell, Perl, Python, PHP, C oder eine beliebige andere
> Sprache,
> für welche ein MySQL-Binding existiert, einsetzt, bleibt Dir überlassen.
>
> HTH,
>
>
> Thomas
> --
> Fernsehen ist die aktive Form des Faulenzens. (Henning Venske)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 21:08:35 von Thomas Rachel

Zsolt Koppany wrote:

> Thomas,
>
> genau ein solches Tool hätte ich gerne.

Was für ein Tool? Ach so, das steht da unten. Warum eigentlich? Zitiere doch
bitte so, daß man die Zusammenhänge erkennt. Darauf wurdest Du doch scohn
öfters hingewiesen, oder?


>> Das ließe sich aber doch sicher mit Hilfe eines Skriptes in einer Dir
>> genehmen Sprache lösen: Tabellenpaar übergeben und ID-Liste erhalten.
>>
>> SHOW INDEX FROM tbl_name oder SHOW CREATE TABLE tbl_name, Ergebnis
>> entsprechend parsen und daraus einen SQL-Query bauen, der die
>> Verhältnisse untereinander zeigt.
>>
>> Zeigt SHOW INDEX bei InnoDB auch "Ziel"-Tabelle und -spalte, oder muß man
>> dafür die Ausgabe von SHOW CREATE TABLE parsen?
>>
>> Wie auch immer, auf diesem Wege erhältst Du den Namen der verknüpften
>> Felder
>> in beiden Tabellen und kannst eine Liste generieren lassen.
>>
>> Zur Not gibst Du dem Skript Tabelle1, Feld1, Tabelle2, Feld2 mit und das
>> Skript setzt einfach ein.
>>
>> Ob Du dafür Shell, Perl, Python, PHP, C oder eine beliebige andere
>> Sprache,
>> für welche ein MySQL-Binding existiert, einsetzt, bleibt Dir überlassen.


Nun, ein solches Tool ist vermutlich zu spezialisiert, daß es das schon
fertig geben würde - das müßtest Du Dir dann schon selbst schreiben.


Thomas
--
Meine Meinung ist Public Domain.
Jeder darf sie sich zu eigen machen.

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 23:21:46 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 23:25:49 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Wie kann ich Database Integrity prüfen?

am 31.08.2006 23:49:02 von Axel Schwenke

Andreas Kretschmer wrote:
> begin Zsolt Koppany wrote:
....
>> Ich bekomme z.B. user_id=1 und user_id=567 aber users.id=1 gibt es NICHT
>> mehr existiert.
>
> *Seufz*. Meine Vorurteile über MySQL bestätigen sich.

Nein. Das ist Zsolt. Den brauchst du nicht ernst zu nehmen.


XL

Re: Wie kann ich Database Integrity prüfen?

am 04.09.2006 13:15:33 von Zsolt Koppany

Axel,

halte bitte dein M.

Zsolt

"Axel Schwenke" schrieb im Newsbeitrag
news:egl7de.938.ln@xl.homelinux.org...
> Andreas Kretschmer wrote:
>> begin Zsolt Koppany wrote:
> ...
>>> Ich bekomme z.B. user_id=1 und user_id=567 aber users.id=1 gibt es NICHT
>>> mehr existiert.
>>
>> *Seufz*. Meine Vorurteile über MySQL bestätigen sich.
>
> Nein. Das ist Zsolt. Den brauchst du nicht ernst zu nehmen.
>
>
> XL

Re: Wie kann ich Database Integrity prüfen?

am 08.09.2006 08:04:48 von Thomas Rachel

Zsolt Koppany wrote:

> Axel,
>
> halte bitte dein M.

Sprach es und legte wieder ein astreines TOFU hin. (Nochmal für Dich zum
Mitschreiben: das heißt Text Oben Fullquote Unten, bedeutet, daß der
eigene Text _über_ das _vollständig_ zitierte Vorgängerposting
geklatscht wurde und ist unerwünscht.) Das hast Du in dem Thread hier
aber schon besser hinbekommen (wenn auch nicht optimal).


Mit anderen Worten: Dein Spruch oben war also ein klassisches Eigentor
von Dir.


Thomas