Archiv verlassen und diese Seite im Standarddesign anzeigen : große datenmengen in tabellenfeld einfügen
ich habe eine tabelle "videos" mit mehreren feldern,
unteranderem auch einem longblob-feld für die eigentlichen mpeg und rm-videodateien. aber ein insert into-befehl übers
netzwerk (php) geht nur bei kleinen datenmengen. meine datei
ist z.b. 1,5 MB groß und der insert-befehl geht da nicht mehr wohl aber bei dateien um 100-200kb. wie kann ich meine
videodatei in das spezielle longblob-feld EINZELN laden?
bei "load data" kann man ja nur alle tabellenfelder auf einmal einfügen oder gibt es da einen trick?
p.s. ich will nicht auf links der videos in feldern ausweichen !!!
tenim
"load data"? Mit welcher Datenbank und welchem Client/Script arbeitest du denn?
Achso, du meinst wohl sowas wie "LOAD DATA INFILE"... Das ist eigentlich nicht für sowas wie deinen Zweck konzipiert - nimm lieber ein ganz normales INSERT - was meinst du denn mit "geht da nicht mehr"?
ich benutze mysql und greife über ein lan auf den datenbankserver zu. wenn ich dann eine abfrage über php
starte(vom client) liefert "mysql_query" einen fehler zurück. aber der selbe befehl funktioniert bei kleineren
dateien. ich lese die datei erst komplett in eine
variable "$daten" und füge sie dann mit "mysql_query" in die datenbank ein.
tenim
[Editiert von tenim am 31-10-2001 um 14:31]
Was für einen Fehler denn?
könnte es sein das einfach ein Timeout kommt, das php Script betreffend, weil dieses nach 30 sec. abbricht ?
Er hat ja gemeint, dass die query einen fehler zurückgibt... Aber du hast recht... Der Fehler könnte durchaus bei der max_execution_time liegen.
das script sieht grob so aus:
$befehl="insert into vidos values(null,$richtung,'$dateiname','$beschreibung','$daten')";
if (! $resultat=mysql_query($befehl,$sql_handle) )
{
echo "Fehler: Konnte Abfrage nicht ausfuehren.";
sleep(2);
exit;
}
und wenn ich diese abfrage starte kommt obige fehlermeldung
was heissen muß das der befehl nicht ordnungsgemäß ausgeführt wurde. wenn ich aber in $daten eine kleinere datei reinlade, dann geht es.
timeout kann auch nicht das problem sein, weil die fehlermeldung schon nach ca. 2 sekunden kommt.
tenim
dann ist die Datei wohl zu gross, gibts ne Quota beim SQL Server ? Gibts sowas überhaupt ? Ich meine so wie eine max. Grösse bei eMails oder so ?
ka.
Änder doch bitte das echo um in:
echo "Fehler: Konnte Abfrage nicht ausfuehren: ".mysql_error();
und sag uns dann, was als Fehlerbeschreibung ausgegegen wurde.
es erscheint die meldung "MySQL server has gone away".
tenim
[Editiert von tenim am 31-10-2001 um 15:56]
Da haben wirs ja... Offensichtlich scheint es an irgendeiner zeit- oder datenabhängigen Einstellung des Servers zu liegen... Ich mach mich mal kurz schlau.
max_allowed_packet: The maximum size of one packet. The message buffer is initialized to net_buffer_length bytes, but can grow up to max_allowed_packet bytes when needed. This value by default is small, to catch big (possibly wrong) packets. You must increase this value if you are using big BLOB columns. It should be as big as the biggest BLOB you want to use. The current protocol limits max_allowed_packet to 16M.
Schau mal, was die bei dir für einen Wert hat und setz ihn bei Bedarf höher.
nächstes:
query_buffer_size: The initial allocation of the query buffer. If most of your queries are long (like when inserting blobs), you should increase this!
vgl. hierzu unter Umständen auch
http://www.mysql.com/doc/G/o/Gone_away.html
danke, probiere mal alles aus.
tenim
jetzt gehts!!
es lag an der variable max_allowed_packet.
die andere variable gibt es bei mir garnicht. villeicht habe
ich ja eine zu alte version (3.22.32).
tenim
leider zu früh gefreut, es funktioniert zwar,aber bei dateien >2MB wieder nicht. dann bringt mysql diese meldung:
Fatal error: Allowed memory size of 16777216 bytes exhausted at zend_stack.c:27 (tried to allocate 256 bytes) in [no active file] on line 0
ich habe in der php.ini die variabe memory_limit schon
auf 16777216 (16MB) gesetzt, hat aber auch nichts geholfen.
p.s. phpmyadmin geht dadurch auch nicht mehr richtig. immer wenn ich meine datenbank wählen will,
kommt die obige meldung. auf dem server läuft phpmyadmin komischerweise perfekt.
tenim
[Editiert von tenim am 31-10-2001 um 19:19]
probier sie noch höher zu setzen...
EDIT zur Info: Es muss an deinem Computer bzw. deiner PHP-Installation liegen.
[Editiert von Sky am 31-10-2001 um 19:22]
Hm.. hab mich gerade etwas zu diesem Thema umgesehen.. Die Erfahrungen anderer Leute mit diesem seltsamen Problem sind eher spärlich und nirgends findet sich eine Lösung... Auch scheinen die Fehler nur sporadisch und unter bestimmten Bedingungen aufzutreten.
EDIT: bugs.php.net hat etwas ähnliches zu bieten, wobei der Fehler in diesem Fall aber nicht in der zend_stack.c, die ja an sich ein Teil von PHP ist, auftritt, sondern in einem ganz bestimmten Script. Ein PHP-Supporter rät dazu auch nur, das memory_limit zu erhöhen...
Siehe http://bugs.php.net/bug.php?id=11832
EDIT 2: Wenn nun Scripts wie phpMyAdmin, die ja wahrscheinlich vorher einwandfrei funktioniert haben, auch nicht mehr gehen, solltest du _vielleicht_ PHP neu installieren.
EDIT 3: ...und dir vorher noch die aktuelle Version downloaden, falls du sie nicht bereits hast.
[Editiert von Sky am 31-10-2001 um 19:43]
habs auf 64mb erhöht, aber irgentwie erkennt er nur 32mb.
dann muß ich wahrscheinlich auf videos in meiner datenbank verzichten.
übrigens: nachdem ich das memorylimit auf 32 erhöht hatte, ging phpmyadmin wieder. als ich dann aber eine größere datei (10mb) übertragen wollte war alles wieder beim alten.
tenim
hm... lässt du immer nur ein script laufen oder laufen zwei oder mehr gleichzeitig?
ich starte das script(liegt auf dem mysql-server) von einem
win98-client im lan. es läuft immer nur eine instanz.
und jetzt geht phpmyadmin auch wieder(ohne das ich etwas verändert habe,einfach so?!?)
tenim
habe das problem mit dem memory-fehler gelösst. wenn man php
ohne die option "memory_limit" kompiliert kommt der fehler nicht(php 4.0.6), ansonsten muß man den bugfix von zend.com einspielen.
tenim
Gut zu wissen.
Danke, dass du uns an deiner Lösung teilhaben lässt - macht ja auch nicht jeder (leider) :)
|