MariaDB database server ติดตั้งบน VPS Ubuntu

ติดตั้งและตั้งค่า MariaDB บน VPS Ubuntu ให้ปลอดภัย

มิถุนายน 2026 · อ่าน 9 นาที

MariaDB คือ fork ของ MySQL ที่พัฒนาโดยผู้สร้าง MySQL ดั้งเดิม เป็น drop-in replacement ที่ใช้ได้กับ WordPress, Laravel และ app ส่วนใหญ่โดยไม่ต้องแก้โค้ด มาพร้อม performance ที่ดีกว่า MySQL ในหลาย workload และมีการ update security ที่สม่ำเสมอ

ติดตั้ง MariaDB บน Ubuntu 22.04

# ติดตั้งจาก Ubuntu repo (MariaDB 10.6)
apt update
apt install mariadb-server mariadb-client -y

# หรือติดตั้ง version ล่าสุดจาก MariaDB Foundation repo
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
apt install mariadb-server -y

# เริ่ม service
systemctl enable --now mariadb

# ตรวจสอบ version
mariadb --version

Hardening ด้วย mysql_secure_installation

mysql_secure_installation

ตอบคำถาม:

สร้าง Database และ User

# Login ด้วย root
mariadb -u root -p
-- สร้าง database
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- สร้าง user ที่เชื่อมต่อได้เฉพาะ localhost
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';

-- ให้สิทธิ์เฉพาะ database ที่เกี่ยวข้อง
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';

-- เพิ่ม สำหรับ WordPress
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'WpPassword456!';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';

FLUSH PRIVILEGES;
EXIT;
ใช้ utf8mb4 เสมอ: charset utf8 ใน MySQL/MariaDB รองรับแค่ 3 bytes ไม่รองรับ emoji และบาง Unicode character ใช้ utf8mb4 จะปลอดภัยกว่า

ตั้งค่า Performance ใน my.cnf

nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
# InnoDB Buffer Pool — ตั้งเป็น 50-70% ของ RAM
# VPS 2GB RAM → 1G, VPS 4GB → 2G
innodb_buffer_pool_size = 512M
innodb_buffer_pool_instances = 1

# Log file size
innodb_log_file_size = 128M

# Query Cache (เปิดสำหรับ read-heavy app)
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 2M

# Connection
max_connections = 150
connect_timeout = 10
wait_timeout = 300

# Slow Query Log (debug performance)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2

# Character Set
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
systemctl restart mariadb

ล็อคการเข้าถึงจาก Network

MariaDB ควร bind เฉพาะ localhost หรือ private network เท่านั้น:

# ใน /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 127.0.0.1

# ถ้ามีหลาย server ต้องการ remote access ใช้ IP private
# bind-address = 10.0.0.1

# Firewall: อนุญาตเฉพาะ IP จำเป็น
ufw allow from 10.0.0.2 to any port 3306
ufw deny 3306

Backup อัตโนมัติ

nano /usr/local/bin/mariadb-backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mariadb"
mkdir -p "$BACKUP_DIR"

# Dump ทุก database
mysqldump -u root --all-databases \
  --single-transaction --routines --triggers \
  | gzip > "${BACKUP_DIR}/all_${DATE}.sql.gz"

# เก็บแค่ 14 วัน
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +14 -delete

echo "Backup done: all_${DATE}.sql.gz"
chmod +x /usr/local/bin/mariadb-backup.sh

# cron ทุกวันตี 3
echo "0 3 * * * root /usr/local/bin/mariadb-backup.sh >> /var/log/mariadb-backup.log 2>&1" \
  > /etc/cron.d/mariadb-backup

ตรวจสอบสุขภาพ Database

# ดู status โดยรวม
mariadb -u root -p -e "SHOW STATUS LIKE 'Threads%';"
mariadb -u root -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool%';"

# ดู slow queries
tail -50 /var/log/mysql/mariadb-slow.log

# ขนาด database
mariadb -u root -p -e "
SELECT table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;"

หลังจากตั้งค่าครบตามขั้นตอนนี้ MariaDB บน VPS ของคุณจะพร้อมสำหรับ production ทั้งในแง่ security และ performance ควรตรวจสอบ slow query log เป็นประจำและปรับ innodb_buffer_pool_size ตาม workload จริงที่เจอบนเซิร์ฟเวอร์

ถ้ายังไม่มี VPS รองรับ MariaDB ที่ใช้งานได้จริง เช่า VPS สิงคโปร์จาก asiagb.com มี SSD NVMe ping ต่ำจากไทย เหมาะกับ database workload และ restore ได้เร็วในกรณีฉุกเฉิน นอกจากนี้ก่อน go-live ควรใช้ dnsxray.com ตรวจ DNS และ SSL ของโดเมนให้ผ่านก่อนเชื่อมต่อ production database

ตรวจสอบว่า MariaDB ทำงานถูกต้อง

# ตรวจสอบ version และ service
mariadb --version
systemctl status mariadb

# ทดสอบ login และ query พื้นฐาน
mariadb -u root -p -e "SHOW DATABASES; SELECT VERSION();"

# ตรวจสอบ connection ของ app user
mariadb -u myapp_user -p myapp -e "SHOW TABLES;"

# ดูสุขภาพ InnoDB buffer pool
mariadb -u root -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool%';"
Tip: คำนวณ InnoDB buffer pool hit rate ด้วย: Innodb_buffer_pool_reads / (Innodb_buffer_pool_reads + Innodb_buffer_pool_read_requests) ค่าที่ดีควรต่ำกว่า 1% (miss rate) ถ้าสูงกว่านี้ให้เพิ่ม innodb_buffer_pool_size

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

Error: "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'"

MariaDB ยังไม่รัน หรือ socket file อยู่คนละตำแหน่ง:

# ตรวจสอบและ start service
systemctl status mariadb
systemctl start mariadb

# หา socket path จริง
mariadb --print-defaults | grep socket
# หรือดูจาก config
grep socket /etc/mysql/mariadb.conf.d/50-server.cnf

Error: "Access denied for user 'root'@'localhost'" หลัง mysql_secure_installation

Ubuntu/Debian ใช้ unix_socket authentication สำหรับ root โดย default ต้องใช้ sudo หรือ su:

# วิธีที่ 1: ใช้ sudo
sudo mariadb

# วิธีที่ 2: เปลี่ยนมาใช้ password auth
sudo mariadb -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';"
sudo mariadb -e "FLUSH PRIVILEGES;"

Error: MariaDB service start ล้มเหลว — "[ERROR] InnoDB: Cannot read the first block in file"

มักเกิดหลังเปลี่ยน innodb_log_file_size โดยไม่ลบ log file เก่า:

# ดู error log ละเอียด
journalctl -u mariadb -n 50
tail -50 /var/log/mysql/error.log

# แก้ไข: หยุด service, ลบ log เก่า, start ใหม่
systemctl stop mariadb
rm /var/lib/mysql/ib_logfile*
systemctl start mariadb

Error: "Incorrect string value" เมื่อ insert ข้อมูลภาษาไทย

Database หรือ table ถูกสร้างด้วย charset ที่ไม่รองรับ Thai ต้องใช้ utf8mb4:

-- ตรวจสอบ charset ของ database
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'mydb';

-- แปลง database เป็น utf8mb4
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- แปลง table ที่มีปัญหา
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Error: slow query อยู่เรื่อยๆ แม้ตั้ง innodb_buffer_pool_size แล้ว

ปัญหามักอยู่ที่ index ไม่ครบ ให้ดู slow query log และใช้ EXPLAIN:

# ดู slow queries ล่าสุด
tail -50 /var/log/mysql/mariadb-slow.log

# วิเคราะห์ query ที่ช้า
mariadb -u root -p mydb -e "EXPLAIN SELECT * FROM users WHERE email = '[email protected]';"
# ถ้า type = ALL แปลว่า full table scan — ต้องเพิ่ม index

-- เพิ่ม index
ALTER TABLE users ADD INDEX idx_email (email);

คำถามที่พบบ่อย

MariaDB กับ MySQL ต่างกันอย่างไร? ใช้แทนกันได้ไหม?

MariaDB เป็น fork ของ MySQL ที่สร้างโดยทีมเดิม compatible ในระดับ syntax และ API ทำให้ WordPress, Laravel และ app ส่วนใหญ่ทำงานได้โดยไม่ต้องแก้โค้ด ข้อได้เปรียบ MariaDB คือ update บ่อยกว่า, มี storage engine ที่หลากหลายกว่า และ license ที่เปิดกว่า

ต้องการให้ app จาก server อื่น connect มาที่ database ได้อย่างไร?

เปลี่ยน bind-address เป็น IP private network แล้วสร้าง user ที่ authorize จาก IP นั้น: CREATE USER 'user'@'10.0.0.2' IDENTIFIED BY 'pass'; จากนั้นตั้ง UFW ให้เปิด port 3306 เฉพาะจาก IP ที่กำหนด ไม่ควร expose 3306 ออก internet โดยตรง

จะ migrate database จาก MySQL มาที่ MariaDB ได้ไหม?

ได้ ขั้นตอนคือ: mysqldump บน MySQL → สร้าง MariaDB ใหม่ → mysql import dump ลง MariaDB ข้อมูล SQL syntax เหมือนกันทั้งหมด แต่ถ้าใช้ MySQL 8.0+ feature บางอย่าง (เช่น window functions บางแบบ) ให้ตรวจสอบ compatibility ก่อน migrate