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

Home สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB พร้อมกำหนดสิทธิ์

สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB พร้อมกำหนดสิทธิ์

แต่ละเว็บไซต์หรือแอปพลิเคชันควรมีฐานข้อมูลและผู้ใช้ฐานข้อมูลเป็นของตัวเอง ไม่ควรให้แอปเชื่อมต่อด้วยผู้ใช้ root เพราะหากแอปตัวใดถูกเจาะ ผู้โจมตีจะเข้าถึงได้แค่ฐานข้อมูลของแอปนั้น ไม่ใช่ทั้งเซิร์ฟเวอร์ คู่มือนี้แสดงคำสั่ง SQL ที่ใช้ได้ทั้ง MySQL 8 และ MariaDB 10.x

หากใช้ Hosting ที่มี Plesk หรือ DirectAdmin ควรสร้างฐานข้อมูลผ่านหน้าควบคุมแทน ดูได้ที่ สร้างฐานข้อมูล MySQL บน DirectAdmin คู่มือนี้เหมาะกับ Cloud Server ที่ติดตั้งฐานข้อมูลเอง

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

  • MySQL 8.x หรือ MariaDB 10.x ติดตั้งและทำงานอยู่ (ดู ติดตั้ง Nginx, PHP-FPM และ MariaDB (LEMP) บน Ubuntu)
  • สิทธิ์ sudo บนเซิร์ฟเวอร์ หรือรหัสผ่านของผู้ใช้ root ของฐานข้อมูล
  • ชื่อฐานข้อมูล ชื่อผู้ใช้ และรหัสผ่านที่ตั้งใจจะใช้ ตัวอย่างในคู่มือใช้ shopdb และ shopuser

ขั้นตอนที่ 1: เข้าสู่ฐานข้อมูลในฐานะผู้ดูแล

บน Ubuntu ผู้ใช้ root ของทั้ง MariaDB และ MySQL ใช้การยืนยันตัวตนผ่าน Socket จึงเข้าได้ด้วย sudo โดยไม่ต้องใส่รหัสผ่าน MariaDB บน AlmaLinux และ Rocky Linux ก็เข้าแบบนี้ได้เช่นกัน

sudo mysql

หากตั้งรหัสผ่านให้ root ไว้แล้ว ใช้

mysql -u root -p

เมื่อสำเร็จจะเห็นพรอมต์ mysql> หรือ MariaDB [(none)]> คำสั่ง SQL ต่อจากนี้ต้องจบด้วยเครื่องหมาย ; ทุกครั้ง

ขั้นตอนที่ 2: สร้างฐานข้อมูล

CREATE DATABASE shopdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ผลลัพธ์ Query OK, 1 row affected แปลว่าสำเร็จ ควรใช้ utf8mb4 เสมอ เพราะรองรับภาษาไทยและ Emoji ได้ครบ ส่วน Collation utf8mb4_unicode_ci ใช้ได้ทั้ง MySQL และ MariaDB ทำให้ย้ายฐานข้อมูลข้ามกันได้ง่าย (MySQL 8 มีค่าเริ่มต้นเป็น utf8mb4_0900_ai_ci ซึ่ง MariaDB 10.x ไม่รู้จัก)

ตั้งชื่อฐานข้อมูลด้วยตัวอักษรภาษาอังกฤษ ตัวเลข และ _ เท่านั้น หากชื่อมีขีด - ต้องครอบด้วย Backtick เช่น `shop-db` ทุกครั้งที่อ้างถึง

ขั้นตอนที่ 3: สร้างผู้ใช้

CREATE USER 'shopuser'@'localhost' IDENTIFIED BY 'ใส่รหัสผ่านที่แข็งแรงที่นี่';

ส่วน @'localhost' คือ Host ที่ผู้ใช้นี้เชื่อมต่อเข้ามาได้ ในที่นี้คือเฉพาะจากเครื่องเดียวกัน ซึ่งเหมาะกับแอปที่อยู่บนเซิร์ฟเวอร์เดียวกับฐานข้อมูล ผู้ใช้ชื่อเดียวกันแต่ Host ต่างกันนับเป็นคนละบัญชี

ใช้รหัสผ่านยาวอย่างน้อย 16 ตัวอักษร ผสมตัวพิมพ์ใหญ่ เล็ก ตัวเลข และสัญลักษณ์ หลีกเลี่ยงเครื่องหมาย ' ในรหัสผ่าน เพราะต้อง Escape และมักทำให้ไฟล์ตั้งค่าของแอปผิดพลาด สร้างรหัสผ่านสุ่มได้ด้วยคำสั่ง openssl rand -base64 24 ในอีกหน้าต่างหนึ่ง

ขั้นตอนที่ 4: กำหนดสิทธิ์ด้วย GRANT

สำหรับแอปทั่วไปอย่าง WordPress ที่ต้องสร้างและแก้ไขตารางเองได้ ให้สิทธิ์ทั้งหมดเฉพาะในฐานข้อมูลของตัวเอง

GRANT ALL PRIVILEGES ON shopdb.* TO 'shopuser'@'localhost';

shopdb.* หมายถึงทุกตารางในฐานข้อมูล shopdb ห้ามใช้ *.* กับผู้ใช้ของแอป เพราะเท่ากับให้สิทธิ์ทุกฐานข้อมูลในเซิร์ฟเวอร์

ตัวอย่างสิทธิ์แบบจำกัดสำหรับกรณีอื่น

-- ผู้ใช้สำหรับอ่านรายงานอย่างเดียว
CREATE USER 'report'@'localhost' IDENTIFIED BY 'รหัสผ่านอีกชุด';
GRANT SELECT ON shopdb.* TO 'report'@'localhost';

-- แอปที่อ่านเขียนข้อมูลได้ แต่แก้โครงสร้างตารางไม่ได้
GRANT SELECT, INSERT, UPDATE, DELETE ON shopdb.* TO 'shopuser'@'localhost';

คำสั่ง GRANT มีผลทันที ไม่จำเป็นต้องรัน FLUSH PRIVILEGES (คำสั่งนี้จำเป็นเฉพาะกรณีแก้ตารางสิทธิ์ในฐานข้อมูล mysql โดยตรง)

ขั้นตอนที่ 5: จัดการผู้ใช้ภายหลัง

-- ดูสิทธิ์ของผู้ใช้
SHOW GRANTS FOR 'shopuser'@'localhost';

-- เปลี่ยนรหัสผ่าน
ALTER USER 'shopuser'@'localhost' IDENTIFIED BY 'รหัสผ่านใหม่';

-- ยกเลิกสิทธิ์บางอย่าง
REVOKE DELETE ON shopdb.* FROM 'shopuser'@'localhost';

-- ดูรายชื่อผู้ใช้ทั้งหมด
SELECT user, host FROM mysql.user;

-- ลบผู้ใช้
DROP USER 'report'@'localhost';

หมายเหตุ: คำสั่ง DROP DATABASE ลบฐานข้อมูลพร้อมข้อมูลทั้งหมดทันทีและกู้คืนไม่ได้ ก่อนลบให้สำรองด้วย mysqldump ตามคู่มือ สำรองและกู้คืนฐานข้อมูล MySQL/MariaDB ด้วย mysqldump ทุกครั้ง

พิมพ์ exit เพื่อออกจากฐานข้อมูล

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

ทดสอบเข้าด้วยผู้ใช้ใหม่ (ไม่ต้องใช้ sudo)

mysql -u shopuser -p shopdb

ใส่รหัสผ่าน แล้วลองคำสั่ง

SHOW DATABASES;
SELECT CURRENT_USER();

ผลลัพธ์ควรเห็นเฉพาะ shopdb และ information_schema และ CURRENT_USER() แสดง shopuser@localhost จากนั้นนำชื่อฐานข้อมูล ผู้ใช้ และรหัสผ่านไปใส่ในไฟล์ตั้งค่าของแอป โดยใช้ Host เป็น localhost

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

ERROR 1045: Access denied for user

รหัสผ่านผิด หรือ Host ไม่ตรงกับบัญชีที่สร้าง ตัวอย่างที่พบบ่อยคือแอปตั้ง Host เป็น 127.0.0.1 ซึ่งเชื่อมต่อผ่าน TCP ขณะที่บัญชีสร้างไว้เป็น 'localhost' ซึ่งบางการตั้งค่าจะมองเป็นคนละ Host ให้เปลี่ยนการตั้งค่าในแอปเป็น localhost หรือสร้างบัญชี 'shopuser'@'127.0.0.1' เพิ่มพร้อม GRANT ชุดเดียวกัน

ERROR 1410: You are not allowed to create a user with GRANT

MySQL 8 ไม่สร้างผู้ใช้ให้อัตโนมัติจากคำสั่ง GRANT อีกแล้ว ต้องรัน CREATE USER ก่อน แล้วจึง GRANT (MariaDB ยังยอมให้ทำในคำสั่งเดียวได้ แต่แยกสองคำสั่งจะใช้ได้กับทั้งสองระบบ)

ERROR 1819: Your password does not satisfy the current policy requirements

MySQL เปิด Component validate_password ไว้ ให้ใช้รหัสผ่านที่ยาวขึ้นและมีตัวพิมพ์ใหญ่ เล็ก ตัวเลข และสัญลักษณ์ครบ ดูเกณฑ์ปัจจุบันได้ด้วย SHOW VARIABLES LIKE 'validate_password%';

ERROR 1396: Operation CREATE USER failed

มีผู้ใช้ชื่อและ Host นี้อยู่แล้ว ตรวจด้วย SELECT user, host FROM mysql.user; หากต้องการตั้งรหัสผ่านใหม่ให้ใช้ ALTER USER แทน

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

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

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