VPS'de çalışan MySQL'de çok fazla bağlantı ve ölümcül hata nasıl çözülür


9

Ben linode sunucumda aynı anda her biri bir MySQL bağlantısı açan 12 PHP komut dosyası çalıştıran bir uygulama PHPlist çalıştırıyorum. Şimdi PHPlist eriştiğinizde sık sık bu hatayı gösterir:

Önemli Hata: Üzgünüz, sunucu şu anda çok meşgul, lütfen daha sonra tekrar deneyin.

Ben phpMyAdmin erişmeye çalıştığımda, bana bir # 1040 hatası gösteriyor. cronİşler boyunca çalışan PHP komut dosyalarının çıktısı şunları gösterir:

PHP Uyarı: mysqli_connect (): (HY000 / 1040): Çok fazla bağlantı

Ben phpMyAdmin ile sunucu üzerinde LAMP yığını kullanıyorum; topTerminal gösterir çıkış mysqld100-130% işlemci kullanarak. Bu sorunu gidermeye çalışırken bazı ipuçları aldım:

  • Max_connection değişkenini artır: 200 kullanıyorum (varsayılan olarak 100)
  • Açık tablo önbelleği: 512 (varsayılan olarak 400)

Ayarlanacak çok sayıda değişken var, ancak belirli olanları belirleyemiyorum, bazı referanslar alıyorum: çok fazla bağlantı ve http://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Ama benim kullandığım göre hafızayı nasıl arttırırım ve benim için zor olan maksimum hafıza nedir?

Sunucumda yaklaşık 12 PHP komut dosyası, e-posta göndermek için PHPlist uygulaması ve kullanıcı kayıtları için büyük bir veritabanı kullanıyorum.

Lütfen bu sorunu çözmeme yardımcı olun.

Yanıtlar:


12

Yapmanız gereken ilk şey şu sorguyu çalıştırmaktır:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Bu, SUPER ayrıcalığına sahip tüm kullanıcıları listeler . Uygulama ile ilişkili DB işlemesi yapan çoğu kullanıcı bu ayrıcalığı gerektirmez. Göre MySQL Dokümantasyon , SÜPER ayrıcalığa sahip olanlar aşağıdakileri yapabilirsiniz:

  • Çoğaltma koordinatlarını denetlemek için CHANGE MASTER TO komutunu çalıştırın
  • KILL veya mysqladmin killdiğer hesaplara ait evreleri öldürmek
  • İkili günlükleri sistematik olarak silmek için İKİLİ GÜNLÜKLERİNİ BOŞALTIN
  • Genel sistem değişkenlerini değiştirmek için SET GLOBAL kullanarak yapılandırma değişiklikleri yapın
  • mysqladmin hata ayıklama komutu
  • günlüğe kaydetmeyi etkinleştirme veya devre dışı bırakma
  • * read_only * sistem değişkeni etkinleştirilmiş olsa bile güncelleme yapma
  • bağımlı sunucularda çoğaltmayı başlatma ve durdurma
  • saklanan programların ve görünümlerin DEFINER özniteliğindeki herhangi bir hesabın belirtilmesi
  • BURADA SORUNUNUZ İÇİN EN ÖNEMLİ OLARAK :: max_connections sistem değişkeni tarafından kontrol edilen bağlantı sınırına ulaşılsa bile (bir kez) bağlanmanızı sağlar .

Root @ localhost olarak giriş yapmanız ve SUPER ayrıcalığını aşağıdaki gibi iptal etmeniz gerekir:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Bunu yaptıktan sonra, tüm kullanıcılar mysql bağlantılarını ne zaman taşarsa, sadece root@localhostgiriş yapabilirsiniz. Sonuçta, eğer herkes ve büyükannesi SUPER ayrıcalığına sahip olsaydı, bu root@localhostherkesin önünde bağlantı kurmayı engelleyecektir. Max_connections 200'de ise ve mysqld'i yeniden başlatmak zorunda kalmadan 300'e yükseltmeniz gerekiyorsa, max_connections'ı bu komutla dinamik olarak artırabilirsiniz :

mysql> SET GLOBAL max_connections = 300;

Bu, anında daha fazla bağlantıya izin verecektir, ancak sadece kapristeki sayıyı keyfi olarak artırmayın. MySQL'in artışı karşılamak için yeterli RAM'e sahip olduğundan emin olmalısınız.

CAVEAT: max_connections değerini dinamik olarak 300 olarak değiştirirseniz, lütfen /etc/my.cnf içine koyun

[mysqld]
max_connections=300

MySQL DB Sunucunuzda mysqltuner.pl dosyasını çalıştırabilirsiniz. Elinizde yoksa aşağıdakileri çalıştırın:

cd
wget mysqltuner.pl
perl mysqltuner.pl

Performans Metrikleri altındaki 3. satırda

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

İş parçacığı başına 5.4M bakın? Bu, max_connections ile çarpılır. Bu örnekte, bu maksimum yaklaşık 10.8G RAM olacaktır. Bu nedenle, max_connections'ı her başlattığınızda, mysqltuner.pl dosyasını çalıştırmalı ve işletim sistemine çok fazla bellek için bastığınızı kontrol etmelisiniz.

Her durumda, SUPER ayrıcalıklarına sahip olanları sınırlamak, bu kullanıcılara DB Connections ile sel mysqld'ini azaltma fırsatı verir.


perl mysqltuner.pl denerken bu hatayı alıyorum "debian bakım hesabından giriş kimlik bilgilerini kullanmaya çalıştı, ancak başarısız oldu."
Shashank

Bunu yerel ubuntu sunucumda deniyorum, maksimum bellek kullanımını gösteriyor, ancak vps'imde hata gösteriyor ve phpmyadmin'e giriş yapamıyorum ama mysql terminalinde başarılı bir şekilde giriş yapıyorum
Shashank

Bu cmd wget mysqltuner.pl, index.html indirildi, ancak bir perl dosyasıydı, bu yüzden mysqltuner.pl olarak yeniden adlandırdım ve sonraki cmd perl mysqltuner.plçalıştı.
MotsManish

2
  1. Global değişken max_connectionsMySQL ile maksimum eşzamanlı bağlantı sayısını belirler. Bu değişken için yüksek bir değere sahip olduğunuzdan emin olun. Bu değeri 300 veya 400'e yükseltebilir ve bu ayarlardan sonra MySQL'i yeniden başlatmayı deneyebilirsiniz.
  2. Uygulamanızı bir MySQL bağlantısı çok kısa bir süre açık kalacak şekilde tasarlayın.
  3. Ayrıca, istemci kodunun kalıcı bağlantıları (mysql_pconnect () gibi) yanlış şekilde kullanmadığını da kontrol etmelisiniz.

Flush status;Bu değeri azaltmak için MySQl sunucusunda da komut yürütün .

Umarım bu öneriler yardımcı olur.


0

Diskinizin dolu olup olmadığını kontrol edin, bu aynı hataya neden olabilir:

df -h

her bölümde kalan alanı gösterecekse, muhtemelen kök bölümü kontrol etmeniz gerekir /(veya bunun için fazladan bir bölümünüz varsa / var /):

df -h /
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.