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 ด้วยซ้ำไป (เพื่อประสิทธิภาพของระบบ)
วิธีการแก้ปัญหา
หากไม่สามารถปรับปรุงโค้ดให้มีการเชื่อมต่อ 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 จำนวนการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์โดยแต่ละบัญชี