เคล็ดลับที่เป็นประโยชน์ในการแก้ไขข้อผิดพลาดทั่วไปใน MySQL
MySQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบโอเพ่นซอร์สที่ใช้กันอย่างแพร่หลาย (RDMS) ซึ่งเป็นเจ้าของโดย Oracle หลายปีที่ผ่านมา โปรแกรมนี้เป็นตัวเลือกเริ่มต้นสำหรับแอปพลิเคชันบนเว็บ และยังคงได้รับความนิยมเมื่อเปรียบเทียบกับกลไกฐานข้อมูลอื่นๆ
อ่านเพิ่มเติม: วิธีติดตั้ง MySQL ล่าสุดบน RHEL/CentOS และ Fedora
MySQL ได้รับการออกแบบและปรับให้เหมาะสมสำหรับแอปพลิเคชันเว็บ โดยเป็นส่วนสำคัญของแอปพลิเคชันบนเว็บที่สำคัญ เช่น Facebook, Twitter, วิกิพีเดีย, YouTube และอื่นๆ อีกมากมาย
ไซต์หรือเว็บแอปพลิเคชันของคุณขับเคลื่อนโดย MySQL หรือไม่ ในบทความโดยละเอียดนี้ เราจะอธิบายวิธีแก้ปัญหาและข้อผิดพลาดทั่วไปในเซิร์ฟเวอร์ฐานข้อมูล MySQL เราจะอธิบายวิธีการระบุสาเหตุของปัญหาและวิธีแก้ไข
1. ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ภายในเครื่องได้
หนึ่งในข้อผิดพลาดการเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั่วไปใน MySQL คือ “ข้อผิดพลาด 2002 (HY000): ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ภายในผ่านซ็อกเก็ต '/var/run/mysqld/mysqld.sock' (2) ”.
ข้อผิดพลาดนี้บ่งชี้ว่าไม่มีเซิร์ฟเวอร์ MySQL (mysqld)
ทำงานบนระบบโฮสต์ หรือคุณได้ระบุชื่อไฟล์ซ็อกเก็ต Unix ผิดหรือ TCP/IP< พอร์ตเมื่อพยายามเชื่อมต่อกับเซิร์ฟเวอร์
ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์กำลังทำงานอยู่โดยตรวจสอบกระบวนการชื่อ mysqld
บนโฮสต์เซิร์ฟเวอร์ฐานข้อมูลของคุณโดยใช้คำสั่ง ps และคำสั่ง grep ร่วมกันดังที่แสดง
ps xa | grep mysqld | grep -v mysqld
หากคำสั่งข้างต้นไม่แสดงผลลัพธ์ แสดงว่าเซิร์ฟเวอร์ฐานข้อมูลไม่ได้ทำงานอยู่ ดังนั้นไคลเอนต์จึงไม่สามารถเชื่อมต่อได้ หากต้องการสตาร์ทเซิร์ฟเวอร์ ให้รันคำสั่ง systemctl ต่อไปนี้
sudo systemctl start mysql #Debian/Ubuntu
sudo systemctl start mysqld #RHEL/CentOS/Fedora
หากต้องการตรวจสอบสถานะบริการ MySQL ให้ใช้คำสั่งต่อไปนี้
sudo systemctl status mysql #Debian/Ubuntu
sudo systemctl status mysqld #RHEL/CentOS/Fedora
จากผลลัพธ์ของคำสั่งข้างต้น บริการ MySQL ล้มเหลว ในกรณีเช่นนี้ คุณสามารถลองรีสตาร์ทและตรวจสอบสถานะอีกครั้งได้
sudo systemctl restart mysql
sudo systemctl status mysql
นอกจากนี้ หากเซิร์ฟเวอร์ทำงานตามที่แสดงโดยคำสั่งต่อไปนี้ แต่คุณยังคงเห็นข้อผิดพลาดข้างต้น คุณควรตรวจสอบด้วยว่าพอร์ต TCP/IP ถูกบล็อกโดยไฟร์วอลล์หรือบริการบล็อกพอร์ตใดๆ .
ps xa | grep mysqld | grep -v mysqld
หากต้องการค้นหาพอร์ตที่เซิร์ฟเวอร์กำลังฟังอยู่ ให้ใช้คำสั่ง netstat ตามที่แสดง
sudo netstat -tlpn | grep "mysql"
2. ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ได้
ข้อผิดพลาดในการเชื่อมต่อที่พบบ่อยอีกประการหนึ่งคือ “(2003) ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL บน 'เซิร์ฟเวอร์' (10061) ” ซึ่งหมายความว่าการเชื่อมต่อเครือข่ายถูกปฏิเสธ
ที่นี่ ให้เริ่มต้นด้วยการตรวจสอบว่ามีเซิร์ฟเวอร์ MySQL ทำงานอยู่บนระบบดังที่แสดงด้านบน ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์เปิดใช้งานการเชื่อมต่อเครือข่ายและพอร์ตเครือข่ายที่คุณใช้เชื่อมต่อนั้นเป็นพอร์ตที่กำหนดค่าไว้บนเซิร์ฟเวอร์
ข้อผิดพลาดทั่วไปอื่นๆ ที่คุณน่าจะพบเมื่อพยายามเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ได้แก่:
ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
ข้อผิดพลาดเหล่านี้บ่งชี้ว่าเซิร์ฟเวอร์อาจทำงานอยู่ อย่างไรก็ตาม คุณกำลังพยายามเชื่อมต่อโดยใช้พอร์ต TCP/IP, ไปป์ที่มีชื่อ หรือไฟล์ซ็อกเก็ต Unix ที่แตกต่างจากที่เซิร์ฟเวอร์กำลังฟังอยู่
3. ข้อผิดพลาดที่ถูกปฏิเสธการเข้าถึงใน MySQL
ใน MySQL บัญชีผู้ใช้จะถูกกำหนดในแง่ของ ชื่อผู้ใช้ และโฮสต์ของไคลเอ็นต์หรือโฮสต์ที่ผู้ใช้สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ นอกจากนี้ บัญชีอาจมีข้อมูลรับรองการตรวจสอบ เช่น รหัสผ่าน
แม้ว่าจะมีสาเหตุหลายประการของข้อผิดพลาด “การเข้าถึงถูกปฏิเสธ ” แต่สาเหตุทั่วไปประการหนึ่งเกี่ยวข้องกับบัญชี MySQL ที่เซิร์ฟเวอร์อนุญาตให้โปรแกรมไคลเอนต์ใช้เมื่อเชื่อมต่อ บ่งชี้ว่า ชื่อผู้ใช้ ที่ระบุในการเชื่อมต่อไม่มีสิทธิ์ในการเข้าถึงฐานข้อมูล
MySQL อนุญาตให้สร้างบัญชีที่ช่วยให้ผู้ใช้ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์และเข้าถึงข้อมูลที่จัดการโดยเซิร์ฟเวอร์ ในเรื่องนี้ หากคุณพบข้อผิดพลาดที่ถูกปฏิเสธการเข้าถึง ให้ตรวจสอบว่าบัญชีผู้ใช้ได้รับอนุญาตให้เชื่อมต่อกับเซิร์ฟเวอร์ผ่านโปรแกรมไคลเอนต์ที่คุณใช้อยู่ และอาจเป็นไปได้ว่าโฮสต์ที่มาจากการเชื่อมต่อ .
คุณสามารถดูสิทธิพิเศษที่บัญชีกำหนดได้โดยการรันคำสั่ง SHOW GRANTS
ดังที่แสดง
> SHOW GRANTS FOR 'tecmint'@'localhost';
คุณสามารถให้สิทธิ์แก่ผู้ใช้เฉพาะบนฐานข้อมูลเฉพาะไปยังที่อยู่ IP ระยะไกลได้โดยใช้คำสั่งต่อไปนี้ในเชลล์ MySQL
> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
> flush privileges;
นอกจากนี้ ข้อผิดพลาดที่ถูกปฏิเสธการเข้าถึง อาจเป็นผลมาจากปัญหาในการเชื่อมต่อกับ MySQL โปรดดูข้อผิดพลาดที่อธิบายไว้ก่อนหน้านี้
4. สูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์ MySQL
คุณอาจพบข้อผิดพลาดนี้เนื่องมาจากสาเหตุใดสาเหตุหนึ่งต่อไปนี้: การเชื่อมต่อเครือข่ายไม่ดี, หมดเวลาการเชื่อมต่อ หรือ ปัญหากับค่า BLOB ที่มากกว่า max_allowed_packet ในกรณีที่เกิดปัญหาการเชื่อมต่อเครือข่าย ตรวจสอบให้แน่ใจว่าคุณมีการเชื่อมต่อเครือข่ายที่ดี โดยเฉพาะอย่างยิ่งหากคุณกำลังเข้าถึงเซิร์ฟเวอร์ฐานข้อมูลระยะไกล
หากเป็นปัญหา การหมดเวลาการเชื่อมต่อ โดยเฉพาะอย่างยิ่งเมื่อ MySQL พยายามใช้การเชื่อมต่อเริ่มต้นกับเซิร์ฟเวอร์ ให้เพิ่มค่าของพารามิเตอร์ connect_timeout . แต่ในกรณีของ ค่า BLOB ที่มากกว่า max_allowed_packet คุณจะต้องตั้งค่าที่สูงกว่าสำหรับ max_allowed_packet ใน /etc ของคุณ /my.cnf ไฟล์การกำหนดค่าภายใต้ส่วน [mysqld]
หรือ [client]
ตามที่แสดง
[mysqld]
connect_timeout=100
max_allowed_packet=500M
หากไม่สามารถเข้าถึงไฟล์การกำหนดค่า MySQL ของคุณได้ คุณสามารถตั้งค่านี้ได้โดยใช้คำสั่งต่อไปนี้ในเชลล์ MySQL
> SET GLOBAL connect_timeout=100;
> SET GLOBAL max_allowed_packet=524288000;
5. การเชื่อมต่อ MySQL มากเกินไป
ในกรณีที่ไคลเอ็นต์ MySQL พบข้อผิดพลาด “การเชื่อมต่อมากเกินไป ” หมายความว่าไคลเอ็นต์อื่นใช้การเชื่อมต่อที่มีอยู่ทั้งหมด จำนวนการเชื่อมต่อ (ค่าเริ่มต้นคือ 151) ถูกควบคุมโดยตัวแปรระบบ max_connections
คุณสามารถแก้ไขปัญหาได้โดยการเพิ่มค่าเพื่ออนุญาตการเชื่อมต่อในไฟล์การกำหนดค่า /etc/my.cnf ของคุณ
[mysqld]
max_connections=1000
6. หน่วยความจำ MySQL ไม่เพียงพอ
ในกรณีที่คุณเรียกใช้การสืบค้นโดยใช้โปรแกรมไคลเอนต์ MySQL และพบข้อผิดพลาดที่เป็นปัญหา นั่นหมายความว่า MySQL มีหน่วยความจำไม่เพียงพอที่จะจัดเก็บผลลัพธ์การสืบค้นทั้งหมด
ขั้นตอนแรกคือต้องแน่ใจว่าแบบสอบถามถูกต้อง หากถูกต้อง ให้ดำเนินการดังต่อไปนี้:
- หากคุณใช้ไคลเอ็นต์ MySQL โดยตรง ให้เริ่มต้นด้วย
--quick switch
เพื่อปิดใช้งานผลลัพธ์ที่แคชไว้หรือ - หากคุณใช้ไดรเวอร์ MyODBC ส่วนติดต่อผู้ใช้การกำหนดค่า (UI) จะมีแท็บขั้นสูงสำหรับแฟล็ก ทำเครื่องหมาย “อย่าแคชผลลัพธ์“
เครื่องมือที่ยอดเยี่ยมอีกอย่างหนึ่งคือ MySQL Tuner ซึ่งเป็นสคริปต์ที่มีประโยชน์ที่จะเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ที่ทำงานอยู่ และให้คำแนะนำเกี่ยวกับวิธีการกำหนดค่าให้มีประสิทธิภาพสูงขึ้น
sudo apt-get install mysqltuner #Debian/Ubuntu
sudo yum install mysqltuner #RHEL/CentOS/Fedora
mysqltuner
หากต้องการเพิ่มประสิทธิภาพ MySQL และเคล็ดลับการปรับแต่งประสิทธิภาพ โปรดอ่านบทความของเรา: 15 เคล็ดลับการปรับแต่งประสิทธิภาพและการเพิ่มประสิทธิภาพ MySQL/MariaDB ที่เป็นประโยชน์
7. MySQL หยุดทำงานอย่างต่อเนื่อง
หากคุณพบปัญหานี้ คุณควรลองค้นหาว่าปัญหาอยู่ที่เซิร์ฟเวอร์ MySQL เสียหรือว่าเป็นไคลเอ็นต์ที่มีปัญหาหรือไม่ โปรดทราบว่าเซิร์ฟเวอร์ล่มจำนวนมากมีสาเหตุมาจากไฟล์ข้อมูลหรือไฟล์ดัชนีที่เสียหาย
คุณสามารถตรวจสอบสถานะเซิร์ฟเวอร์เพื่อดูว่าเซิร์ฟเวอร์เปิดใช้งานมานานแค่ไหนแล้ว
sudo systemctl status mysql #Debian/Ubuntu
sudo systemctl status mysqld #RHEL/CentOS/Fedora
หรือรันคำสั่ง mysqladmin ต่อไปนี้เพื่อค้นหาสถานะการออนไลน์ของเซิร์ฟเวอร์ MySQL
sudo mysqladmin version -p
โซลูชันอื่นๆ รวมถึงแต่ไม่จำกัดเพียงการหยุดเซิร์ฟเวอร์ MySQL และการเปิดใช้งานการแก้ไขข้อบกพร่อง จากนั้นเริ่มบริการอีกครั้ง คุณสามารถลองทำกรณีทดสอบที่สามารถใช้เพื่อทำซ้ำปัญหาได้ นอกจากนี้ ให้เปิดหน้าต่างเทอร์มินัลเพิ่มเติมแล้วเรียกใช้คำสั่งต่อไปนี้เพื่อแสดงสถิติกระบวนการ MySQL ในขณะที่คุณเรียกใช้คำสั่งอื่น:
sudo mysqladmin -i 5 status
OR
sudo mysqladmin -i 5 -r status
ประเด็นสำคัญ: การพิจารณาว่าอะไรเป็นสาเหตุของปัญหาหรือข้อผิดพลาด
แม้ว่าเราได้ดูปัญหาและข้อผิดพลาดทั่วไปของ MySQL แล้ว และได้ให้วิธีการแก้ไขแล้ว แต่สิ่งที่สำคัญที่สุดในการวินิจฉัยข้อผิดพลาดคือการทำความเข้าใจว่ามันหมายถึงอะไร (ในแง่ของสาเหตุที่ทำให้เกิดข้อผิดพลาด) .
แล้วคุณจะระบุสิ่งนี้ได้อย่างไร? ประเด็นต่อไปนี้จะแนะนำคุณเกี่ยวกับวิธีตรวจสอบสาเหตุที่ทำให้เกิดปัญหา:
- ขั้นตอนแรกและสำคัญที่สุดคือการตรวจสอบบันทึก MySQL ซึ่งจัดเก็บไว้ในไดเร็กทอรี
/var/log/mysql/
คุณสามารถใช้ยูทิลิตีบรรทัดคำสั่ง เช่น tail เพื่ออ่านไฟล์บันทึก - หากบริการ MySQL ไม่สามารถเริ่มต้นได้ ให้ตรวจสอบสถานะโดยใช้ systemctl หรือใช้คำสั่ง journetctl (พร้อมแฟล็ก
-xe
) ใต้ systemd เพื่อตรวจสอบปัญหา - คุณยังสามารถตรวจสอบไฟล์บันทึกของระบบ เช่น
/var/log/messages
หรือที่คล้ายกันเพื่อดูสาเหตุของปัญหา - ลองใช้เครื่องมือเช่น Mytop,เหลือบมอง,top,ps หรือ htop เพื่อตรวจสอบว่าโปรแกรมใดใช้ CPU ทั้งหมดหรือกำลังล็อคเครื่องอยู่ หรือเพื่อตรวจสอบว่าคุณมีหน่วยความจำไม่เพียงพอ พื้นที่ดิสก์ ตัวอธิบายไฟล์ หรือทรัพยากรที่สำคัญอื่น ๆ .
- สมมติว่าปัญหานั้นเป็นกระบวนการที่ไม่สามารถควบคุมได้ คุณสามารถลองฆ่ามันได้เสมอ (โดยใช้ยูทิลิตี้ pkill หรือ kill) เพื่อให้ MySQL ทำงานได้ตามปกติ
- สมมติว่าเซิร์ฟเวอร์ mysqld กำลังก่อให้เกิดปัญหา คุณสามารถเรียกใช้คำสั่ง:
mysqladmin -u root ping
หรือmysqladmin -u root processlist
เพื่อรับค่าใดๆ การตอบสนองจากมัน - หากปัญหาเกิดขึ้นกับโปรแกรมไคลเอนต์ของคุณในขณะที่พยายามเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ให้ตรวจสอบว่าเหตุใดจึงทำงานได้ไม่ดี ลองรับเอาต์พุตจากโปรแกรมนั้นเพื่อวัตถุประสงค์ในการแก้ไขปัญหา
คุณอาจต้องการอ่านบทความที่เกี่ยวข้องกับ MySQL ต่อไปนี้:
- เรียนรู้ MySQL/MariaDB สำหรับผู้เริ่มต้น – ตอนที่ 1
- วิธีตรวจสอบฐานข้อมูล MySQL/MariaDB โดยใช้ Netdata บน CentOS 7
- วิธีถ่ายโอนฐานข้อมูล MySQL ทั้งหมดจากเซิร์ฟเวอร์เก่าไปยังเซิร์ฟเวอร์ใหม่
- Mytop – เครื่องมือที่มีประโยชน์สำหรับการตรวจสอบประสิทธิภาพ MySQL/MariaDB ใน Linux
- 12 แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย MySQL/MariaDB สำหรับ Linux
สำหรับข้อมูลเพิ่มเติม โปรดดูคู่มืออ้างอิง MySQL เกี่ยวกับปัญหาและข้อผิดพลาดทั่วไป ซึ่งแสดงรายการปัญหาทั่วไปและข้อความแสดงข้อผิดพลาดที่คุณอาจพบขณะใช้ MySQL อย่างครอบคลุม รวมถึงปัญหาที่เราได้กล่าวถึงข้างต้นและอื่นๆ อีกมากมาย