GORAGOD.com

Error max_user_connections เกิดจากอะไร และ วิธีการแก้ไขปัญหา

ถ้าคุณเจอ Error ประมาณนี้ เมื่อมีการรันเว็บ Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1203] User xxxx already has more than 'max_user_connections' active connections' in /home/xxxx/public_html/.... หมายความว่าคุณเจอข้อจำกัดด้านทรัพยากรของ Server เข้าให้แล้ว

max_user_connections คือการจำกัดจำนวนการเชื่อมต่อฐานข้อมูลพร้อมกัน ซึ่งสามารถทำได้โดยผู้ใช้ใดๆก็ตามแต่ละคน ซึ่งตัวแปรนี้ถือเป็นตัวแปร Global หนึ่งของ MySQL การจำกัดจำนวนการเชื่อมต่อสามารถทำได้โดยกำหนดค่ามากกว่า 0

การดูว่าค่า max_user_connections เป็นเท่าไรสามารถดูได้โดยรัน Query นี้ บน MySQL หรือ phpMyAdmin

show variables like "max_user_connections";

  • ค่าเริ่มต้นของ MySQL คือ 0 หมายถึงไม่มีการจำกัดจำนวนการเชื่อมต่อ
  • แต่สำหรับ Share Host ทั่วๆไป มักจะมีการจำกัดค่านี้ไว้ บางแห่งอาจกำหนดไว้ไม่ถึง 10 ด้วยซ้ำไป (เพื่อประสิทธิภาพของระบบ)
หากมีการเชื่อมต่อฐานข้อมูลพร้อมๆกันก็จะเกิด Error ดังข้างต้น ถ้าสังเกต Error นี้ก็อาจจะเกิดเป็นบางครั้งเท่านั้นเนื่องจากในการเรียกเว็บไซต์แต่ละครั้งอาจจะมีคนเชื่อมต่อไม่เท่ากัน ทำให้อาจเกิดหรือไม่เกิด Error นี้ก็ได้ และ Error นี้มักจะเกิดกับเว็บไซต์ที่มีการใช้ Ajax หรือมีการใช้ Plugin เยอะๆ เนื่องจากการทำงานของ Ajax แต่ละครั้ง หรือ Plugin แต่ละตัว อาจจะมีการสร้างการเชื่อมต่อฐานข้อมูลเพิ่มขึ้น จนกระทั่งถึงขีดจำกัดได้

วิธีการแก้ปัญหา
หากไม่สามารถปรับปรุงโค้ดให้มีการเชื่อมต่อ MySQL แค่เพียงครั้งเดียวได้ (อาจด้วยการเลิกใช้ Ajax หรือ Plugin นั้นๆ แล้วใช้วิธีเขียนโค้ดสำหรับการทำงานนั้นๆในโค้ดหลักแทน) ก็ต้องอาศัยการปรับเพิ่มค่า max_user_connections เพิ่มนั่นเอง

set global max_user_connections = 200;

สำหรับจำกัดการเชื่อมต่อจำนวน 200 การเชื่อมต่อ หรือไม่จำกัดเลย ด้วยคำสั่งด้านล่าง
set global max_user_connections = 0;

วิธีข้างต้นต้องทำการรันคำสั่งบน SQL Server หรือบน phpMyAdmin ด้วยสิทธิระดับผู้ดูแลระบบ ซึ่ง Share Host ทั่วๆไปจะไม่สามารถทำได้ ดังนั้นอาจต้องแจ้งให้ Host ดำเนินการให้ ซึ่ง Host หลายแห่ง อาจไม่ดำเนินการให้
ข้อเสียของวิธีตามด้านบน คือ ค่ากำหนดจะถูกใช้จนกว่าจะมีการ Restart MySQL Server ซึ่งหมายความว่า หากมีการ Restart MySQL Server ทุกครั้ง จะต้องมีการกำหนดค่านี้ใหม่ทุกครั้ง

อีกวิธี ซึ่งเป็นวิธีการถาวร สามารถทำได้โดยการแก้ไขไฟล์ my.cnf (ไฟล์ตั้งค่าฐานข้อมูล MySQL) ซึ่งแน่นอนว่าต้องทำโดยผู้ดูแลระบบเท่านั้น โดยเพิ่มหรือแก้ไขค่านี้ลงใน section [mysqld]

[mysqld]
max_user_connections = 200;

เสร็จแล้ว Restart MySQL Sever

นอกจากนี้ยังมีค่าติดตั้งอื่นๆที่คล้ายๆกัน และสามารถกำหนดค่าได้ในลักษณะเดียวกัน ได้แก่
  • MAX_QUERIES_PER_HOUR จำนวนข้อความค้นหาที่บัญชีสามารถออกได้ต่อชั่วโมง
  • MAX_UPDATES_PER_HOUR จำนวนการอัปเดตที่บัญชีจะสามารถออกได้ต่อชั่วโมง
  • MAX_CONNECTIONS_PER_HOUR จำนวนครั้งที่บัญชีสามารถเชื่อมต่อกับเซิร์ฟเวอร์ต่อชั่วโมง
  • MAX_USER_CONNECTIONS จำนวนการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์โดยแต่ละบัญชี