Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL insert buffer

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] MySQL insert buffer

    Hallo zusammen,
    ich habe ein Skript, dass unter anderem Dateien in eine MySQL-Datenbank hochlädt. Auf dem bisherigem Server lief es wunderbar. Jetzt mussten wir jedoch auf einen anderen umziehen und es läuft nicht mehr richtig. Die Datensatzeinträge sind nur ein paar kilobyte groß und somit zu nix gebrauchen

    Ich glaube daher, dass es an den Datenbankeinstellungen liegt! Die Dateien sind teilweise bis zu 60MB groß, der insert buffer ist jedoch nur 8mb groß. Könnte dies die Ursache sein? Wie kann ich diesen (am besten über phpmyadmin) ändern? Woran könnte es noch liegen?

    Bin für jeden Tipp dankbar!
    Viele Grüße und schonmal Danke für die Hilfe
    Määx


  • #2
    Hallo,

    also erstmal stellt sich die Frage, warum man Dateien in Datenbanken ablegen muss:
    http://phpforum.de/php/php-faq/stati...s.html#db-blob

    Was steht denn genau in der Datenbank, was wird eingetragen? Ob der Buffer zu klein ist, kann ich dir nicht beantworten, aber es sollte doch mit etwas Debugging möglich sein, der Ursache näherzukommen. Was hast du dahingehend denn schon unternommen?
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Hey,
      ich lese Dateien in eine DB, da ich auf die Dateien nur für kurze Zeit Zugriff habe und diese nach einiger Zeit autoarchiviert & vercchlüsselt werden. Ein Zugriff muss jedoch über mein System noch weitere 24h möglich sein. Die Dateien einfach an eine andere Stelle zu kopieren darf ich leider nicht, sondern muss diese in der Datenbank hinterlegen - dies ist leider Vorgabe und ich kann daran nichts ändern
      In die Tabelle schreibe ich lediglich eine ID, den Dateinamen, die Dateigröße, den letzten Änderungszeitpunkt und die Datei als longblob.
      Das ganze geschiet im Prinzip einfach über ein fopen gefolgt von einem insert-Befehl! In der apache-log werden jedoch keine Fehler ausgegeben.
      Deshalb habe ich sonst keine Idee - und wie gesagt: auf dem alten Server funktionierte es einwandfrei...

      Määx

      Kommentar


      • #4
        diese Vorgabe ist mit Verlaub blödsinnig - zumal du die Datei ja doch nach 24 stunden aus der Datenbank löschen sollst ... da würd ich sie doch eher für 24 stunden in einem Temp-Ordner ablegen ...

        ansonsten liegt es wohl an dem dämlichen Buffer, wenn du es auf diese Weise machst , dein INSERT ist ja dann 60MB groß .. und passt unmöglich in die 8 MB Puffer ...

        such mal nach ner Möglichkeit ein BloB direkt zu füllen,
        "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

        Kommentar


        • #5
          Wenn es unbedingt sein muss und nicht anders geht:

          Erkennen wie groß ein insert max sein darf anhand der werte die mysql ausspuckt, etwas davon abziehen, die datei in (dateigröße / (max-query-größe - "etwas")) teilen, den ersten teil als INSERT in ein blob-feld machen und dann in mehreren teilen mittels UPDATE und CONCAT die weiteren teile anhängen:

          http://dev.mysql.com/doc/refman/5.0/...unction_concat
          robo47.net - Blog, Codeschnipsel und mehr
          | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

          Kommentar


          • #6
            Dann sollte also eine 2, 3, 4 MB große Datei kein Problem sein?! Teste so mal aus, ob es am Buffer liegt. Weiterhin: Was steht denn nun im Longblob, du sagtest nur einige KB? Kannst du den Inhalt in der Datei wiederfinden? Nimm einfach mal eine präparierte Datei.
            "Mein Name ist Lohse, ich kaufe hier ein."

            Kommentar


            • #7
              ja, dass diese Vorgabe quatsch ist, ist mir klar - aber sie existiert nunmal...

              Danke für die Hilfe - ich probiere es dann einmal mit dem concat bzw ob man einen blob direkt füllen kann!

              Viele Grüße
              Määx

              Kommentar


              • #8
                Abhängig von den mysql-Einstellungen bedeutet es halt auch, dass man die datei beim SELECT in teilen abholen muss z.b. mit http://dev.mysql.com/doc/refman/5.0/...unction_substr

                So oder so, bei einem projekt mit solchen spezialaforderungen, wo sicherheit und ähnliches eine solche hohe rolle spielt ist es eigentlich eh ein nogo das auf normalem webspace laufen zu lassen, da gehört ein Server her, dann muss man sich auch nicht mit so umständlichen Arbeitswegen befassen.

                Hast du denn mal überlegt wie es ausschaut mit den backups die üblicherweise jeder hoster macht ? dadurch liegen im endeffekt die daten und damit die dateien aus der db und das über tage, wochen, monate oder wie lange der hoster backups speichert, auch noch herum.
                robo47.net - Blog, Codeschnipsel und mehr
                | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                Kommentar


                • #9
                  Hey robo47,
                  danke für den Denkanstoß! Aber kann dich beruhigen - das ganze läuft auf einem eigenen Server - wir mussten nur Hausintern auf einen anderen umziehen...

                  Aber danke für den Tipp mit dem SELECT - das hätte ich sonst sicherlich vergessen! Außerdem erhöht das natürlich gleich noch den Arbeitsaufwand
                  Kann man die Buffergröße nicht irgendwie höher stellen?

                  Danke
                  Määx

                  Kommentar


                  • #10
                    max_allowed_packet dürfte die erste Anlaufstelle sein.

                    Für weitere Details/ggf. weitere zu setzende Optionen - wende dich an deinen Server-Admin.

                    Kommentar


                    • #11
                      Wenn deine inserts und selects nicht durch mysql-einstellungs-parameter für irgendwelche puffer limitiert sind, weil du nen eigenen server hast, dann ist das ganze hier sehr wahrscheinlich total unnötig, weil du einfach auf dem server die einstellungen von mysql ändern kannst und fertig.

                      Wenn die abbrüche aber zu nur wenigen kb großen einträgen führen klingt das eher nach falschen datentypen (text anstatt blob, etc) für felder.
                      Vielleicht kannst du ja mal etwas mehr input bringen.

                      Ansonsten beschäftige dich mal mit der Konfiguration des Servers, den verschiedenen Variablen und Buffer-Werten, etc:

                      http://dev.mysql.com/doc/refman/5.1/...variables.html
                      robo47.net - Blog, Codeschnipsel und mehr
                      | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                      Kommentar


                      • #12
                        Hey zusammen,
                        ich habe jetz ein wenig an der Konfiguration rumgespielt und es klappt jetzt! Werde dann jetzt nacheinander die Variablen auf den Ausgangszustand bis ich nur noch das nötigste geändert habe...

                        Vielen Dank für eure Hilfe
                        Määx

                        Kommentar

                        Lädt...
                        X