MySQL Hatası "Çok fazla bağlantı"

6 Cevap php

Ben GoDaddy (linux) tarafından barındırılan bir site için MySQL 5.0 kullanıyorum.

Benim web uygulaması bazı test yapıyordu, ve aniden sayfaları gerçekten yavaş ferahlatıcı olduğunu fark ettim. Son olarak, uzun bir bekleyişten sonra, "MySQL Hatası, çok sayıda bağlantı ..." çizgisinde bir şey söyledi bir sayfa var ve bu veritabanına bağlanır, benim config.php dosyasına işaret etti.

Sadece ben, veritabanına başka kullanıcıları bağlamak olmuştur. Benim sayfaların her biri, ben üst config.php dosyasını içerir ve sayfanın sonunda mysql bağlantısını kapatın. Arasında çeşitli sorguları olabilir. Ben mysql bağlantıları yeterince (mysql_close ()) kapanış değilim korkuyorum.

Ben bir sorgu çalıştırdıktan sonra bunları kapatmaya çalıştığınızda, ancak, ben sayfada bağlantı hataları alırsınız. Benim sayfaları PHP ve HTML vardır. Ben bir sorgu kapatmaya çalıştığınızda, bir sonraki bağlantı olmayacak gibi görünüyor. Bağlanmak için ben yakın sonra tekrar config.php dahil etmek gerekir?

2 hafta içinde, yaklaşık 84 kişi bu web uygulamasını kullanmaya başlayabilirsiniz çünkü bu hata beni korkuttu.

Teşekkürler.

EDIT:

İşte benim sayfanın bazı pseudo-kod:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

Ben bu yolu, her zaman sayfa açılır bağlantı açar ve sonra bağlantı sayfası yüklenirken yapılır kapanır düşündüm. Birisi böylece sayfasındaki bir düğmeyi tıkladığında, ve o zaman, bağlantı tekrar açılır ...

EDIT:

Tamam, ben sadece GoDaddy ile görüştüm. Görünüşe göre, Ekonomi Paketi ile, bir seferde 50 bağlantısı sınırlı değilim. Benim sorun bugün sadece bana sitesine erişim ile meydana gelirken, onlar bazı sunucu sorunları daha önce sahip olduğunu söyledi. Ancak, benim web uygulaması için 84 kullanıcımız var gidiyorum ne gibi görerek, muhtemelen bir seferde 100 bağlantı sağlar "Deluxe", yükseltmeniz gerekiyor. Belirli bir günde, orada bir anda sitemde erişen yaklaşık 30 kullanıcıları, bu yüzden ben 100 daha güvenli bir bahis olacağını düşünebilir. Siz katılıyor musunuz?

6 Cevap

Paylaşılan-hosting sağlayıcıları genellikle aynı kullanıcı için eşzamanlı bağlantı oldukça küçük bir miktar izin.

Ne kodu does:

  • MySQL sunucuya bir bağlantı açmak
  • Bu eşyalarım yok (sayfa üreten)
  • sayfanın sonundaki bağlantıyı kapatın.

Sayfanın sonunda yapılan son adım değildir mandatory: ( 's manuel mysql_close alıntı):

Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.

Ama muhtemelen yine kalıcı bağlantılarını kullanmak gerektiğini unutmayın ...

İki ipuçları:

  • mysql_pconnect (already OK for you) ve mysql_connect INSEAD kullanımı
  • Için mysql_connect dördüncü parametresini ayarlayın false (already OK for you, as it's the default value): (manuel alıntı):

If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

The new_link parameter modifies this behavior and makes mysql_connect() always open a new link, even if mysql_connect() was called before with the same parameters.



Ne o, soruna neden olabilir?

Belki (using multiple tabs in your browser, for instance), hangi aynı anda web sitesini kullanarak birkaç kullanıcıları taklit edecek paralel olarak çeşitli sayfalara erişmek için çalışıyorsunuz?

Eğer aynı anda site ve mysql_connect arasındaki kodunu kullanan birçok kullanıcı var ve bağlantı kapanış çok zaman alırsa, o size aynı anda açılan birçok bağlantı anlamına ... Ve olacak 'sınırına ulaşmak ll :-(

Eğer izin verilen en fazla 200 eşzamanlı bağlantıları dikkate alınarak uygulamanın sadece kullanıcı olarak hala oluyor, garip bir şey var ...



Eh, "too many connections" düşünmeye ve "max_connections" ...

Eğer yanlış hatırlamıyorsam, max_connections you MySQL Server açabilirsiniz bağlantı sayısını sınırlamak değil, fakat total number of connections bu sunucu açılan bo olabilir by anyone connecting to it.

Üzerine MySQL belgelerine alıntı Too many connections:

If you get a Too many connections error when you try to connect to the mysqld server, this means that all available connections are in use by other clients.

The number of connections allowed is controlled by the max_connections system variable. Its default value is 100. If you need to support more connections, you should set a larger value for this variable.

, "Sadece" bu MySQL sunucusu (remember, "shared hosting") bağlanmaya çalışırken tek olmadığını olabilir: Yani, aslında, sorun sizin ne de sizin kod gelmeyebilir (which looks fine, actually) ve aynı anda kullanan çok sayıda insan var ki ...

Eğer, sürece çok veritabanı / kullanıcı sunucu üzerinde olduğu gibi ve bu max_connection 200 ayarlanır: ... Ve if I'm right and it's that, sorunu çözmek için yapabileceğiniz hiçbir şey yok acı devam edecek ...


As a sidenote : before going back to GoDaddy asking them about that, it would be nice if someone could validate what I just said ^^

Eğer kalıcı bağlantılarını kullanarak olmadığından emin olun. Bu genellikle kötü bir fikir ..

Eğer çok en azından .. o var ise size apache süreçleri var gibi çok bağlantılarını desteklemek gerekir. Eğer max_connections ayarını değiştirmek için yapabiliyor musunuz?

Ben bu ile ilgili yaklaşık 18 ay oldu (http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/)

Ben sonunda (bu sizin için de geçerli olacak) vardı çözümler vardı:

  1. göre ayarlamak veritabanını MySQLTuner.
  2. haftalık bu post dayalı tabloları birleştirmek

Yazı bash komut defragmenting:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

Eğer veritabanı sunucusu tamamen size adanmış tamamen emin misiniz?

Root olarak datbase oturum açın ve bağlı kimin görmek için "GÖSTER PROCESSLIST" kullanın. Ideally çok varsa zaman ve uyarının üzerine orada kaç bağlantıları görüntülemek için izleme sistemi içine bu kanca.

Maksimum veritabanı bağlantıları my.cnf yapılandırılmış, ancak bellek veya adres alanı azalıyor dikkat edilebilir.

Eğer shell erişiminiz varsa, onlar nereden geldiğini veritabanına açtı ve kaç yuva görmek için netstat kullanın.

Linux, türü:

netstat -n -a |grep 3306

Pencereler, türü:

netstat -n -a |findstr 3306

Çözelti, ben bile hangisinin doğru anlaşılmış değildi, bir MCQA testte bu genelinde bunlardan biri geldi ki!

My.cnf "set-variable = max_connections = 200" Bu ayarla

Komut Çalıştır "SET GLOBALmax_connections = 200"

Mysql sunucusuna bağlanmak için daima mysql_connect () işlevini kullanın

Mysql sunucusuna bağlanmak için daima mysql_pconnect () işlevini kullanın