วันเสาร์ที่ 7 พฤศจิกายน พ.ศ. 2558

MySQL




แก้ปัญหา 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 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 เท่านั้น

/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////

วิธีแก้ 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]: started
3.เรียก ใช้งานโดยไม่จำเป็นต้องมี 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> exitBye
 4.สั่ง การทำงาน 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
แสดงความคิดเห็น