ค้นหาเว็บไซต์

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

แล้วคุณจะระบุสิ่งนี้ได้อย่างไร? ประเด็นต่อไปนี้จะแนะนำคุณเกี่ยวกับวิธีตรวจสอบสาเหตุที่ทำให้เกิดปัญหา:

  1. ขั้นตอนแรกและสำคัญที่สุดคือการตรวจสอบบันทึก MySQL ซึ่งจัดเก็บไว้ในไดเร็กทอรี /var/log/mysql/ คุณสามารถใช้ยูทิลิตีบรรทัดคำสั่ง เช่น tail เพื่ออ่านไฟล์บันทึก
  2. หากบริการ MySQL ไม่สามารถเริ่มต้นได้ ให้ตรวจสอบสถานะโดยใช้ systemctl หรือใช้คำสั่ง journetctl (พร้อมแฟล็ก -xe) ใต้ systemd เพื่อตรวจสอบปัญหา
  3. คุณยังสามารถตรวจสอบไฟล์บันทึกของระบบ เช่น /var/log/messages หรือที่คล้ายกันเพื่อดูสาเหตุของปัญหา
  4. ลองใช้เครื่องมือเช่น Mytop,เหลือบมอง,top,ps หรือ htop เพื่อตรวจสอบว่าโปรแกรมใดใช้ CPU ทั้งหมดหรือกำลังล็อคเครื่องอยู่ หรือเพื่อตรวจสอบว่าคุณมีหน่วยความจำไม่เพียงพอ พื้นที่ดิสก์ ตัวอธิบายไฟล์ หรือทรัพยากรที่สำคัญอื่น ๆ .
  5. สมมติว่าปัญหานั้นเป็นกระบวนการที่ไม่สามารถควบคุมได้ คุณสามารถลองฆ่ามันได้เสมอ (โดยใช้ยูทิลิตี้ pkill หรือ kill) เพื่อให้ MySQL ทำงานได้ตามปกติ
  6. สมมติว่าเซิร์ฟเวอร์ mysqld กำลังก่อให้เกิดปัญหา คุณสามารถเรียกใช้คำสั่ง: mysqladmin -u root ping หรือ mysqladmin -u root processlist เพื่อรับค่าใดๆ การตอบสนองจากมัน
  7. หากปัญหาเกิดขึ้นกับโปรแกรมไคลเอนต์ของคุณในขณะที่พยายามเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ให้ตรวจสอบว่าเหตุใดจึงทำงานได้ไม่ดี ลองรับเอาต์พุตจากโปรแกรมนั้นเพื่อวัตถุประสงค์ในการแก้ไขปัญหา

คุณอาจต้องการอ่านบทความที่เกี่ยวข้องกับ MySQL ต่อไปนี้:

  1. เรียนรู้ MySQL/MariaDB สำหรับผู้เริ่มต้น – ตอนที่ 1
  2. วิธีตรวจสอบฐานข้อมูล MySQL/MariaDB โดยใช้ Netdata บน CentOS 7
  3. วิธีถ่ายโอนฐานข้อมูล MySQL ทั้งหมดจากเซิร์ฟเวอร์เก่าไปยังเซิร์ฟเวอร์ใหม่
  4. Mytop – เครื่องมือที่มีประโยชน์สำหรับการตรวจสอบประสิทธิภาพ MySQL/MariaDB ใน Linux
  5. 12 แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย MySQL/MariaDB สำหรับ Linux

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