PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL Dump Probleme



Matflasch
16-12-2004, 06:52
Hi,

ich habe mir eine Tabelle mit 93 Spalten erstellt. Diese Spalten enthalten direkt pro Eintrag die Daten von MP3-Dateien. Ich habe die MP3-Dateien mit Java ausgelesen und direkt in die Datenbank eingetragen.

Einen Dump habe ich mir selbst erstellt über Java. Es ist direkt ausführbarer SQL-Code. Nun ist die Datei aber schon sehr gross, zu Testzwecken habe ich 15000 Einträge gemacht. Nun wollte ich eigentlich den Dump einlesen und schauen, welche Spalten wirklich wichtig sind, weil die meisten immer leer bleiben...

Allerdings habe ich grad Probleme den Dump einzulesen.
Ich habe das Eintragen der Einträge mittels

'INSERT DELAYED INTO...'
gemacht. Allerdings sagt mir MySQL immer

MySQL Server has gone away...

Um den Dump einzulesen nutze ich unter Windows 2000 MySQL-Front, welches bei MySQL dabei war.

Eine kleine Sache gibt's noch zu der Datei an sich zu sagen, woran es liegen könnte?!
Den Dump habe ich so gemacht, dass jeder Spalteneintrag in einer Zeile steht. Dadurch ist der Dump nun auf eine Zeilenanzahl von 478881 Zeilen gekommen. Könnte es daran liegen?
Oder verkraftet MySQL-Front das nicht?
Oder ist das einfach zu viel für MySQL?

Die Dump Größe ist 5MB.

Bzw. kennt jemand noch eine alternative zu MySQL-Front (mit dem ich das evtl einlesen kann)?

Mfg, Matflasch


Edit:
Ich habe es gerade nochmal probiert mit:

mysql -u username -vvv < mp3.sql

Allerdings kommt nach einiger Zeit:

ERROR 2006 at line 108: MySQL server has gone away

In Zeile 108 steht:

INSERT DELAYED INTO tabellenname
Also das Query, was die Einträge hinzufügt...
*grübel

Pingu
16-12-2004, 07:20
Hi,

ich habe keine Lösung nur eine Vermutung: Könnte es vielleicht am INSERT DELAYED liegen?
Ich meine, Du "bombardierst" ihn mit den ganzen Anfragen innerhalb einer kurzen Zeit ohne ihm vielleicht die Chance zu geben die Aufrufe auszuführen. Denn AFAIK werden die INSERT DELAYED in einer Queue gespeichert bis der Server nichts mehr zu tun hat und sie dann ausführt. Die Queue läuft bei Dir voll, deswegen müssen neue INSERT's warten und dort läuft der jeweilige Client dann vielleicht in einen Timeout.

Deshalb meine Meinung: Wenn man einen Dump zurückspielt ist Zeit irrelevant. Ergo kann man auch normale INSERT's verwenden.

Pingu

Matflasch
16-12-2004, 08:09
Also am DELAYED liegt es nicht, habe es auch schon ohne Probiert.

Allerdings werden die Datensätze ja nur mit einem Query eingetragen.
Ich hätte besser immer wieder
insert into xxx.....
insert into xxx.....


Also pro Datensatz, das wäre, glaub ich, besser gewesen ;)

Naja... ändern ich dann noch ab.

Allerdings wäre es nicht schlecht, wenn ich die heut noch einlesen könnte *g*
Gibt es evtl ein anderes Frontend oder so, welches das hinkriegen könnte oder gar die Querys abändern kann?
Also aus dem einen ganz viele einzelne machen?

15000 Einträge möcht ich grad nicht unbedingt editieren ;)

Sonst muss ich das halt im Programm abändern und dann nochmal einlesen und dann den Dump erneut erstellen... mal sehen

Mfg, Matflasch

Matflasch
16-12-2004, 16:34
Ok...
hab mein Programm abgeändert, so dass pro eintrag ein 'INSERT INTO...' da ist.
Problem ist nur, dass ein 'OutOfMemomy' Fehler, oder wie der jetzt genau heisst, kommt.

Das ist wohl zu viel für java....

und nu? :confused:

Matflasch
17-12-2004, 07:11
Ich habe vorhin mal einen Dump aus phpMyAdmin raus gemacht.

Der Dump ist so aufgebaut:


DROP TABLE IF EXISTS ...;
CREATE TABLE....;
INSERT INTO tablename ('feld1','feld2',....) VALUES
('wert1','wert2'),
('wert1','wert2'),
('wert1','wert2'),
('wert1','wert2');


Mit ca 15000 Einträgen bei 93 Spalten ist der Dump 16MB gross und MySQL sagt mal wieder schön...

MySQL has gone away...

Geht das überhaupt?
Oder muss ich mehrere Dumps erstellen? Von ID 1 bis 1000, 1001 bis 2000 oder so?

elrond
17-12-2004, 07:25
Dein Dump sollte so aussehen


INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);
INSERT INTO tablename ('feld1','feld2',....) VALUES (val1,val2,...);


wenn Du von einer mysql-db einen dump ziehst, kannst du dir's ja ansehen...


PS: 93 Spalten in einer Tabelle? :eek: :confused: :cool: :rolleyes:

Matflasch
17-12-2004, 08:22
Den Dump hab ich ja von ner MySQL-DB gemacht, zwar mittels PHPMyAdmin, aber naja...

Den Dump habe ich auch in meinem Java Programm so aufgebaut, dass pro Datensatz ein 'INSERT INTO...' ist, also wie du es beschrieben hast...

Dann ist nur das Problem da, dass Java das nicht mitmacht, weil das zu viel Speicher braucht... (Das erstellen des Dumps...).

Hab mir den Dump nun in 1000er 'häppchen' aufgeteilt, einfach mehrere sql.dateien erstellt. damit gehts nun, ist aber nur eine zwischenlösung ;)

Die Tabelle wird auch noch kleiner, ich hab nur ne lib gefunden, mit der ich aus MP3s halt Daten auslesen kann. Damit ich erfahre, welche Daten 'wichtig' sind und welche meistens eh leer sind, habe ich einfach jede menge mp3s eingelesen und schau nun, welche spalte sich lohnt ;)
Habs nun auf 32 Spalten gekürzt...

elrond
17-12-2004, 09:31
ich bin mir nicht sicher, ob du dich an dieser stelle nicht unnötig quälst...

mysqldump (auf der shell) liefert ein ingaches ASCII-File im korrekten Format. Manchmal ist's einfacher die GUI nicht zu benutzen...

Matflasch
17-12-2004, 12:25
Jo mysqldump kenne ich wohl. Allerdings bin ich damit nicht so flexibel, wie ich das gern hätte ;)

Wenn ich mysqldump benutze, muss entweder der MySQL-Bin Ordner in der PATH-Variable sein, damit ich es einfach aufrufen kann, oder ich muss den user das MySQL-Bin Verzeichnis angeben lassen.
Dann kann ich mysqldump wohl benutzen.

Und ich bin nicht so der Fan von System.exec() bzw Runtime.getRuntime().exec()....
Ich nehm das lieber selbst in die Hand, allerdings wenn Java da nicht mitmacht, dann muss ich mir noch was anderes einfallen lassen ;)

Evtl bin ich ja auch gezwungen, es über mysqldump zu machen.

Romanday
18-12-2004, 01:17
2000 MySQL-Front als GUI greift per ODBC auf Mysql zu, und für solche
großen Dumps nicht gedacht.

PHPmyAdmin hat in der Grundeinstellung (php.ini) nur 30 Sek. Zeit für den
Dump.

Lösung je nach OS:
Batchdatei, Shellscript, C-Programm oder Servlet usw. für diesen Zweck
schreiben.

oder direkt auf der Konsole den Dump machen.