da ich in letzter Zeit häufiger Fehlermeldungen wegen Platzmangel auf der Festplatte bekomme, habe ich mich mal auf die Suche begeben und festgestellt, dass “C:\Program Files\PostgreSQL\9.3\data\base\pgsql_tmp” bis zu 15GB groß wird.
Gibt es eine Möglichkeit, den temp-Ordner zu verschieben bzw. seine Größe einzuschränken?
Ich benutze die Datenbank zum Vergleichen von Anfragen. D.h. ich habe eine gewisse Menge Daten darin gespeichert und stelle dann diverse Anfragen (z.T. zwei Anfragen gleichzeitig über verschiedene Connections). Zwischendurch wird die Datenbank immer mal wieder neu aufgesetzt. Auch wenn bei einer der Anfragen sehr viel temporär gespeichert werden sollte, müsste der entsprechende Speicher ja nach der Anfrage wieder freigegeben werden? Ich bekomme allerdings häufiger die Fehlermeldung: “An I/O error occurred while sending to the backend.” die vermutlich damit zusammenhängt?
15GB ist schon mal 'ne Hausnummer. Wie groß ist denn die DB? Ist das eine Datei oder viele? Hast Du mal log_temp_files gesetzt, um die Abfragen zu finden, die das verursachen? Schmieren da Prozesse ab? Hast Du vielleicht aus Versehen irgendwo CrossJoins verbrochen, die das verursachen?
Also das Base-Ordner ist 408MB groß, pg_database_size gibt mir 184MB. Insgesamt sollten etwa 2.5 Mio Tupel in der Datenbank liegen.
Die Anfragen sind z.T. sehr ineffizient (>10Kreuzprodukte) (das ganze ist ein kleines Programm, um Anfragen auf ihre Richtigkeit zu testen), allerdings sollte das ja nur zu einem kurzfristigen Overflow führen.
Bisher waren es immer sehr viele Logfiles. Allerdings habe jetzt noch einige Änderungen in der .config vorgenommen, die jetzt dazu geführt haben, dass es nur noch ca. 2.5GB (3 Files) sind.
D.h. bis auf den Fehler: “An I/O error occurred while sending to the backend.”, der nicht im log (trotz stufe debug5) auftaucht, scheinen die Änderungen das Problem behoben zu haben.
Was mich allerdings noch etwas wundert, ist das im Log ca. alle 15 Sekunden eine neue Verbindung auftaucht. Ist das normal?
Die Verbindung wird von Deiner Anwendung aufgebaut, nicht von Postgres. Wenn Dir das zu viel erscheint, dann musst Du prüfen wie Deine Anwendung sich zur Datenbank verbindet. Wenn der Verbindungsaufbau ein Problem ist (weil z.B. zu langsam), dann könnte ein Connection pool helfen. Entweder in der Anwendung oder transparent “vor” der Datenbank mit z.B. pgPool.
Wenn Die Verbindungen aufgebaut aber nie beendet werden (“Connection Leak”) dann könnte das auch möglicherweise dazu führen, dass der von den Transaktionen verwendete Temp Space nicht aufgeräumt wird (ganz sicher bin ich mir aber nicht). Lässt Du nur den Verbindungs_aufbau_ in’s Logfile schreiben, oder auch das Beenden der Verbindung?
Das könnte auf Netzwerkprobleme hindeuten. Steht die Fehlermeldung im Postgres Logfile oder im Logfile Deiner Anwendung?
Wenn Du unter Windows so häufig Verbindungen aufmachst und wieder schliesst, könnte das ein Problem sein. Typischerweise wartet Windows eine Weile bis der Port über den die Verbindung lief wiederverwendet werden kann, wenn Du sehr viele Verbindungen auf- und wieder zumachst, kann es - vor allem mit einer “Desktop” Version von Windows - schnell dazu kommen, dass keine Ports mehr frei sind, weil Windows sie noch nicht “recyclen” kann. Das ist aber nur eine Vermutung, ohne konkrete Angaben was die Anwendung genau wie macht und wie das System aufgesetzt ist, ist das wirklich nur ein “Schuss in’s Dunkle”. Wenn das aber der Grund ist, könne ein connection pooler helfen.
Nein, es die Verbindungen tauchen schon auf, bevor ich mein Programm starte.
Ich lasse auch die Beendigungen loggen. Es wurden jetzt 385 Verbindungen authorisiert und 378 beendet, was eig. nicht sein sollte. Dabei ist 6 mal die Fehlermeldung
CEST LOG: konnte Daten vom Client nicht empfangen: unrecognized winsock error 10061
aufgetaucht (zu der ich leider nichts aktuelles gefunden habe).
Bei den Ports dürften eig. keine Probleme entstehen. Die Nummern laufen hier munter fortlaufend im fünfstelligen Bereich weiter.
Also ich habe nebenher noch pgAdmin III laufen, bin dort allerdings nicht mit der DB verbunden.
Hat noch jmd. eine Idee, was es mit dem winsock error 10061 auf sich hat?
Google habe ich natürlich auch schon bemüht, allerdings finde ich dort keine Ergebnisse, die meiner aktuellen PostgreSQL-Version (9.3) entsprechen und nicht auf Spanisch, Französisch oder Russisch sind…
Ich glaub auch nicht, daß da was im Umfeld mit PG zu finden ist. Wenn die Winsocke da ein Loch hat ist eher Schadsoftware wie Tischbrandschutzmauern dran Schuld.