ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home แก้ปัญหา Error Establishing a Database Connection ใน WordPress

แก้ปัญหา Error Establishing a Database Connection ใน WordPress

ข้อความ Error establishing a database connection หมายความว่า WordPress ติดต่อฐานข้อมูล MySQL หรือ MariaDB ไม่ได้ เมื่อเกิดขึ้นทั้งหน้าเว็บและหน้า /wp-admin จะใช้งานไม่ได้ สาเหตุหลักมีไม่กี่อย่าง ได้แก่ ข้อมูลการเชื่อมต่อใน wp-config.php ไม่ถูกต้อง บริการฐานข้อมูลหยุดทำงาน ดิสก์เต็ม ตารางในฐานข้อมูลเสียหาย หรือฐานข้อมูลรับการเชื่อมต่อไม่ไหว

คู่มือนี้เรียงลำดับการตรวจจากสาเหตุที่พบบ่อยและตรวจง่ายที่สุดไปหายากที่สุด ขั้นตอนที่ 1 และ 2 ทำได้ทั้งบน Web Hosting และ Cloud Server ส่วนขั้นตอนที่ 3 และ 4 ต้องมีสิทธิ์ root บนเซิร์ฟเวอร์ของตนเอง

สิ่งที่ต้องเตรียม

  • สิทธิ์เข้าถึงไฟล์ของเว็บผ่าน SSH, File Manager ของ Plesk/DirectAdmin หรือ FTP
  • สิทธิ์จัดการฐานข้อมูลใน Control Panel หรือ root บน Cloud Server
  • สำรองไฟล์ wp-config.php ก่อนแก้ไขทุกครั้ง

ขั้นตอนที่ 1: ตรวจค่าใน wp-config.php

เปิดไฟล์ wp-config.php ในโฟลเดอร์หลักของเว็บ แล้วดูค่าสี่บรรทัดนี้

define( 'DB_NAME', 'wp_example' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'รหัสผ่าน' );
define( 'DB_HOST', 'localhost' );

นำค่าไปเทียบกับข้อมูลในหน้า Databases ของ Control Panel โดยตรวจว่า

  • ชื่อฐานข้อมูลและชื่อผู้ใช้ตรงกันทุกตัวอักษร Control Panel บางระบบเติม Prefix ให้อัตโนมัติ เช่น DirectAdmin จะตั้งชื่อเป็น username_dbname
  • รหัสผ่านไม่มีช่องว่างเกินมาหน้าหรือหลัง และถ้ารหัสผ่านมีเครื่องหมาย ' ต้อง Escape เป็น \'
  • DB_HOST ถูกต้อง ส่วนใหญ่เป็น localhost หากฐานข้อมูลอยู่อีกเครื่องให้ใส่ IP หรือชื่อโฮสต์ และพอร์ตถ้าไม่ใช่ค่าปกติ เช่น 10.0.0.5:3306

หากไม่แน่ใจเรื่องรหัสผ่าน ให้ตั้งรหัสผ่านใหม่ให้ผู้ใช้ฐานข้อมูลใน Control Panel แล้วใส่ค่าเดียวกันใน wp-config.php

ขั้นตอนที่ 2: ทดสอบเชื่อมต่อด้วยข้อมูลเดียวกัน

ถ้ามี SSH ให้ทดสอบด้วยค่าจาก wp-config.php โดยตรง

mysql -u wp_user -p -h localhost wp_example -e "SELECT 1;"

ผลลัพธ์ที่ปกติจะแสดงตารางที่มีเลข 1 หากขึ้น Error ให้ดูความหมายดังนี้

ข้อความสาเหตุ
ERROR 1045 (28000): Access denied for userชื่อผู้ใช้หรือรหัสผ่านผิด หรือผู้ใช้ไม่ได้รับอนุญาตจากโฮสต์นั้น
ERROR 1044 (42000): Access denied ... to databaseผู้ใช้ถูกต้องแต่ไม่มีสิทธิ์ในฐานข้อมูลนี้
ERROR 1049 (42000): Unknown databaseชื่อฐานข้อมูลผิด หรือฐานข้อมูลยังไม่ถูกสร้าง
ERROR 2002 (HY000): Can't connect to local server through socketบริการฐานข้อมูลไม่ทำงาน หรือ Socket อยู่คนละตำแหน่ง
ERROR 1040: Too many connectionsจำนวนการเชื่อมต่อเกินค่า max_connections

หากคำสั่งนี้เชื่อมต่อได้แต่ WordPress ยังขึ้น Error ให้ลองเปลี่ยน DB_HOST ระหว่าง localhost (เชื่อมผ่าน Socket) กับ 127.0.0.1 (เชื่อมผ่าน TCP) เพราะ PHP อาจหา Socket ไม่เจอ

ขั้นตอนที่ 3: ตรวจว่าบริการฐานข้อมูลทำงานอยู่ (Cloud Server)

ชื่อบริการขึ้นอยู่กับสิ่งที่ติดตั้ง ให้ตรวจสถานะด้วย

sudo systemctl status mariadb

หากติดตั้ง MySQL บน Ubuntu ใช้ mysql บน AlmaLinux หรือ Rocky Linux ใช้ mysqld

sudo systemctl status mysql
sudo systemctl status mysqld

ถ้าสถานะเป็น active (running) แสดงว่าทำงานปกติ ถ้าเป็น failed หรือ inactive ให้ลองเริ่มบริการและดู Log

sudo systemctl start mariadb
sudo journalctl -u mariadb -n 50 --no-pager

หากบริการหยุดเองบ่อย ให้ตรวจว่าถูก OOM Killer ปิดเพราะหน่วยความจำไม่พอหรือไม่

sudo journalctl -k | grep -i -E "out of memory|killed process"

ถ้าพบชื่อ mariadbd หรือ mysqld ในผลลัพธ์ แสดงว่า RAM ไม่พอ ควรเพิ่ม Swap ตามคู่มือ เพิ่ม Swap File บน Linux Server หรือเพิ่มสเปก และตรวจการใช้ทรัพยากรตาม ตรวจสอบ CPU, RAM และ Load Average

ขั้นตอนที่ 4: ตรวจพื้นที่ดิสก์

เมื่อดิสก์เต็ม ฐานข้อมูลจะเขียนข้อมูลไม่ได้และอาจเริ่มทำงานไม่ได้

df -h

ถ้าพาร์ทิชันที่เก็บ /var/lib/mysql ใช้งาน 100% ให้ลบไฟล์ที่ไม่จำเป็นออก ดูวิธีหาไฟล์ใหญ่ได้ที่ ดิสก์เต็ม: ตรวจสอบพื้นที่และหาไฟล์ขนาดใหญ่บน Linux ห้ามลบไฟล์ภายใน /var/lib/mysql โดยตรงเด็ดขาด แล้วจึงเริ่มบริการฐานข้อมูลใหม่

ขั้นตอนที่ 5: ซ่อมตารางที่เสียหาย

หากเชื่อมต่อได้แต่หน้า /wp-admin แจ้งว่า One or more database tables are unavailable แสดงว่าตารางเสียหาย ให้สำรองฐานข้อมูลก่อน แล้วเพิ่มบรรทัดนี้ใน wp-config.php เหนือบรรทัด /* That's all, stop editing! */

define( 'WP_ALLOW_REPAIR', true );

เปิด https://example.com/wp-admin/maint/repair.php แล้วคลิก Repair Database เมื่อเสร็จแล้ว ต้องลบบรรทัดนี้ออกทันที เพราะหน้าซ่อมนี้เปิดได้โดยไม่ต้องเข้าสู่ระบบ บน Cloud Server สามารถตรวจทั้งฐานข้อมูลด้วยคำสั่งได้เช่นกัน

sudo mysqlcheck --check wp_example

บน MariaDB รุ่นใหม่คำสั่งนี้มีชื่อ mariadb-check ด้วย ตารางแบบ InnoDB ไม่รองรับการ Repair แบบเดียวกับ MyISAM หากตาราง InnoDB เสียหาย ทางที่ปลอดภัยที่สุดคือกู้คืนจากไฟล์สำรอง

ตรวจสอบผลลัพธ์

  • เปิดหน้าเว็บและ /wp-admin ได้ตามปกติ
  • คำสั่ง mysql ... -e "SELECT 1;" ด้วยค่าจาก wp-config.php ทำงานสำเร็จ
  • บน Cloud Server systemctl status ของบริการฐานข้อมูลเป็น active (running) และตั้งให้เริ่มอัตโนมัติด้วย sudo systemctl enable mariadb

ปัญหาที่พบบ่อย

เกิดหลังย้ายโฮสต์

เกือบทุกครั้งเกิดจาก wp-config.php ยังใช้ค่าของโฮสต์เดิม หรือยังไม่ได้ให้สิทธิ์ผู้ใช้ในฐานข้อมูลใหม่ ดูขั้นตอนครบถ้วนที่ ย้ายเว็บไซต์ WordPress ไปโฮสต์ใหม่

เกิดเป็นช่วง ๆ ตอนมีผู้เข้าชมมาก

มักเป็น Too many connections หรือ RAM ไม่พอ ให้ติดตั้งปลั๊กอิน Cache เพื่อลดการเรียกฐานข้อมูล ตรวจหาบอทที่เรียกหน้าเว็บจำนวนมากใน Access log และพิจารณาเพิ่มทรัพยากรของเซิร์ฟเวอร์

MariaDB เริ่มไม่ได้และ Log แจ้งว่าข้อมูลเสียหาย

อย่าลองแก้ไขไฟล์ข้อมูลเองโดยไม่มีไฟล์สำรอง ให้หยุดและคัดลอกโฟลเดอร์ /var/lib/mysql เก็บไว้ก่อน แล้วติดต่อผู้เชี่ยวชาญ

หากแก้ไขตามขั้นตอนแล้วเว็บยังใช้งานไม่ได้ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ พร้อมแจ้งโดเมน เวลาที่เริ่มเกิดปัญหา และข้อความ Error ที่พบจากการทดสอบในขั้นตอนที่ 2

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security