วิธีแก้ไขการเชื่อมต่อมากเกินไปและข้อผิดพลาดร้ายแรงใน mysql ที่รันบน vps


9

ฉันกำลังเรียกใช้แอปพลิเคชั่น PHPlist บนเซิร์ฟเวอร์ linode ของฉันพร้อมใช้งานสคริปต์ PHP 12 สคริปต์ซึ่งแต่ละอันจะเปิดการเชื่อมต่อ MySQL ตอนนี้เมื่อฉันเข้าถึง PHPlist มันมักจะแสดงข้อผิดพลาดนี้:

ข้อผิดพลาดร้ายแรง: ขออภัยเซิร์ฟเวอร์ไม่ว่างในขณะนี้โปรดลองอีกครั้งในภายหลัง

เมื่อฉันพยายามเข้าถึง phpMyAdmin จะแสดงข้อผิดพลาด # 1040 ผลลัพธ์ของสคริปต์ PHP ของฉันที่ทำงานผ่านcronงานแสดง:

คำเตือน PHP: mysqli_connect (): (HY000 / 1040): การเชื่อมต่อมากเกินไป

ฉันใช้ LAMP stack บนเซิร์ฟเวอร์ด้วย phpMyAdmin topการส่งออกในรายการสถานีmysqldโดยใช้ CPU 100-130% เมื่อฉันพยายามแก้ไขปัญหานี้ฉันได้รับเบาะแสบางอย่าง:

  • เพิ่มตัวแปร max_connection: ฉันใช้ 200 (100 เป็นค่าเริ่มต้น)
  • แคชตารางเปิด: 512 (400 ตามค่าเริ่มต้น)

มีตัวแปรมากมายที่ต้องตั้งค่า แต่ฉันไม่สามารถระบุได้ว่าอะไรคือสิ่งที่เฉพาะเจาะจงฉันได้รับการอ้างอิงจาก: การเชื่อมต่อมากเกินไป และhttp://dev.mysql.com/doc/refman/5.5/en/table-cache HTML

แต่ตามการใช้งานของฉันจะเพิ่มหน่วยความจำได้อย่างไรและอะไรคือความจำสูงสุดที่ยากสำหรับฉัน

บนเซิร์ฟเวอร์ของฉันฉันใช้สคริปต์ PHP ประมาณ 12 ตัวโปรแกรม PHPlist สำหรับส่งอีเมลและฐานข้อมูลสำคัญสำหรับการลงทะเบียนผู้ใช้

โปรดช่วยฉันแก้ไขปัญหานี้

คำตอบ:


12

ก่อนอื่นคุณต้องทำคือเรียกใช้แบบสอบถามนี้:

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

นี้จะแสดงรายการผู้ใช้ทั้งหมดที่มีSUPER สิทธิ์ ผู้ใช้ส่วนใหญ่ที่ทำการประมวลผลฐานข้อมูลที่เกี่ยวข้องกับแอปพลิเคชันไม่ต้องการสิทธิ์นี้ ตามเอกสาร MySQLผู้ที่มีสิทธิ์พิเศษสามารถทำสิ่งต่อไปนี้:

  • เรียกใช้ CHANGE MASTER TO เพื่อควบคุมพิกัดการจำลองแบบ
  • ฆ่าหรือmysqladmin killฆ่าเธรดที่เป็นของบัญชีอื่น
  • ทำความสะอาดบันทึกไบนารีเพื่อลบบันทึกไบนารีอย่างเป็นระบบ
  • ทำการเปลี่ยนแปลงการกำหนดค่าโดยใช้ SET GLOBAL เพื่อปรับเปลี่ยนตัวแปรระบบทั่วโลก
  • คำสั่ง debug mysqladmin
  • เปิดใช้งานหรือปิดใช้งานการบันทึก
  • ดำเนินการอัปเดตแม้ว่าจะเปิดใช้งานตัวแปรระบบ* read_only *
  • การเริ่มและหยุดการเรพลิเคทบนเซิร์ฟเวอร์ทาส
  • ข้อมูลจำเพาะของบัญชีใด ๆ ในแอตทริบิวต์ DEFINER ของโปรแกรมและมุมมองที่เก็บไว้
  • นี่คือสิ่งสำคัญที่สุดสำหรับปัญหาของคุณ : ช่วยให้คุณสามารถเชื่อมต่อ (หนึ่งครั้ง) แม้ว่าจะถึงขีด จำกัด การเชื่อมต่อที่ควบคุมโดยตัวแปรระบบmax_connections

คุณจะต้องเข้าสู่ระบบในฐานะ root @ localhost และเพิกถอนสิทธิ์พิเศษดังนี้:

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

เมื่อคุณทำเช่นนี้เมื่อใดก็ตามที่ผู้ใช้ทุกคนเชื่อมต่อกับ mysql จะroot@localhostสามารถเข้าสู่ระบบได้เท่านั้น root@localhostท้ายที่สุดถ้าทุกคนและยายของเขามีสิทธิพิเศษเป็นอย่างยิ่งสิ่งนี้จะขัดขวางไม่ให้คนอื่น ๆ หาก max_connections อยู่ที่ 200 และคุณต้องเพิ่มเป็น 300 โดยไม่ต้องรีสตาร์ท mysqld คุณสามารถเพิ่มmax_connectionsแบบไดนามิกได้ด้วยคำสั่งนี้:

mysql> SET GLOBAL max_connections = 300;

ที่จะช่วยให้การเชื่อมต่อมีประสิทธิภาพมากขึ้นในทันที แต่อย่าเพิ่งเพิ่มจำนวนโดยไม่ตั้งใจ คุณต้องแน่ใจว่า mysql มี RAM เพียงพอที่จะรองรับการเพิ่มขึ้น

ถ้ำ: หากคุณเปลี่ยน max_connections เป็น 300 แบบไดนามิกโปรดใส่ไว้ใน /etc/my.cnf

[mysqld]
max_connections=300

คุณสามารถเรียกใช้ mysqltuner.pl บน MySQL DB Server ของคุณ หากคุณยังไม่มีให้เรียกใช้สิ่งต่อไปนี้:

cd
wget mysqltuner.pl
perl mysqltuner.pl

บรรทัดที่ 3 ภายใต้ตัวชี้วัดประสิทธิภาพมีสิ่งนี้

-------- 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)

ดู 5.4M ต่อเธรด นั่นคือคูณด้วย max_connections ในตัวอย่างนี้นั่นจะเป็น RAM สูงสุดประมาณ 10.8G ดังนั้นทุกครั้งที่คุณชน max_connections คุณควรรัน mysqltuner.pl และตรวจสอบว่าคุณกด OS สำหรับหน่วยความจำมากเกินไปหรือไม่

ไม่ว่าในกรณีใดการ จำกัด ผู้ที่มีสิทธิ์แบบ Super จะให้โอกาสผู้ใช้ในการบรรเทา mysqld ด้วย DB Connections


ฉันได้รับข้อผิดพลาดนี้ในขณะที่พยายาม Perl mysqltuner.pl "พยายามใช้ข้อมูลรับรองการเข้าสู่ระบบจากบัญชีการบำรุงรักษา debian แต่พวกเขาล้มเหลว"
Shashank

ฉันลองสิ่งนี้บนเซิร์ฟเวอร์ ubuntu ในประเทศของฉันมันแสดงการใช้หน่วยความจำสูงสุด แต่บน vps ของฉันมันแสดงให้เห็นถึงความล้มเหลวและฉันไม่สามารถเข้าสู่ระบบใน phpmyadmin ได้ แต่การล็อกอินสำเร็จใน mysql terminal
Shashank

cmd นี้wget mysqltuner.plดาวน์โหลด index.html แต่มันเป็นไฟล์ perl ดังนั้นฉันจึงเปลี่ยนชื่อเป็น mysqltuner.pl และ cmd ถัดไปก็ใช้perl mysqltuner.plงานได้
MotsManish

2
  1. ตัวแปรทั่วโลกmax_connectionsกำหนดจำนวนสูงสุดของการเชื่อมต่อพร้อมกันกับ MySQL ตรวจสอบให้แน่ใจว่าคุณมีค่าสูงสำหรับตัวแปรนี้ คุณสามารถเพิ่มค่านี้เป็น 300 หรือ 400 และลองรีสตาร์ท MySQL หลังจากการตั้งค่านี้
  2. ออกแบบแอปพลิเคชันของคุณเพื่อให้การเชื่อมต่อ MySQL เปิดอยู่เป็นระยะเวลาสั้น ๆ
  3. คุณควรตรวจสอบว่ารหัสลูกค้าไม่ได้ใช้การเชื่อมต่อแบบถาวร (เช่น mysql_pconnect ()) อย่างไม่เหมาะสม

ยังรันFlush status;คำสั่งบนเซิร์ฟเวอร์ MySQl เพื่อลดค่านี้

ฉันหวังว่าคำแนะนำเหล่านี้จะช่วยได้


0

ตรวจสอบว่าดิสก์ของคุณเต็มหรือไม่ซึ่งอาจทำให้เกิดข้อผิดพลาดเดียวกันได้:

df -h

จะแสดงพื้นที่ที่เหลืออยู่ในแต่ละพาร์ติชันคุณอาจต้องตรวจสอบพาร์ติชันรูท/(หรือ / var / ในกรณีที่คุณมีพาร์ติชันเพิ่มเติมสำหรับสิ่งนี้):

df -h /
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.