Mysql too many connections

DjTom-i

Member
hi leute,

seit heute morgen ärgert mich meine mysql...

DBI connect('confixx:localhost;mysql_socket=/var/lib/mysql/mysql.sock','confixx',...) failed: Too many connections at script/confixx_updatescript.pl line 61

mein problem ist das ich weder eine my.cnf noch my.conf finde...

locate bringt jeweils nichts...

dank im voraus.

gruß

tom-i
 
...

hmm wie finde ich raus welches fehlerhafte script die connection zur mysql db nicht richtig schließt? hat da einer einen tip?

außerdem würde mich mal interessieren wo ich meine my.cnf finde.

verdammt bin ich blind...
 
DjTom-i said:
hmm wie finde ich raus welches fehlerhafte script die connection zur mysql db nicht richtig schließt? hat da einer einen tip?
Muss nicht zwangsläufig daran liegen, vielleicht ist die Belastung des Servers einfach gestiegen und er braucht mehr Verbindungen.
-> Maximal erlaubte Verbindungen in der my.cnf erhöhen.
Die aktuellen Verbindungen kannst du dir mit dem SQL-Befehl 'SHOW PROCESSLIST' anzeigen lassen (oder einfach in phpMyAdmin als root auf 'Prozesse anzeigen' gehen).

außerdem würde mich mal interessieren wo ich meine my.cnf finde.
Bei mir ists in /etc/mysql/my.cnf. Ansonsten: find / -name my.cnf
 
...

die my.cnf finde ich nicht, das ist mein problem...

wenn ich locate *.cnf eingebe finde ich nur unter /usr/share/mysql

diverse cnf zb my-hudge.cnf

show prozesslist gibt folgendes:

Datenbanken Status Variablen Zeichensätze Formate Rechte Prozesse Exportieren



Prozesse


ID Benutzer Host Datenbank Befehl Dauer Status SQL-Befehl
Beenden 59 DELAYED usr_web23_2 Delayed insert 132 Waiting for INSERT ---
Beenden 75 web23 localhost usr_web23_1 Sleep 185 --- ---
Beenden 1376 web23 localhost usr_web23_1 Sleep 251 --- ---
Beenden 1457 web23 localhost usr_web23_1 Sleep 301 --- ---
Beenden 1517 web30 localhost usr_web30_1 Sleep 1658 --- ---
Beenden 1614 web23 localhost usr_web23_1 Sleep 341 --- ---
Beenden 1643 web30 localhost usr_web30_1 Sleep 1457 --- ---
Beenden 1685 web30 localhost usr_web30_1 Sleep 1431 --- ---
Beenden 1701 web23 localhost usr_web23_1 Sleep 291 --- ---
Beenden 1808 web23 localhost usr_web23_1 Sleep 233 --- ---
Beenden 1834 web23 localhost usr_web23_1 Sleep 414 --- ---
Beenden 1993 web23 localhost usr_web23_1 Sleep 29 --- ---
Beenden 2049 web23 localhost usr_web23_1 Sleep 331 --- ---
Beenden 2082 web23 localhost usr_web23_1 Sleep 166 --- ---
Beenden 2085 web23 localhost usr_web23_1 Sleep 170 --- ---
Beenden 2111 web23 localhost usr_web23_1 Sleep 48 --- ---
Beenden 2142 web23 localhost usr_web23_1 Sleep 341 --- ---
Beenden 2160 web23 localhost usr_web23_1 Sleep 83 --- ---
Beenden 2161 web23 localhost usr_web23_1 Sleep 63 --- ---
Beenden 2193 web23 localhost usr_web23_1 Sleep 219 --- ---
Beenden 2201 web23 localhost usr_web23_1 Sleep 349 --- ---
Beenden 2215 web14 localhost usr_web14_1 Sleep 632 --- ---
Beenden 2270 web23 localhost usr_web23_1 Sleep 131 --- ---
Beenden 2279 web23 localhost usr_web23_1 Sleep 220 --- ---
Beenden 2289 web30 localhost usr_web30_1 Sleep 498 --- ---
Beenden 2291 web30 localhost usr_web30_1 Sleep 498 --- ---
Beenden 2299 web23 localhost usr_web23_1 Sleep 409 --- ---
Beenden 2319 web23 localhost usr_web23_1 Sleep 370 --- ---
Beenden 2329 web23 localhost usr_web23_1 Sleep 234 --- ---
Beenden 2369 web23 localhost usr_web23_1 Sleep 363 --- ---
Beenden 2399 web23 localhost usr_web23_1 Sleep 103 --- ---
Beenden 2457 DELAYED usr_web3_1 Delayed insert 278 Waiting for INSERT ---
Beenden 2465 DELAYED usr_web23_6 Delayed insert 248 Waiting for INSERT ---
Beenden 2499 web23 localhost usr_web23_1 Sleep 222 --- ---
Beenden 2507 web23 localhost usr_web23_1 Sleep 219 --- ---
Beenden 2535 web23 localhost usr_web23_1 Sleep 12 --- ---
Beenden 2549 web23 localhost usr_web23_1 Sleep 127 --- ---
Beenden 2582 root localhost mysql Query 0 --- SHOW PROCESSLIST
 
keine my.cnf

Kann mir einer sagen wie ich gerade rausfinde welche my.cnf gerade in Verwendung ist...

Ich habe nur eine auf dem ganzen Server aber die liegt in einem backup ordner ganz tief vergraben...

Meine mysql läuft allerdings... bis auf die Aussetzer heute morgen.

Komisch! Isch dreh dorsch ;-)





Ps: An die lieben Mods: Bitte ins Mysql Forum verschieben... Danke!
 
I.d.R. /etc/my.cnf

Sollte die nicht vorhanden sein, mußt Du in /etc/init.d/mysql nachsehen, wo er eine Config läd.

Aber eine Manipulation an MySQL läßt den fehlerhaften Scripten nur noch mehr Raum, Deinen Server zu blockieren.
Du hast hier entweder ein Fehler im diversen Scripten oder eine Deathlock-Situation in der Datenbank. Denn alle Abfragen die länger als 3 Sekunden hängen sind blockiert.

PS: Beachte bitte Punkt 3 der Boardregeln.

huschi.
 
MySQL

zu Punkt 3 der Boardregeln: Sorry!

Ich habe mir leider seit Jahren im Inet Kleinschreibung angewöhnt. Wie du an meinem letzten Post gesehen hast, habe ich es auch "mal wieder" bemerkt.

Nun wieder zurück zum Thema:

Also ich hatte in /home/backup/my.cnf die einzige my.cnf auf dem System.

Hier meine Init.D MySQL

Code:
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.

basedir=

# The following variables are only set for letting mysql.server find things.

# Set some defaults
datadir=/var/lib/mysql
pid_file=
if test -z "$basedir"
then
  basedir=/
  bindir=/usr/bin
else
  bindir="$basedir/bin"
fi

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin
export PATH

mode=$1    # start or stop

case `echo "testing\c"`,`echo -n testing` in
    *c*,-n*) echo_n=   echo_c=     ;;
    *c*,*)   echo_n=-n echo_c=     ;;
    *)       echo_n=   echo_c='\c' ;;
esac

parse_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --pid-file=*) pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}

# Get arguments from the my.cnf file,
# groups [mysqld] [mysql_server] and [mysql.server]
if test -x ./bin/my_print_defaults
then
  print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
  print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
  print_defaults="$bindir/mysql_print_defaults"
else
  # Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[ 	]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi

  # Hope it's in the PATH ... but I doubt it
  test -z "$print_defaults" && print_defaults="my_print_defaults"
fi

#
# Test if someone changed datadir;  In this case we should also read the
# default arguments from this directory
#

extra_args=""
if test "$datadir" != "/var/lib/mysql"
then
  extra_args="-e $datadir/my.cnf"
fi

parse_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`

#
# Set pid file if not given
#
if test -z "$pid_file"
then
  pid_file=$datadir/`/bin/hostname`.pid
else
  case "$pid_file" in
    /* ) ;;
    * )  pid_file="$datadir/$pid_file" ;;
  esac
fi

# Safeguard (relative paths, core dumps..)
cd $basedir

case "$mode" in
  'start')
    # Start daemon

    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script may
      # be overwritten at next upgrade.
      $bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file >/dev/null 2>&1 &
      # Make lock for RedHat / SuSE
      if test -w /var/lock/subsys
      then
        touch /var/lock/subsys/mysql
      fi
    else
      echo "Can't execute $bindir/mysqld_safe from dir $basedir"
    fi
    ;;

  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.
    if test -s "$pid_file"
    then
      mysqld_pid=`cat $pid_file`
      echo "Killing mysqld with pid $mysqld_pid"
      kill $mysqld_pid
      # mysqld should remove the pid_file when it exits, so wait for it.

      sleep 1
      while [ -s $pid_file -a "$flags" != aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ]
      do
	[ -z "$flags" ] && echo $echo_n "Wait for mysqld to exit$echo_c" || echo $echo_n ".$echo_c"
        flags=a$flags
        sleep 1
      done
      if [ -s $pid_file ]
         then echo " gave up waiting!"
      elif [ -n "$flags" ]
         then echo " done"
      fi
      # delete lock for RedHat / SuSE
      if test -f /var/lock/subsys/mysql
      then
        rm -f /var/lock/subsys/mysql
      fi
    else
      echo "No mysqld pid file found. Looked for $pid_file."
    fi
    ;;

***Verstehe ich daraus richtig, dass er erst in /etc/ nachschaut ob eine my.cnf vorhanden ist und dann wenn er keine findet im basedir, also in diesem Falle in / nach einer my.cnf durchsucht und diese dann verwendet?

Das Problem mit den Prozessen habe ich wahrscheinlich auch im Griff, denn ein Kunde hat ein Script welches erst nach 15 Sekunden die Connection zur DB trennte... da er aber oft um die 200 User und mehr Online hat ist meine DB abgekackt...

Also folgendes muß ich noch wissen:

1. Ist die Aussage die mit *** beginnt richtig?
2. Gibt es einen Befehl oder Trick mit dem ich sehe welche my.cnf gerade verwendet wird?
3. Kennt Ihr ein schönes MySQL Konfigurationstutorial?
 
DjTom-i said:
1. Ist die Aussage die mit *** beginnt richtig?
Du brauchst lediglich eine /etc/my.cnf anlegen und die Werte, die Du verändern willst dort eintragen.

2. Gibt es einen Befehl oder Trick mit dem ich sehe welche my.cnf gerade verwendet wird?
evtl. steht es in der Commandozeile, die auch im 'ps ax|grep mysql' angezeigt wird. Ansonsten würde ich sagen, er nutzt keine der vorhandenen Configfiles, da er ja keine passende findet.

3. Kennt Ihr ein schönes MySQL Konfigurationstutorial?
http://dev.mysql.com/doc/mysql/de/configuring-mysql.html

huschi.
 
Huschi said:
Aber eine Manipulation an MySQL läßt den fehlerhaften Scripten nur noch mehr Raum, Deinen Server zu blockieren.
Hm, würde ich nicht allgemein so sagen. Kann ja durchaus sein, dass Scripts hat, die recht lange laufen. Wenn dann die Zugriffszahlen stark steigen, kann es da zu einem Engpass kommen, obwohl die Scripte korrekt laufen. In dem Fall wäre das Erhöhen der maximalen Verbindungen sicherlich nicht falsch.
Natürlich kanns auch an fehlerhaften Scripten liegen, aber wie gesagt, allgemein würd ich das nicht so behaupten.
 
hoffie said:
Hm, würde ich nicht allgemein so sagen.
Das war auch nicht allgemein gesagt. ;)
Es bezog sich auf die langen Connections aus der o.a. Processlist von bis zu 1658 Sekunden. Das sind fast 28 Minuten. Sorry, aber hier ist definitiv etwas daneben.

huschi.
 
Hi

Habe mir heute mal die Prozess List angeschaut und dort sind prozesse die über 16000 sec haben.

Der Entwickler und ich haben ja schon eine Quelle des Übels beseitigt.
Das war so ein böser Block.

Wonach soll ich genau ausschau halten?

Will die Sache nämlich optimal lösen und auch die Scripte optimieren.

Wenn Ihr irgendwelche Logfiles braucht...

Dank im Voraus.

Gruß

Tom-i
 
DjTom-i said:
Habe mir heute mal die Prozess List angeschaut und dort sind prozesse die über 16000 sec haben.
Ein 'kill [ID];' hilft erstmal schnell.
Logfiles kann man momentan noch nicht gebrauchen. Aber ein gutes Script sollte in irgendein Logfile reinschreiben, wenn ein DB-Zugriff nicht ordnungsgemäß läuft. Zur Not auf STDERR, was unter Apache dann im error_log zu finden ist.
Wichtig: Erst nach dem Kill erfährt das Script, daß etwas nicht funktioniert.

Ansonsten kann man z.B. mit einem einfachen Cron-Script nachsehen lassen, ob wieder eine Connection zu lange hängt und evtl. automatisch gekillt wird.

huschi.
 
Huschi said:
Das war auch nicht allgemein gesagt. ;)
Es bezog sich auf die langen Connections aus der o.a. Processlist von bis zu 1658 Sekunden. Das sind fast 28 Minuten. Sorry, aber hier ist definitiv etwas daneben.
Vielleicht ein Programm, was ständig die MySQL-Verbindung aufrecht erhält? Bspw. mein jabberd2 nutzt MySQL und ist ständig mit dem Server verbunden...
Aber gut, den Datenbankusernamen siehts eher nach einem Web-User aus und damit dürftest du dann Recht haben... :)
 
Back
Top