เชื่อมต่อฐานข้อมูลไม่ได้ สาเหตุและวิธีแก้ไขทีละขั้นตอนฉบับ System Admin
คู่มือแก้ปัญหาเชื่อมต่อฐานข้อมูลไม่ได้อย่างครบถ้วน อธิบายสาเหตุที่พบบ่อย วิธีแก้ไขทีละขั้นตอน และแนวทางป้องกันเพื่อให้ระบบฐานข้อมูลทำงานได้อย่างเสถียร
เชื่อมต่อฐานข้อมูลไม่ได้เป็นปัญหาที่ทำให้ระบบหยุดชะงักทันที ไม่ว่าจะเป็นเว็บไซต์ แอปพลิเคชัน หรือระบบหลังบ้าน บทความนี้รวมสาเหตุที่พบบ่อยทั้งหมด พร้อมวิธีแก้ไขทีละขั้นตอนที่ System Admin ทำตามได้ทันที
สาเหตุที่ทำให้เชื่อมต่อฐานข้อมูลไม่ได้
ข้อมูลการเชื่อมต่อผิดพลาด
สาเหตุอันดับหนึ่งคือ Hostname, Username, Password หรือชื่อ Database สะกดผิด มักเกิดหลังย้ายเซิร์ฟเวอร์หรือเปลี่ยนรหัสผ่าน ตรวจไฟล์ config ให้ละเอียด:
# ตรวจไฟล์ .env
cat .env | grep -i "db\|database\|mysql\|postgres"
# ตรวจไฟล์ config.php ของ WordPress
grep "DB_" wp-config.php
Database Service หยุดทำงาน
Service ฐานข้อมูลอาจหยุดโดยไม่คาดคิด ตรวจสอบสถานะทันที:
# ตรวจสถานะ MySQL/MariaDB
sudo systemctl status mysql
# ตรวจสถานะ PostgreSQL
sudo systemctl status postgresql
ถ้า Service หยุด ให้ Start ใหม่แล้วตรวจ Log:
# Start MySQL ใหม่
sudo systemctl start mysql
# ตรวจ Log หาสาเหตุ
sudo tail -50 /var/log/mysql/error.log
# สำหรับ PostgreSQL
sudo tail -50 /var/log/postgresql/postgresql-16-main.log
พอร์ตถูกบล็อกโดย Firewall
MySQL ใช้พอร์ต 3306, PostgreSQL ใช้ 5432 ตรวจสอบและเปิดพอร์ต:
# ตรวจว่าพอร์ตเปิดอยู่หรือไม่
sudo ss -tlnp | grep 3306
# ทดสอบเชื่อมต่อพอร์ตจากเครื่องอื่น
telnet db-server-ip 3306
# เปิดพอร์ตใน UFW Firewall
sudo ufw allow from 10.0.0.0/24 to any port 3306
sudo ufw status
สำหรับ iptables:
sudo iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT
sudo iptables -L -n | grep 3306
VPS ที่มีระบบจัดการ Firewall ที่ดีจะช่วยตั้งค่าพอร์ตได้สะดวกและปลอดภัย
Bind Address จำกัดการเข้าถึง
ฐานข้อมูลหลายตัวตั้ง bind-address เป็น 127.0.0.1 ยอมรับ Connection จาก localhost เท่านั้น
สำหรับ MySQL แก้ไข /etc/mysql/mysql.conf.d/mysqld.cnf:
# เปลี่ยนจาก
bind-address = 127.0.0.1
# เป็น (รับจากทุก IP) หรือระบุ IP ที่ต้องการ
bind-address = 0.0.0.0
สำหรับ PostgreSQL แก้ไข /etc/postgresql/16/main/postgresql.conf:
listen_addresses = '*'
รีสตาร์ท Database หลังแก้ไข:
sudo systemctl restart mysql
# หรือ
sudo systemctl restart postgresql
วิธีแก้ไขทีละขั้นตอน
ขั้นตอนที่ 1 ตรวจสถานะ Database Service
sudo systemctl status mysql
# ถ้าหยุดอยู่
sudo systemctl start mysql
# ตรวจ Log
sudo journalctl -u mysql --since "30 minutes ago"
ขั้นตอนที่ 2 ทดสอบ Connection จาก Command Line
# ทดสอบ MySQL
mysql -u root -p -h 127.0.0.1
# ทดสอบ PostgreSQL
psql -h 127.0.0.1 -U postgres -d mydb
# ทดสอบจากเครื่องอื่น
mysql -u appuser -p -h db-server-ip mydb
ถ้าเชื่อมต่อได้จาก command line แต่แอปเชื่อมต่อไม่ได้ ปัญหาอยู่ที่ไฟล์ Config ของแอป
ขั้นตอนที่ 3 ตรวจสิทธิ์และ Authentication
สำหรับ MySQL ตรวจสิทธิ์และ GRANT ใหม่:
-- ดูสิทธิ์ปัจจุบัน
SHOW GRANTS FOR 'appuser'@'10.0.0.%';
-- GRANT สิทธิ์ใหม่
CREATE USER 'appuser'@'10.0.0.%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'10.0.0.%';
FLUSH PRIVILEGES;
สำหรับ PostgreSQL แก้ไข /etc/postgresql/16/main/pg_hba.conf:
# เพิ่มบรรทัดนี้เพื่ออนุญาต Connection จาก subnet
host mydb appuser 10.0.0.0/24 scram-sha-256
sudo systemctl reload postgresql
ขั้นตอนที่ 4 ตรวจ Connection Limit
-- MySQL: ดูจำนวน Connection ปัจจุบัน
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
-- เพิ่ม max_connections ถ้าจำเป็น
SET GLOBAL max_connections = 300;
-- PostgreSQL: ดู Connection ปัจจุบัน
SELECT count(*) FROM pg_stat_activity;
SHOW max_connections;
สำหรับ Security ควรเปิดเฉพาะพอร์ตที่จำเป็นอย่างปลอดภัย
การป้องกันปัญหาในระยะยาว
Connection Pooling
ติดตั้ง PgBouncer สำหรับ PostgreSQL:
sudo apt install pgbouncer -y
sudo systemctl enable pgbouncer
Monitoring และ Alert
ตรวจสอบจำนวน Connection และการใช้ทรัพยากรแบบ Real-time:
# MySQL: ดูสถานะแบบ real-time
mysqladmin -u root -p status
mysqladmin -u root -p processlist
Dedicated Server สำหรับฐานข้อมูลโดยเฉพาะให้ประสิทธิภาพและความน่าเชื่อถือสูงสุด
บริการ Colocation ในศูนย์ข้อมูลมาตรฐานสูงช่วยเพิ่มความมั่นใจเรื่องความปลอดภัยของข้อมูล
คำถามที่พบบ่อย (FAQ)
เชื่อมต่อ Database จากเครื่องอื่นไม่ได้ทั้งที่ตั้งค่าถูกแล้ว ทำอย่างไร
ตรวจสอบ 3 จุด: Firewall ด้วย sudo ufw status, bind-address ในไฟล์ config ว่าไม่ได้จำกัดเฉพาะ localhost, และ User ว่าได้รับ GRANT สิทธิ์จาก IP ที่เชื่อมต่อมา
Connection ถูกตัดบ่อย ๆ เกิดจากอะไร
อาจเกิดจาก wait_timeout ตั้งไว้สั้นเกินไป ตรวจด้วย SHOW VARIABLES LIKE 'wait_timeout'; และปรับค่าให้เหมาะสม หรือใช้ Connection Pool ที่ตั้ง Keep-alive
ควรใช้ Connection Pooling ตั้งแต่เมื่อไหร่
ควรใช้ตั้งแต่มี Concurrent User มากกว่า 50 คนขึ้นไป หรือเมื่อเริ่มเห็นปัญหา Connection เต็มบ่อย ๆ
MySQL กับ PostgreSQL ปัญหา Connection ต่างกันหรือไม่
หลักการคล้ายกัน แต่ PostgreSQL ใช้ pg_hba.conf ในการควบคุม Authentication ที่ซับซ้อนกว่า MySQL ส่วน MySQL ใช้ระบบ GRANT ที่ระบุได้ทั้ง User และ Host
ปัญหาเชื่อมต่อฐานข้อมูลมีหลายสาเหตุ แต่แก้ไขได้อย่างเป็นระบบตามขั้นตอนที่แนะนำ สำหรับการป้องกันระยะยาว ควรเลือก Hosting ที่มีโครงสร้างพื้นฐานแข็งแกร่ง และหากต้องการเซิร์ฟเวอร์เฉพาะสำหรับ Database DriteStudio พร้อมให้บริการ Dedicated Server ที่ปรับแต่งมาสำหรับ Database Workload โดยเฉพาะ
ไดรท์สตูดิโอ
ผู้ให้บริการโครงสร้างพื้นฐานดิจิทัลสำหรับ VPS เว็บโฮสติ้ง และบริการฝากวางเซิร์ฟเวอร์ในประเทศไทย
ดำเนินการโดย บริษัท คราฟต์ อินเตอร์เทค (ประเทศไทย) จำกัด