คำตอบสั้น ๆ: หาสาเหตุและแก้ไขข้อความ Error establishing a database connection ใน WordPress ตั้งแต่ค่าใน wp-config.php บริการฐานข้อมูลหยุด ดิสก์เต็ม ไปจนถึงตารางเสียหาย
คู่มือนี้อธิบาย Database Connection ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ข้อความ Error establishing a database connection หมายความว่า WordPress ติดต่อฐานข้อมูล MySQL หรือ MariaDB ไม่ได้ เมื่อเกิดขึ้นทั้งหน้าเว็บและหน้า /wp-admin จะใช้งานไม่ได้ สาเหตุหลักมีไม่กี่อย่าง ได้แก่ ข้อมูลการเชื่อมต่อใน wp-config.php ไม่ถูกต้อง บริการฐานข้อมูลหยุดทำงาน ดิสก์เต็ม ตารางในฐานข้อมูลเสียหาย หรือฐานข้อมูลรับการเชื่อมต่อไม่ไหว
คู่มือนี้เรียงลำดับการตรวจจากสาเหตุที่พบบ่อยและตรวจง่ายที่สุดไปหายากที่สุด ขั้นตอนที่ 1 และ 2 ทำได้ทั้งบน Web Hosting และ Cloud Server ส่วนขั้นตอนที่ 3 และ 4 ต้องมีสิทธิ์ root บนเซิร์ฟเวอร์ของตนเอง
สิ่งที่ต้องเตรียม (Database Connection)
- สิทธิ์เข้าถึงไฟล์ของเว็บผ่าน SSH, File Manager ของ Plesk/DirectAdmin หรือ FTP
- สิทธิ์จัดการฐานข้อมูลใน Control Panel หรือ root บน Cloud Server
- สำรองไฟล์
wp-config.phpก่อนแก้ไขทุกครั้ง
ขั้นตอนที่ 1: ตรวจค่าใน wp-config.php (Database Connection)
เปิดไฟล์ 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: ทดสอบเชื่อมต่อด้วยข้อมูลเดียวกัน (Database Connection)
ถ้ามี 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 โดยตรงเด็ดขาด แล้วจึงเริ่มบริการฐานข้อมูลใหม่