แก้ปัญหา too many connection กับ default mysql setting
max_connect_errors
เมื่อ client ไม่สามารถ connect mysql เซอร์เวอร์ได้ เซอร์เวอร์จะทำการยกเลิก connection นั้นหลังจาก รอไประยะหนึ่ง (wait_timeout) และเมื่อเกิด connection_timeout mysql จะมี counter อยู่ตัวหนึ่งเอาไว้นับจำนวน connection ที่เข้ามาที่เครื่อง โดยนับแบบ สะสมไปเรื่อยๆ จนกระทั่ง clinet สร้าง connection มาที่ mysql จนถึงค่า max_connect_errors client จะมาสามารถ connect mysql ได้อีก โดยมีข้อความแจ้งเตตือน error ประมาณว่า too many connection จนกว่าเราจะไป Flush hosts (clear counter) นั้นทิ้ง เราไม่สามารถ disable ตัว counter นี้ได้เลย จากตัวแปร max_connect_error หากเราเซ็ทค่าเป็น 0 (ซึ่งน่าจะหมายถึง infinity ก็ไม่ได้ช่วยอะไร) วิธีแก้ปัญหา มีสองวิธี คือเซ็ทค่า max_connect_error=1844674407370954751 (ไม่แน่ใจตัวเลขนี้มาจากไหน น่าจะเป็นค่า max สุดที่เซ็ทได้รึเปล่า ) และสอง เจอ error ก็ใช้คำสั่ง FLUSH HOST
ปล. กรณี connect_error เยอะ เกิดจาก query ค้างจำนวนมาก db รับโหลดเยอะเกิน เพราะฉะนั้น อีก Solution หนึ่งที่ดี คือปรับปรุงการ query ให้ถูกที่ถูกทาง ไม่ทำให้ db มีปัญหา หรือใช้การวาง โครงสร้าง หรือเครื่องมืออื่นๆ มาช่วยแบ่งเบาภาระ mysql แต่โดยตัวของ mysql เองแล้วมันทำได้แค่สองวิธีข้างต้น
connect_timeout
ตัวแปรกตัวนี้ เกี่ยวพันกับตัวปัญหาข้างบน อย่างแยกกันไม่ออก เพราะจากที่กล่าวมาข้างต้น เมื่อ connection_timeout –> wait_timeout –> บวกค่า counter ของ connection_error โดยเฉพาะเมื่อเกิดความคับคั่ง บนระบบ network (network congestion ) เป็นไปได้ที่แต่ละ connection จะใช้เวลาหลายวินาที ในการสร้าง connection ให้สำเร็จ แต่ค่า connect_timeout โดย default แล้วคือ 5 seconds เราควรเพิ่มให้มันอยู่ที่ 15-20 secs โดยอาจต้องพิจารณาร่วมกับ thread_cache_size
skip-name-resolve
ถ้าจำนวน connection ที่เข้ามาที่เครื่อง mysql เยอะมากๆ นั่นคือ mysql ต้องทำ dns lookup ทุกๆ connection ซึ่งตอนนี้เราใช้วิธีการแก้ไขไฟล์ hosts ที่เครื่อง mysql server เพื่อลดจำนวน lookup ที่จะเข้าไปยัง dns server นั่นแปลว่า เวลามี backend ใหม่ๆ เข้ามาเราต้องแก้ไข และ update /etc/hosts ตลอดเวลา เพื่อ lookup name ดังนั้น ถ้าเป็นไปได้ เพิ่ม config skip-name-resolve ใน my.cnf เลยก็ได้ เพราะยังไง ตอน grants สิทธิ์ ส่วนใหญ่เราก็ grant เป็น ip-range อยู่แล้ว ไม่ได้ grant โดยใช้ชื่อ host
สำหรับการทำ master / slave ค่าที่ควรสนใจคือ
slave_net_timeout ให้เซ็ทไว้ที่ 30 วินาที โดย default อยู่ที่ 1 ชม. : (
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MySQL - วิธีการสร้าง User ใหม่ และการกำหนดสิทธิ์บน console
หลังจากติดตั้ง MySQL เรียบร้อยแล้ว ถ้าใช้ระบบปฎิบัติการ Windows ให้เปิด console ขึ้นมาโดยการกดที่เมนู Windows แล้ว search คำว่า cmd หลังเปิด console ขึ้นมาแล้วให้ไปที่โฟล์เดอร์ bin ในโฟล์เดอร์ที่ติดตั้ง MySQL แล้วรันคำสั่ง mysql
กรณีที่เจอ error ดังนี้ ให้ตรวจสอบให้แน่ว่าเราได้เปิด MySQL service เรียบร้อยดีแล้วหรือไม่
กรณีที่เจอ error ดังนี้ ให้ตรวจสอบให้แน่ว่าเราได้เปิด MySQL service เรียบร้อยดีแล้วหรือไม่
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
รันคำสั่ง services.msc เพื่อเรียกหน้าต่างนี้ขึ้นมา |
เมื่อ MySQL service อยู่ในสถานะ Started เรียบร้อยแล้ว ลองรันคำสั่ง mysql อีกครั้ง จะขึ้น command prompt ดังนี้
mysql>
จากนั้นให้รันคำสั่งต่อไปนี้ตามลำดับ
mysql> CREATE USER 'myuser'@'localhost' IDENTIFIED BY'mypassword';
ในคำสั่ง CREATE USER ข้างต้น ส่วนที่เขียนว่า 'myuser'@'localhost' ระบุว่าจะสร้างชื่อผู้ใช้ myuser สำหรับการเข้าใช้จาก localhost ถ้าต้องการให้เข้าใช้จาก IP Address ใดก็ได้ให้เปลี่ยนเป็น 'myuser'@'%' หรือระบุ IP ก็ได้ เช่น 'myuser'@'192.168.1.10' เป็นต้น ส่วน IDENTIFIED BY ใช้กำหนดรหัสผ่าน ในตัวอย่างนี้รหัสผ่านคือ mypassword
mysql> GRANT ALL PRIVILEGES ON *.*TO 'myuser'@'localhost' WITH GRANT OPTION;
คำสั่ง GRANT ALL PRIVILEGES จะให้สิทธิ์ทุกอย่างกับ myuser ที่เข้าใช้จาก localhost คีย์เวิร์ด *.* หมายถึง สามารถจัดการได้ทุกฐานข้อมูลและทุกตาราง ถ้าเปลี่ยนเป็น test.* จะหมายความว่า สามารถจัดการได้ทุกตารางในฐานข้อมูล test เท่านั้น
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
หลังจากทำการติดตั้ง mysql+phpmyadmin ด้วยคำสั่ง apt-get
root@durian: apt-get install mysql-server phpmyadmin
การติดตั้งก็สำเร็จไม่มี error ใดๆ แต่เมื่อเรียกใช้ mysql
1. หยุดการทำงานของ mysql
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
วิธีแก้ ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ครับ...ไม่มีสิ่งใดในโลกใบที่สมบูรณ์แบบ ทุกอย่างย่อมมีข้อบกพร่อง ข้อผิดพลาดกันได้ เช่นเดียวกับ mysql บน Ubuntu 8.04 ครับหลังจากทำการติดตั้ง mysql+phpmyadmin ด้วยคำสั่ง apt-get
root@durian: apt-get install mysql-server phpmyadmin
การติดตั้งก็สำเร็จไม่มี error ใดๆ แต่เมื่อเรียกใช้ mysql
seksan@durian:~$ mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)ข้อ ผิดพลาดที่เกิดขึ้นเป็น bug ของ mysql ที่ไม่จำ password นั่งปวดหัวหาวิธีแก้ ทดลองเอา mysql ออกแล้วติดตั้งให่ก็ไม่หาย ก็ลองสืบค้นแหล่งความรู้จากโลกอินเตอร์เน็ต ก็ไปพบยาแก้ปวด http://www.debian-administration.org/articles/442 ก็ขออนุญาติแปล เรียบเรียง และทดลอง ให้นะครับ
1. หยุดการทำงานของ mysql
root@durian:# /etc/init.d/mysql stop * Stopping MySQL database server mysqld ...done.2. ใส่ให้ mysql ทำงานในโหมด mysql-safe
root@durian:/home/seksan# /usr/bin/mysqld_safe --skip-grant-tables &[1] 6219 root@durian:/home/seksan# nohup: ignoring input and redirecting stderr to stdout Starting mysqld daemon with databases from /var/lib/mysql mysqld_safe[6258]: started3.เรียก ใช้งานโดยไม่จำเป็นต้องมี password (--skip-grant-tables)
root@durian:/home/seksan# mysql --user=root mysqlReading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 111 Server version: 5.0.51a-3ubuntu5.4 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>จาก นั้นกำหนด password ใหม่
mysql> update user set Password=PASSWORD('รหัสผ่าน') WHERE User='root';Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> flush privileges;Query OK, 0 rows affected (0.00 sec) mysql> exitBye4.สั่ง การทำงาน mysql
root@durian:/home/seksan# /etc/init.d/mysql start* Starting MySQL database server mysqld ...done.5. เรียกใช้งาน
root@durian:/home/seksan# mysql -u root -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 401 Server version: 5.0.51a-3ubuntu5.4 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>สรุป... วิธีนี้สำเร็จครับ และที่พลาดไม่ได้ Many thanks
ไม่มีความคิดเห็น:
แสดงความคิดเห็น