MySQL
MySQL User คืออะไร?
MySQL User คือบัญชี (Account) ที่ใช้สำหรับเชื่อมต่อเข้า MySQL Database เช่นเดียวกับ Username/Password ของคอมพิวเตอร์ Windows ที่ต่างกัน MySQL User ก็มี Username และ Password ที่แตกต่างกัน และแต่ละ User สามารถกำหนดสิทธิ์ (Privileges) ได้แตกต่างกัน
ตัวอย่าง MySQL User ของคุณ:
- root — User ของ Administrator บน MySQL มีสิทธิ์ ALL (ทำได้ทุกอย่าง) ห้ามใช้ root ในตัว Application ของคุณ (WordPress, Joomla เป็นต้น)
- user_blog — User สำหรับเว็บบล็อก ใช้ร่วมกับ Database ชื่อ db_blog
- user_shop — User สำหรับเว็บร้านค้า ใช้ร่วมกับ Database ชื่อ db_shop
การมี MySQL User หลายตัว ที่แยกกันตามแต่ละ Database ช่วยลดความเสี่ยงจากการรั่วไหลข้อมูล ถ้า WordPress โดนแฮก และมีคนได้ Credential ของ Database ถ้า User นั้นมีสิทธิ์เฉพาะ Database ของ WordPress เท่านั้น คนแฮกก็ไม่สามารถเข้าถึง Database อื่น ๆ ได้
Privileges (สิทธิ์) ประเภทต่าง ๆ ใน MySQL
Privilege คือ "สิทธิ์" ที่บอกว่า User นั้นสามารถทำอะไรได้บ้าง Privilege มีหลายชนิด:
- SELECT — อ่านข้อมูลจาก Table ได้
- INSERT — เพิ่มข้อมูลใหม่ลงใน Table ได้
- UPDATE — แก้ไขข้อมูลใน Table ได้
- DELETE — ลบข้อมูลใน Table ได้
- CREATE — สร้าง Table หรือ Database ใหม่ได้
- DROP — ลบ Table หรือ Database ได้ (อันตรายมาก!)
- ALTER — เปลี่ยนโครงสร้าง Table ได้
- GRANT — ให้สิทธิ์ Privilege ให้ User อื่นได้ (อันตรายมาก!)
- ALL PRIVILEGES — สิทธิ์ทั้งหมด (ควรใช้แค่ root เท่านั้น)
ตัวอย่าง Privilege ของ WordPress User:
- SELECT, INSERT, UPDATE, DELETE — พอ ไม่ต้องให้ CREATE, DROP, ALTER
- ไม่ให้ GRANT เพราะไม่ต้อง Plugin ของ WordPress สร้าง User ใหม่
วิธีสร้าง MySQL User ใหม่ใน cPanel
ขั้นตอน:
- Login เข้า cPanel https://yourdomain.com:2083
- หา Icon ชื่อ MySQL Databases (อยู่ในส่วน Databases)
- คลิก Add New User
- กรอก Username (ตัวอักษรและตัวเลขเท่านั้น ไม่มี Special Character)
- กรอก Password (ควรยาว 12+ ตัวอักษร มีตัวพิมพ์ใหญ่, ตัวพิมพ์เล็ก, ตัวเลข, Special Character)
- คลิก Create User
เมื่อสร้าง User เสร็จแล้ว ให้เลือก User นั้นและกำหนด Privilege ให้กับ Database ที่ต้องการ:
- ไปยังหัวข้อ Add User to Database
- เลือก User ที่สร้างใหม่
- เลือก Database ที่ต้องการ
- ตัวเลือก Privileges:
- ถ้าต้องการให้ WordPress ใช้ → เลือก SELECT, INSERT, UPDATE, DELETE (ไม่เลือก ALL)
- ถ้าต้องการ Plugin ในการสร้าง Table อัตโนมัติ → เพิ่ม CREATE, ALTER ด้วย
- ไม่ให้เลือก DROP, GRANT ไม่ว่ากรณีไหนก็ตาม
- คลิก Add User to Database
แก้ไข Privilege ของ User ที่มีอยู่แล้ว
ถ้า User ใดใดมีสิทธิ์ที่เกินเกินความจำเป็น (เช่น มี DROP, GRANT, ALL PRIVILEGES) สามารถแก้ไขได้:
- ไปยัง cPanel MySQL Databases
- ในหัวข้อ Manage User Privileges ให้เลือก User ที่ต้องการแก้ไข
- ยกเลิก (Uncheck) Privilege ที่ไม่ต้องการ
- คลิก Update Privileges
หรือสามารถใช้ phpMyAdmin ได้ด้วย:
- เข้า phpMyAdmin ผ่าน cPanel
- ไปที่ User Accounts
- เลือก User ที่ต้องการแก้
- ปรับ Privileges ในแถบ Global Privileges และ Database-specific privileges
- บันทึกการเปลี่ยนแปลง
ตรวจสอบว่า Privilege ถูกกำหนดอย่างถูกต้อง
สามารถตรวจสอบ Privilege ของ User ได้ใน phpMyAdmin:
-- 1. ดูสิทธิ์ของ User ทั้งหมด (ต้องใช้ root user)
SELECT user, host, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv FROM mysql.user WHERE user='username_ที่_ต้องการ_ดู';
-- 2. ดู Privilege ของ User บน Database เฉพาะตัว
SELECT user, host, select_priv, insert_priv, update_priv, delete_priv, create_priv, alter_priv FROM mysql.db WHERE user='username_ที่_ต้องการ_ดู';
-- 3. ตรวจสอบว่า User สามารถ Connect ได้หรือไม่ (ในเทอร์มินัล ถ้าใช้ SSH)
mysql -u username_ที่_ต้องการ_ดู -p -h localhost
# ถ้า Connect ได้ แสดง mysql> prompt ถ้าไม่ได้ จะเห็น error "Access denied"
แก้ปัญหาที่พบบ่อย
Error: "Access denied for user 'username'@'localhost' (using password: YES)"
เกิดเมื่อ WordPress หรือ Application พยายาม Connect ไป MySQL แต่ Password ไม่ถูก หรือ User ที่ User นั้นไม่มี Privilege ในฐานข้อมูลนั้น
วิธีแก้: ตรวจสอบไฟล์ wp-config.php (สำหรับ WordPress) ว่า Username, Password, Database Name ที่ใส่ไว้ตรงกับที่สร้างใน cPanel หรือไม่ ถ้าตรง ลองตรวจสอบว่า User นั้นมี Privilege กับ Database นั้นแล้วหรือยัง (ผ่าน cPanel Add User to Database)
Error: "Cannot connect to MySQL server. User 'xxx' doesn't have permission"
เกิดเมื่อ User ที่ Application ใช้ ไม่มี Privilege พอสำหรับการทำงาน เช่น Plugin ต้องการ CREATE TABLE แต่ User ไม่มี CREATE Privilege
วิธีแก้: ไปที่ cPanel Manage User Privileges เพิ่ม Privilege ที่ขาดหายไป (เช่น CREATE, ALTER) แต่ต้องประมาณว่าต้องใช้อะไรบ้าง ไม่ควรให้ ALL PRIVILEGES ทั้งหมด
Error: "User ถูกลบออกไป แต่ยังมีข้อมูลในฐานข้อมูล"
บางครั้งเมื่อลบ User ข้อมูลที่เห็นแต่ไม่อยู่ในฐานข้อมูล (ตัวอย่าง corrupt data) อาจยังคงอยู่ เมื่อสร้าง User ใหม่อีกครั้ง Application อาจสับสนกับข้อมูลเก่า
วิธีแก้: ลบ Database ทั้งหมดแล้วสร้างใหม่ ถ้าเป็น WordPress ให้ Reinstall Plugin Installer หรือลองใช้ SQL export/import เพื่อ Backup ข้อมูลก่อน
Error: "ให้ User มี ALL PRIVILEGES แล้วแต่ยังไม่ได้ Permission"
อาจเกิดจาก Plugin หรือ Script ต้อง Super User Privilege (SUPER, FILE, PROCESS) ซึ่ง Shared Hosting ปกติไม่อนุญาต หรือ User นั้นไม่มี Privilege บน Database นั้นจริง ๆ (เช่น Add User ไป Database ผิด)
วิธีแก้: ตรวจสอบใน phpMyAdmin ว่า User นั้นมีรายการใน mysql.db table ที่ชี้ไปยัง Database ที่ต้องการจริง ๆ หรือไม่
Error: "ต้องการลบ User แต่กลัวว่า Application จะหยุดทำงาน"
ถ้า User นั้นถูกใช้โดย Application ที่กำลังทำงาน การลบ User จะทำให้ Application ไม่สามารถ Connect ไป MySQL ได้อีก
วิธีแก้: ก่อนลบ User ให้ Transfer Application ไปใช้ User อื่นก่อน เปลี่ยน wp-config.php, config.php หรือไฟล์ตั้งค่าอื่นให้ใช้ User ใหม่ แล้วค่อยลบ User เก่า
คำถามที่พบบ่อย
Q: ต้องสร้าง User แยกให้แต่ละ Database หรือ ใช้ User เดียวกันได้?
A: ควรสร้าง User แยกให้แต่ละ Database ถ้าเป็นไปได้ ทำให้ความปลอดภัยสูงขึ้น ถ้า Hacker ได้รับ Credential ของ WordPress User เขาไม่สามารถเข้า Database ของบริการอื่น ได้ ส่วนใหญ่ Shared Hosting ไม่มีข้อจำกัด User ดังนั้นควรสร้างเป็นหลักความปลอดภัยแทนที่จะออม
Q: ลืมรหัสผ่าน MySQL User ทำไงดี?
A: ไปที่ cPanel MySQL Databases > Change Password แล้วกรอก User ที่ต้องการเปลี่ยน จากนั้นตั้งรหัสผ่านใหม่ ห้ามใช้ Brute Force หรือวิธีการแฮก เพียงแค่ Hosting Provider ให้การเปลี่ยน Password ได้ตามปกติ
Q: WordPress ต้องให้ Privilege อะไรบ้างให้ Plugin ทำงานปกติ?
A: ปกติ WordPress ต้องการ SELECT, INSERT, UPDATE, DELETE เพื่อบันทึก Post, Comments, User ถ้า Plugin ต้องสร้าง Table เองก็ต้อง CREATE, ALTER, DROP ด้วย แต่ DROP ควรให้ระมัดระวัง ส่วนใหญ่ WordPress ไม่จำเป็นต้อง GRANT ไม่ว่ากรณีไหนก็ตาม