ในการเชื่อมต่อ MySQL และ MariaDB ความแตกต่างหลักในการเชื่อมต่อ อยู่ที่โปรแกรมโปรโตคอล การรับส่งข้อมูล, ขอบเขตการเข้าถึง และความปลอดภัย ครับ
การเชื่อมต่อ 3 รูปแบบหลัก
| รูปแบบ | วิธีการ | ลักษณะการทำงาน | ความเร็ว |
| Unix Socket | localhost | ใช้ไฟล์พิเศษ ในระบบไฟล์ Linux เพื่อคุยกันโดยตรง | เร็วที่สุด |
| TCP/IP | 127.0.0.1 หรือ IP | ใช้ Network Protocol ในการรับส่งข้อมูลผ่าน Port | ปานกลาง |
| % | Remote Access | เป็นการตั้งค่า User Permission ให้รับการเชื่อมต่อจาก IP ใดก็ได้ผ่าน TCP / IP | เท่ากับ TCP / IP |
ความปลอดภัยและกรณีที่ควรใช้
Unix Socket
เป็นการเชื่อมต่อภายในเครื่องเดียวกันโดยไม่ผ่านระบบ Network
- ความปลอดภัย: สูงสุด เพราะไม่มีการเปิด Port ให้โลกภายนอกเห็น จำกัดสิทธิ์ผ่าน User Permissions ของตัว OS เอง
- Case ที่ควรใช้
- Production Server: เมื่อ Web Server และ Database อยู่บนเครื่อง Physical / VPS ตัวเดียวกัน
- ข้อควรจำ: หากระบุ Host เป็น
localhostใน Client ส่วนใหญ่ (เช่น PHP, Python) ระบบจะพยายามวิ่งหา Socket ไฟล์โดยอัตโนมัติ
TCP/IP
การรับส่งข้อมูลผ่าน Network Interface
- ความปลอดภัย: สูง หากจำกัด Bind-address ไว้ที่
127.0.0.1หรือระบุ IP เฉพาะของ App Server - Case ที่ควรใช้
- Development : เชื่อมต่อจาก IDE เข้าหา Database ที่รันอยู่
- Multi-Server: เมื่อแยกเครื่อง Web Server และ DB Server ออกจากกัน
%
ไม่ใช่ “วิธี” เชื่อมต่อ แต่เป็น “สิทธิ์” ของ User ที่อนุญาตให้ Connect มาจากIP ที่ไหนก็ได้
- ความปลอดภัย: ต่ำที่สุด หากเปิดคู่กับ Firewall ที่ไม่รัดกุม เสี่ยงต่อการโดน Brute-force จากภายนอก
- Case ที่ควรใช้:
- ไม่แนะนำให้ใช้บน Production นอกจากจะทำ VPN หรือ White-list IP เท่านั้น
รายละเอียด
%คืออะไรในโลกของ MySQL/MariaDB?- ในตาราง
mysql.userฟิลด์Hostจะระบุว่า User นั้นสามารถล็อคอินมาจากที่ไหนได้บ้าง- Specific IP: เช่น
192.168.1.10 - IP Range: เช่น
192.168.1.% - Wildcard (
%) : หมายถึง “Any Host” หรือทุก IP Address ในโลกที่วิ่งมาถึง Server คุณได้
- Specific IP: เช่น
- ในตาราง
- ทำไมถึงบอกว่าเป็น Subset ของ IP ?
- หากเราวาดวงกลมของสิทธิ์การเข้าถึง
- วงกลมเล็กที่สุด: คือ Specific IP — เข้าได้เฉพาะจุดเดียว
- วงกลมที่ใหญ่ขึ้น: คือ IP Range — เข้าได้เฉพาะในวง LAN
- วงกลมที่ใหญ่ที่สุด: คือ Wildcard (
%) — ครอบคลุมทุก IP Address ที่มีอยู่จริง
- หากเราวาดวงกลมของสิทธิ์การเข้าถึง
ดังนั้น % จึงเป็นตัวแทน ที่รวมเอาทุก ๆ IP Address เข้าไว้ด้วยกันเพื่อให้จัดการสิทธิ์ได้ง่ายขึ้นครับ
ความเข้าใจผิดที่พบบ่อย
แม้ว่า % จะแปลว่า “ทุก IP” แต่ใน MySQL/MariaDB มันมี “ข้อยกเว้น” ที่สำคัญมากครับ% ไม่รวม localhost (ในบางกรณี)
โดยปกติ MySQL จะมองว่าการเชื่อมต่อผ่าน Unix Socket กับการเชื่อมต่อผ่าน TCP/IP เป็นคนละช่องทางกัน
- ถ้าคุณสร้าง User
'pitt'@'%'บางครั้งคุณอาจจะล็อคอินด้วย-h localhostไม่ได้ - คุณต้องล็อคอินด้วย
-h 127.0.0.1แทน เพื่อให้ระบบมองว่าเป็น Network IP แล้วไปเช็คสิทธิ์ใน%
การใช้งานใน Environment ต่าง ๆ
Development
- แนะนำ: ใช้ TCP/IP (
127.0.0.1) - เหตุผล: ตั้งค่าง่าย และ Tools ส่วนใหญ่บน macOS / Windows ทำงานกับ TCP ได้เสถียรกว่าการงมหา Path ของ Socket ไฟล์
Docker Environment
- แนะนำ: ใช้ TCP/IP
- เหตุผล: ในโลกของ Docker แต่ละ Container คือ “คนละเครื่อง” ดังนั้นมันจะคุยผ่าน Socket ไม่ได้
- การตั้งค่า: ให้ App เชื่อมไปที่ Hostname ตามชื่อ Service ใน
docker-compose.yml
Production Server
- แนะนำ: ใช้ Unix Socket
- เหตุผล: ประสิทธิภาพดีที่สุดและปลอดภัยที่สุด เพราะไม่ต้องเปิด Port 3306 ทิ้งไว้
สรุปการเลือกใช้ ตาม OS
| OS / Environment | วิธีที่แนะนำ | ทำไม? |
| Linux | Unix Socket | เร็วที่สุด ปลอดภัยที่สุด ไม่ต้องผ่าน Network Card |
| macOS | TCP/IP | สะดวกที่สุด ลดปัญหาเรื่องหา Path ของ Socket ไม่เจอ |
| Windows | TCP/IP | เป็นวิธีมาตรฐานเพียงวิธีเดียวที่ทำงานได้สถียร |
| Docker | TCP/IP | เพราะ Container คุยข้ามกันผ่าน Socket ไม่ได้ |
ข้อควรระวังเรื่องความปลอดภัย
- ห้ามเปิด
%สำหรับ Userrootโดยเด็ดขาด - การใช้
%คือการเปิดประตูบ้านทิ้งไว้ทุกบาน- เสี่ยงต่อการ Brute-force: ใครก็ตามที่รู้ IP Server ของคุณสามารถพยายามเดารหัสผ่านได้จากทั่วโลก
- ควรใช้คู่กับ Firewall: หากจำเป็นต้องใช้
%จริง ๆ คุณควรจำกัดที่ระดับ Firewall ให้เฉพาะ IP ที่ไว้ใจเท่านั้นที่ผ่าน Port 3306 เข้ามาได้
- หากต้องใช้ Remote Access ให้ใช้การ SSH Tunneling แทนการเปิด Port 3306 ตรง ๆ
- ตรวจสอบ
bind-addressในไฟล์ config เสมอว่าไม่ได้เผลอเปิดรับทุก IP (0.0.0.0) โดยไม่จำเป็น - ถ้าคุณรันบน Docker, ปกติเราจะใช้
%เพราะ IP ของ Container ลูกจะเปลี่ยนไปเรื่อย ๆ ทุกครั้งที่ Restart แต่เราจะ “ซ่อน” Port 3306 ไว้ไม่ให้ Public ออกไปข้างนอก เพื่อความปลอดภัยครับ
อ่านเพิ่มเติม