MySQL: RAM reicht nicht aus

  • Ich lasse bei einer Datenbankabfrage 500 Zeilen einlesen. Leider ist schon bei ca. 50-100 Zeilen der Arbeitsspeicher voll (SQL-Fehler).
    Kann ich der Datenbank irgendwie mehr RAM zuweisen?

  • Hi,


    wie genau machst Du das? Über einen ssh Tunnel oder so?
    Gibt ja verschiedene Möglichkeiten ;)


    Grüsse, David

  • Sorry, einlesen ist vielleicht unglücklich ausgedrückt.
    Besser ist: "Ein Select-Statement soll 500 Zeilen ausgeben" (eigentlich will ich die 500 Zeilen in einem PHP-Skript einlesen um eine Statistik zu erstellen).
    Also ein Statement a la: Select * from <tabelle> limit 0,500

  • Konkret bekomme ich folgende Fehlermeldung:



    Wobei gerade ausprobiert: Jetzt kann ich mir nicht mal mehr 50 Werte ausgeben lassen ;(

  • Hi,


    ja. Wenn Du über SSH tunnelst, macht es durchaus sinn /tmp mehr ram zuzuweisen ^^
    /tmp iss ja nur 32 MB.


    Also:

    Code
    mount -t tmpfs -o remount tmpfs /tmp


    Aber vorsicht dabei ;) Nicht, dass es auf einmal anfängt zu swappen.


    Grüsse, David

  • Nene, ich mach keinen SSH-Tunnel. Ich greife entweder direkt via PHP auf die Datenbank zu oder probiere es über´s phpMyAdmin aus.


    Vielleicht noch ein kleiner Nachtrag:
    Wenn ich das Skript aufrufe, dann seh ich in der Prozessliste den mysqld mit 32MB Speicherauslastung.

  • Hi,


    das hat nix mit dem RAM der QNAP zu tun, sondern mit der KOnfig der DB..


    Schau mal ob Du die Datei : my.cnf (normal z.B. unter Linux im /etc/) findest.


    Da sind auch Speichereinstellungen...


    Nach einer Änderung musst Du natürlich die mysql neu starten..


    Tomas

  • Liegt definitiv am RAM.
    Ein Statement kann nur dann komplett ausgeführt werden, wenn genug "Space" da ist. /tmp ist ein tmpfs bei dem nur 32 MB zugewiesen sind und das "leider schnell volläuft".


    Schaue mal hier:

    Zitat

    #3 - Error writing file '/tmp/MYQD3qDh' (Errcode: 28)


    Die 32 MB, die von QNAP zugewiesen sind, sind einfach zu wenig. (In diesem Fall). Normalerweise ist das auch eine Menge holz, bei dem was da zurück kommt. Ich würde schon eher sagen, dass es mit einem Dump vergleichbar ist -> dann aber auch wieder ein kleiner^^.


    Am besten erst mal nix an der mysql konfig machen.
    So etwas wie max_allowed_packet ist wieder was anders. Das wäre z.B. der Buffer von einem Beispielsweise "sehr grossen Feld / einem Blob indem eine Binary gespeichert ist". / sowas kann man in der my.cnf einstellen.


    Also ruhig das oben was ich geschrieben hatte mal ausführen und testen ;)
    Wenn es funktioniert, dann kannst Du das ganze auch in die autorun.sh schreiben, so, dass es nach einem Neustart vom NAS wieder da wäre.


    Grüsse, David

  • Aber bei dem Befehl


    Code
    mount -t tmpfs -o remount tmpfs /tmp


    wird doch nur das temp Verzeichnis geleert und es wird nicht größer. Wäre es nicht sinnvoll das gleich auf 64MB zu setzen?

  • Nee, da wird es nicht geleert, nur remounted So, dass der komplette RAM + Swap benutzt werden würde.


    Man könnte auch das doppelte also 64M mit angeben. Also:

    Code
    mount -t tmpfs -o remount,size=64M tmpfs /tmp


    Ich würde es aber erst einmal ohne ausprobieren ;)


    Grüss,e David