Verbindung zur MySQL-DB schlägt regelmäßig fehl [gelöst]

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Verbindung zur MySQL-DB schlägt regelmäßig fehl [gelöst]

Beitrag von klaus » 03.01.2006 16:12:38

Moin,

ich habe folgendes Problem.
Ich arbeite mit MySQL und R (Statistik-Programm) und
stelle aus R heraus Anfragen an die Datenbank.
Innerhalb von meinem R-Programm habe ich ein Makro/Unterprogramm
in C geschrieben, welches auch Anfragen an die Datenbank stellt.
(In C weil es sonst Tage dauert mnit der Auswertung)
Auf jeden Fall starte ich R, lade das Programm mit source("programmname.R")
und rufe dann Funktionen aus dem Programm auf. Alles funktioniert.
Wenn ich allerdings die Funktion noch einmal aufrufe, z.B. mit anderen
Parametern schlägt nach ein paar SQL-Anfragen der Aufruf,

Code: Alles auswählen

 if(mysql_real_connect(conn, "???.???.???.???", "xxx", "xxx", 
			"weizenversuche", 0, 0, 0)==0) {
    fprintf(stderr, "SQL connect failed.\n");
    return 0;
}
fehl.

WARUM?

Dabei ist es egal ob ich die gleichen oder verschiedene Parameter in der Anfrage nehme,
wenn ich R neu starte geht "immer" alles gut?!


Bitte um Hilfe, da ich die Funktion automatisch mit verschiedenen Parametern aufrufen moechte.

DANKE
Matthias
Zuletzt geändert von klaus am 22.02.2006 14:59:11, insgesamt 1-mal geändert.

Benutzeravatar
Silke
Beiträge: 559
Registriert: 17.05.2005 15:58:20
Wohnort: Hannover
Kontaktdaten:

Beitrag von Silke » 03.01.2006 17:16:26

Moin,

nützlich wäre die Fehlermeldung, die der MySQL-Server liefert.
Ohne diese Meldung mein Tipp: R öffnet bei jedem Aufruf eine neue
DB-Verbindung und schließt sie nicht wieder. Irgendwann ist
max_connections erreicht und es werden keine neuen Verbindungen
angenommen. Beim Neustart von R werden die noch offenen
Verbindungen gekappt und der Spaß geht von vorne los.

Wie gesagt, Schuss ins Blaue.

Gruß,
- Silke -
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.
- Kurt Tucholsky -

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 03.01.2006 18:13:14

Moin Silke,

SQL connect failed.

Also genau die Stelle, die oben angegeben ist,

Code: Alles auswählen

  if(conn!=0) {
    fprintf(stderr, "recycling SQL connection\n");
  } else
    conn = mysql_init(0);
  if(mysql_real_connect(conn, "???.??.??.??", "?????", "?????", 
			"weizenversuche", 0, 0, 0)==0) {
    fprintf(stderr, "SQL connect failed.\n");
    return 0;
    
  } else 
    fprintf(stderr, "SQL connect okay.\n");
Also
SQL connection failed

Dabei wird die SQL-Connection auch nicht komplett neu gebaut
(recycling SQL connection)
oder!?! ( der Code ist teilweise fremd übernommen
von daher weiss ich das nicht genau.)
Es passiert aber "immer" an der gleichen Stelle,
so dass ich auch etwas wie zuviele Verbindungen oder
zuviel verbrauchter Speicher vermute!?!?

Danke weiterhin
Matthias

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 03.01.2006 19:30:14

Gibt die Funktion mysql_real_connect keine Rueckgabewerte, was da nun eventuell faul war?

Benutzeravatar
feltel
Webmaster
Beiträge: 10458
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 03.01.2006 19:33:39

Das MySQL-Log in /var/log/mysql/ dürfte auch Infos geben was denn schief gelaufen ist. Eventuell ist beim MySQL-Server auch die Anzahl gleichzeitiger Connections (Einstellung max_connections im Abschnitt [mysqld] in der /etc/mysql/my.cnf) zu niedrig gesetzt.

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 04.01.2006 08:07:52

Moin,

leider gibt es in my.cmf keine Option max_connections,
darf ich die einfach in eine Zeile schreiben und
wenn ja was ist ein guter Wert.

Leider ist die Datei mysql.err leer,
in my.cnf steht der Speicherplatz für
mysql.log aber nicht für mysql.err wird dies also nicht gespeichert,
wenn nein wie kann man das ändern.

Immer noch vielen Dank
Matthias

Benutzeravatar
feltel
Webmaster
Beiträge: 10458
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 04.01.2006 08:23:01

klaus hat geschrieben:Moin,

leider gibt es in my.cmf keine Option max_connections,
darf ich die einfach in eine Zeile schreiben und
wenn ja was ist ein guter Wert.
Ja, Du kannst das einfach reinschreiben. Der Wert gehört in den Abschnitt [mysqld]. Die Datei hat das selbe Format wie früher die WIndows INI-Dateien. Der Standard liegt wenn ich mich recht entsinne bei 200, d.h. 200 gleichzeitige Connections werden bedient.
Leider ist die Datei mysql.err leer,
in my.cnf steht der Speicherplatz für
mysql.log aber nicht für mysql.err wird dies also nicht gespeichert,
wenn nein wie kann man das ändern.
Ich hab mal bei meiner MySQL-Installation geschaut, dort gibts auch keinen Eintrag für ne .err-Logdatei. Die Datei scheint also von nem Upgrade o.ä. zu stammen.

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 21.02.2006 16:28:03

Moin,

nachdem ich das Programm innerhalb einer Schleife
öfter aufrufe passiert wieder der gleiche Fehler:

Code: Alles auswählen

recycling SQL connection
SQL connect failed. Can't create TCP/IP socket (24)
Speicherzugriffsfehler
bei

Code: Alles auswählen

 if(conn!=0) {
    fprintf(stderr, "recycling SQL connection\n");
  } else {
    conn = mysql_init(0);
    fprintf(stderr, "building SQL connection\n");    
  }

  
  if(mysql_real_connect(conn, "xx.xxx.xx.xxx", "xxx", "xxxx",
			"weizenversuche", 0, 0, 0)==0) {
    fprintf(stderr, "SQL connect failed. %s\n",mysql_error(conn));
    return 0;
  } else {
    fprintf(stderr, "SQL connect okay.\n");
  }
Ich vermute das es etwas mit

Code: Alles auswählen

reconnect flag
oder
mysql_free_result(result)
oder 
//mysql_close(conn);
zu tun hat. Das mysql_close(conn) ist wirklich auskommentiert,
allerdings kommt dort folgender Fehler noch früher:

Code: Alles auswählen

recycling SQL connection
SQL connect okay.
Speicherzugriffsfehler

Ich denke, dass ich eine Verbindung oder result schließen muß
und ohne die Anzahl der Verbindungen erhöhen.

Bittet um Hilfe
Matthias

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 22.02.2006 07:45:25

Moin noch einmal,

bei mir sind die

(mysql_real_connect(conn, "x.x.x.xx", "xxx", "xxx", "xxx", 0, 0, 0)

Ports bzw. Unix-Sockets = 0, siehe http://www.norbert-pfeiffer.de/mysql/manual.de_531.html,
kann das vielleicht eine Lösung sein. Welchen Socket müsste
man wählen?

Danke
Matthias

Benutzeravatar
dominator
Beiträge: 790
Registriert: 26.08.2003 10:05:37
Wohnort: Neuerdings meistens im Bierparadies Oberfranken

Beitrag von dominator » 22.02.2006 09:17:44

Aktiviere mal das Logging in my.cnf und no-paste die zu deinem Skript gehörigen Logfile-Einträge :idea:
gruss + viel erfolg

Michael
--
Aus aktuellem Anlass :
"Der Glubb is a Depp" - Fränkische Weisheit

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 22.02.2006 11:04:26

Entschuldige bitte,

aber was heißt no-paste??

Danke
Matthias

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 22.02.2006 11:22:39

Um unsere Datenbank zu schonen, sind hier längere Code/Log-Schnippsel nicht erwünscht. Auf [1] können die geparkt und dann im Post verlinkt werden.

[1] http://nopaste.debianforum.de/

Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

[Problem gelöst]

Beitrag von klaus » 22.02.2006 15:03:17

Moin zum wahrscheinlich letztenmal zu dieser Anfrage,

Code: Alles auswählen

 conn = mysql_init(0);

    /*
  if(conn!=0) {
#ifdef Debug
    fprintf(stderr, "recycling SQL connection\n");
#endif
  } else {
    conn = mysql_init(0);
    fprintf(stderr, "building SQL connection\n");    
    
    if((mysql_options(conn,MYSQL_OPT_CONNECT_TIMEOUT,&opt_timer))==0){
      // richtig!
      fprintf(stderr, "MYSQL_OPT richtig!\n");    
    }else{
      // falsch!
      fprintf(stderr, "MYSQL_OPT falsch!\n");    
    }

  }
    */

....

mysql_close(conn);
Nun funktioniert es. Man hätte die Verbindung offensichtlich nicht
"recyclen" sollen.

Tausend Dank für die vielen Hilfen.
Matthias

Antworten