การติดตั้ง MariaDB บน Cloud VPS

MariaDB เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) ที่ถูกสร้างขึ้นมาเป็น Fork ของ MySQL โดยผู้พัฒนาคนเดิมอย่าง Michael “Monty” Widenius หลังจากที่ Oracle ซื้อกิจการ Sun Microsystems ไป ปัจจุบันฐานข้อมูลตัวนี้ถูกใช้เป็นค่า Default ของ Linux Distribution หลายตัว เช่น Red Hat Enterprise Linux, Debian และ openSUSE เนื่องจากมีประสิทธิภาพสูง เปิดให้ใช้งานฟรีภายใต้ GPL License และเข้ากันได้กับ MySQL เกือบ 100%

บทความนี้จะพาคุณติดตั้งฐานข้อมูลตัวนี้บน Cloud VPS ที่ใช้ Ubuntu ตั้งแต่ขั้นตอนการเพิ่ม Repository อย่างเป็นทางการ ไปจนถึงการตั้งค่าความปลอดภัย สร้างฐานข้อมูลและผู้ใช้งาน ตั้งค่า Firewall และ Backup อัตโนมัติ พร้อมคำอธิบายทุกขั้นตอนเพื่อให้คุณเข้าใจและนำไปใช้งานได้จริง

ทำไมต้องเลือก MariaDB แทน MySQL

แม้ว่าทั้งสองระบบจะเข้ากันได้ในระดับสูง แต่มีเหตุผลหลายประการที่ทำให้ MariaDB เป็นตัวเลือกที่น่าสนใจกว่า ประการแรก ตัว RDBMS นี้มี Storage Engine เพิ่มเติมอย่าง Aria และ ColumnStore ที่ MySQL ไม่มี ประการที่สอง มีระบบ Thread Pool ในตัวที่ช่วยรองรับ Connection จำนวนมากได้ดีกว่า ในขณะที่ MySQL ต้องใช้ Enterprise Edition ถึงจะมีฟีเจอร์นี้ ประการที่สาม Query Optimizer ได้รับการปรับปรุงให้ดีขึ้น รองรับ Subquery Optimization และ Join Optimization ที่มีประสิทธิภาพมากกว่า และประการสุดท้าย เป็น Open Source อย่างแท้จริงภายใต้ GPL License โดยไม่มีฟีเจอร์ที่ถูกล็อคไว้ใน Enterprise Edition

ข้อกำหนดเบื้องต้น

ก่อนเริ่มติดตั้ง ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณมีสิ่งเหล่านี้พร้อม ได้แก่ Cloud VPS ที่ใช้ Ubuntu 22.04 หรือ 24.04 LTS, สิทธิ์ root หรือผู้ใช้ที่มีสิทธิ์ sudo, RAM อย่างน้อย 1 GB สำหรับการทดสอบ หรือ 2 GB ขึ้นไปสำหรับ Production, Disk Space ว่างอย่างน้อย 5 GB และการเชื่อมต่ออินเทอร์เน็ตสำหรับดาวน์โหลดแพ็คเกจ

ขั้นตอนที่ 1 — อัพเดตระบบ

เริ่มต้นด้วยการอัพเดตรายการแพ็คเกจและอัพเกรดแพ็คเกจที่มีอยู่ให้เป็นเวอร์ชันล่าสุด เพื่อให้แน่ใจว่าระบบมีความปลอดภัยและเข้ากันได้กับแพ็คเกจที่จะติดตั้ง

sudo apt update && sudo apt upgrade -y

ขั้นตอนที่ 2 — เพิ่ม MariaDB Official Repository

แม้ว่า Ubuntu จะมี MariaDB ใน Default Repository แต่เวอร์ชันอาจไม่ใหม่ล่าสุด การเพิ่ม Official Repository จาก MariaDB Foundation ช่วยให้คุณได้เวอร์ชันล่าสุดพร้อมแพตช์ความปลอดภัยและฟีเจอร์ใหม่ ๆ

# ติดตั้ง Dependencies ที่จำเป็น
sudo apt install -y apt-transport-https curl software-properties-common

# ดาวน์โหลดและเพิ่ม MariaDB Signing Key
curl -fsSL https://mariadb.org/mariadb_release_signing_key.pgp | sudo gpg --dearmor -o /usr/share/keyrings/mariadb-keyring.gpg

# เพิ่ม Repository (MariaDB 11.4 LTS)
echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.gpg] https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mariadb.list

# อัพเดตรายการแพ็คเกจ
sudo apt update

คำสั่งด้านบนจะเพิ่ม Repository ของ MariaDB 11.4 LTS ซึ่งเป็นเวอร์ชัน Long Term Support ที่ได้รับการสนับสนุนยาวนาน เหมาะสำหรับใช้งานใน Production

ขั้นตอนที่ 3 — ติดตั้ง MariaDB Server

# ติดตั้ง MariaDB Server และ Client
sudo apt install -y mariadb-server mariadb-client

# ตรวจสอบว่า Service ทำงาน
sudo systemctl status mariadb

# ตั้งค่าให้เริ่มทำงานอัตโนมัติเมื่อบูต
sudo systemctl enable mariadb

# ตรวจสอบเวอร์ชัน
mariadbd --version

หลังติดตั้งเสร็จ Service จะเริ่มทำงานอัตโนมัติ คุณสามารถตรวจสอบสถานะได้จากคำสั่ง systemctl status ถ้าเห็นข้อความ active (running) แสดงว่าทำงานปกติ

ขั้นตอนที่ 4 — ตั้งค่าความปลอดภัยเบื้องต้น

ระบบฐานข้อมูลมาพร้อมกับ Script สำหรับตั้งค่าความปลอดภัยเบื้องต้นที่ช่วยปิดช่องโหว่ที่อาจเกิดขึ้นจากการตั้งค่า Default

sudo mariadb-secure-installation

Script จะถามคำถามหลายข้อ แนะนำให้ตอบดังนี้

  • Switch to unix_socket authentication? — ตอบ N ถ้าต้องการใช้ Password Authentication หรือ Y ถ้าต้องการให้เฉพาะ root ของ Linux เข้าถึงได้
  • Set root password? — ตอบ Y แล้วตั้งรหัสผ่านที่แข็งแรง
  • Remove anonymous users? — ตอบ Y เพื่อลบผู้ใช้ที่ไม่มีชื่อ
  • Disallow root login remotely? — ตอบ Y เพื่อป้องกัน root login จากระยะไกล
  • Remove test database? — ตอบ Y เพื่อลบฐานข้อมูลทดสอบ
  • Reload privilege tables now? — ตอบ Y เพื่อให้การเปลี่ยนแปลงมีผลทันที

ขั้นตอนที่ 5 — ตั้งค่า Authentication

ระบบฐานข้อมูลนี้บน Ubuntu ใช้ Unix Socket Authentication เป็นค่า Default สำหรับ root user ซึ่งหมายความว่าเฉพาะผู้ใช้ root ของ Linux เท่านั้นที่จะเข้าถึง Database root ได้โดยไม่ต้องใส่รหัสผ่าน วิธีนี้ปลอดภัยสำหรับการดูแลระบบ แต่หากคุณต้องการเชื่อมต่อจากแอปพลิเคชัน ควรสร้าง User แยกต่างหาก

# เข้า MariaDB Console ด้วย root
sudo mariadb

# ตรวจสอบ Authentication Plugin ปัจจุบัน
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

# (ถ้าต้องการ) เปลี่ยนเป็น Password Authentication
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('YourStrongRootPassword');
FLUSH PRIVILEGES;

# ออกจาก Console
EXIT;

ขั้นตอนที่ 6 — สร้างฐานข้อมูลและผู้ใช้งาน

ในระบบ Production ไม่ควรใช้ root user สำหรับเชื่อมต่อจากแอปพลิเคชัน ควรสร้าง User เฉพาะสำหรับแต่ละฐานข้อมูลและกำหนดสิทธิ์ตามหลัก Least Privilege

# เข้า MariaDB Console
sudo mariadb

# สร้างฐานข้อมูล
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# สร้าง User สำหรับแอปพลิเคชัน (เข้าถึงจาก localhost เท่านั้น)
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'AppSecurePassword123!';

# กำหนดสิทธิ์เฉพาะที่จำเป็น
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'appuser'@'localhost';

# สร้าง User สำหรับ Backup (ต้องการสิทธิ์พิเศษ)
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'BackupPassword456!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD ON *.* TO 'backup_user'@'localhost';

# สร้าง User สำหรับ Monitoring (อ่านอย่างเดียว)
CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'MonitorPassword789!';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';

# Apply การเปลี่ยนแปลง
FLUSH PRIVILEGES;

# ตรวจสอบสิทธิ์ของ User
SHOW GRANTS FOR 'appuser'@'localhost';

EXIT;

ขั้นตอนที่ 7 — ปรับแต่งไฟล์ Configuration

ไฟล์ Configuration หลักอยู่ที่ /etc/mysql/mariadb.conf.d/50-server.cnf การปรับแต่งค่าให้เหมาะกับขนาดเซิร์ฟเวอร์ช่วยเพิ่มประสิทธิภาพได้อย่างมาก

# สำรองไฟล์ Configuration ก่อนแก้ไข
sudo cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.bak

# แก้ไข Configuration
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

ตัวอย่างค่าที่ควรปรับสำหรับเซิร์ฟเวอร์ที่มี RAM 4 GB

[mysqld]
# === Network ===
bind-address = 127.0.0.1
port = 3306
max_connections = 200

# === Character Set ===
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# === InnoDB Settings ===
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
innodb_buffer_pool_instances = 4

# === Query Cache (ปิดใน MariaDB 10.6+) ===
query_cache_type = 0
query_cache_size = 0

# === Temporary Tables ===
tmp_table_size = 64M
max_heap_table_size = 64M

# === Logging ===
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2
log_error = /var/log/mysql/error.log

# === Security ===
local_infile = 0
symbolic-links = 0

หลังแก้ไข Configuration ต้อง Restart Service เพื่อให้การเปลี่ยนแปลงมีผล

# ตรวจสอบ Syntax ก่อน Restart
sudo mariadbd --help --verbose 2>&1 | head -5

# Restart Service
sudo systemctl restart mariadb

# ตรวจสอบว่าทำงานปกติ
sudo systemctl status mariadb

ขั้นตอนที่ 8 — ตั้งค่า Firewall

ถ้าคุณตั้งค่า bind-address เป็น 127.0.0.1 แล้ว ฐานข้อมูลจะรับการเชื่อมต่อจาก localhost เท่านั้น แต่ถ้าต้องการให้เซิร์ฟเวอร์อื่นเชื่อมต่อได้ ต้องเปลี่ยน bind-address และตั้ง Firewall ให้อนุญาตเฉพาะ IP ที่กำหนด

# อนุญาตเฉพาะ IP ที่กำหนด
sudo ufw allow from 10.0.0.5 to any port 3306

# อนุญาตจาก Subnet
sudo ufw allow from 10.0.0.0/24 to any port 3306

# ห้ามเปิดให้ทุก IP (ไม่แนะนำ)
# sudo ufw allow 3306

# ตรวจสอบ Rules
sudo ufw status numbered

ขั้นตอนที่ 9 — ตั้งค่า SSL/TLS สำหรับ Encrypted Connection

การเข้ารหัสการเชื่อมต่อด้วย SSL/TLS มีความสำคัญเมื่อ Client และ Server อยู่คนละเครื่อง เพื่อป้องกันการดักฟังข้อมูลระหว่างทาง ระบบรองรับ TLS ในตัว เพียงสร้าง Certificate และตั้งค่าใน Configuration

# สร้างไดเรกทอรีสำหรับเก็บ Certificate
sudo mkdir -p /etc/mysql/ssl
cd /etc/mysql/ssl

# สร้าง CA Certificate
sudo openssl genrsa 4096 > ca-key.pem
sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=MariaDB-CA"

# สร้าง Server Certificate
sudo openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=MariaDB-Server"
sudo openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# กำหนดสิทธิ์ไฟล์
sudo chown mysql:mysql /etc/mysql/ssl/*
sudo chmod 600 /etc/mysql/ssl/*-key.pem
sudo chmod 644 /etc/mysql/ssl/*-cert.pem

จากนั้นเพิ่มการตั้งค่า SSL ในไฟล์ Configuration

# เพิ่มใน [mysqld] section ของ 50-server.cnf
[mysqld]
ssl_ca = /etc/mysql/ssl/ca-cert.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem
require_secure_transport = ON
# Restart เพื่อ Apply
sudo systemctl restart mariadb

# ตรวจสอบว่า SSL ทำงาน
sudo mariadb -e "SHOW VARIABLES LIKE '%ssl%';"

# ทดสอบเชื่อมต่อด้วย SSL
mariadb -u appuser -p --ssl -e "STATUS;" | grep SSL

ขั้นตอนที่ 10 — ตั้งค่า Backup อัตโนมัติ

การ Backup เป็นสิ่งจำเป็นที่ต้องตั้งค่าทันทีหลังติดตั้ง ระบบรองรับเครื่องมือ Backup หลายตัว เช่น mariadb-dump (เหมือน mysqldump) สำหรับ Logical Backup และ mariabackup สำหรับ Physical Backup

Logical Backup ด้วย mariadb-dump

# สร้างไดเรกทอรี Backup
sudo mkdir -p /backup/mariadb
sudo chown mysql:mysql /backup/mariadb

# Backup ทุกฐานข้อมูล
mariadb-dump -u backup_user -p'BackupPassword456!' --all-databases --single-transaction --routines --triggers --events | gzip > /backup/mariadb/all_db_$(date +%Y%m%d_%H%M%S).sql.gz

# Backup เฉพาะฐานข้อมูล
mariadb-dump -u backup_user -p'BackupPassword456!' --single-transaction myapp | gzip > /backup/mariadb/myapp_$(date +%Y%m%d_%H%M%S).sql.gz

Physical Backup ด้วย Mariabackup

# ติดตั้ง Mariabackup
sudo apt install -y mariadb-backup

# Full Backup
sudo mariabackup --backup --target-dir=/backup/mariadb/full_$(date +%Y%m%d) --user=backup_user --password='BackupPassword456!'

# Prepare Backup (ต้องทำก่อน Restore)
sudo mariabackup --prepare --target-dir=/backup/mariadb/full_20260407

ตั้ง Cron Job สำหรับ Backup อัตโนมัติ

# สร้าง Backup Script
sudo nano /usr/local/bin/mariadb_backup.sh
#!/bin/bash
# mariadb_backup.sh — MariaDB Automated Backup Script
set -euo pipefail

BACKUP_DIR="/backup/mariadb"
RETENTION_DAYS=30
DB_USER="backup_user"
DB_PASS="BackupPassword456!"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mariadb_backup.log"

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"; }

log "Starting backup..."

# Logical Backup
mariadb-dump -u "$DB_USER" -p"$DB_PASS" \
  --all-databases --single-transaction \
  --routines --triggers --events \
  | gzip > "${BACKUP_DIR}/all_db_${DATE}.sql.gz"

FILE_SIZE=$(stat -c%s "${BACKUP_DIR}/all_db_${DATE}.sql.gz")
log "Backup completed: all_db_${DATE}.sql.gz ($(numfmt --to=iec $FILE_SIZE))"

# ลบ Backup เก่ากว่า 30 วัน
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
DELETED=$(find "$BACKUP_DIR" -name "*.sql.gz" -mtime +${RETENTION_DAYS} | wc -l)
log "Cleaned up old backups (retention: ${RETENTION_DAYS} days)"

log "Backup process finished"
# กำหนดสิทธิ์และตั้ง Cron Job
sudo chmod +x /usr/local/bin/mariadb_backup.sh

# เพิ่ม Cron Job — Backup ทุกวันตี 2
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mariadb_backup.sh") | crontab -

ขั้นตอนที่ 11 — ตั้งค่า Log Rotation

Log ของฐานข้อมูลจะโตขึ้นเรื่อย ๆ หากไม่จัดการอาจทำให้ Disk เต็มได้ การตั้ง logrotate ช่วยหมุนเวียนไฟล์ Log อัตโนมัติ

# สร้างไฟล์ logrotate สำหรับ MariaDB
sudo nano /etc/logrotate.d/mariadb-custom
/var/log/mysql/mariadb-slow.log /var/log/mysql/error.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 640 mysql adm
    sharedscripts
    postrotate
        if [ -f /var/lib/mysql/`hostname`.pid ]; then
            /usr/bin/mariadb-admin flush-logs
        fi
    endscript
}

ตรวจสอบสถานะหลังติดตั้ง

หลังจากตั้งค่าทุกอย่างเรียบร้อยแล้ว ควรตรวจสอบทุกส่วนเพื่อให้แน่ใจว่าทำงานถูกต้อง

# 1. ตรวจสอบ Service
sudo systemctl is-active mariadb
# active

# 2. ตรวจสอบ Port
sudo ss -tlnp | grep 3306
# LISTEN 0 80 127.0.0.1:3306 0.0.0.0:*

# 3. ทดสอบ Authentication
mariadb -u appuser -p'AppSecurePassword123!' -e "SELECT VERSION(), CURRENT_USER();"

# 4. ตรวจสอบ Character Set
mariadb -u appuser -p'AppSecurePassword123!' -e "SHOW VARIABLES LIKE 'character_set%';"

# 5. ตรวจสอบ InnoDB Buffer Pool
sudo mariadb -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

# 6. ตรวจสอบ SSL Status
sudo mariadb -e "SHOW VARIABLES LIKE '%ssl%';"

# 7. ตรวจสอบ Slow Query Log
sudo mariadb -e "SHOW VARIABLES LIKE 'slow_query_log%';"

# 8. ตรวจสอบ Backup ทำงาน
sudo /usr/local/bin/mariadb_backup.sh && echo "Backup OK"

# 9. ตรวจ Error Log
sudo tail -20 /var/log/mysql/error.log

ความแตกต่างของคำสั่งระหว่าง MariaDB และ MySQL

ผู้ที่เคยใช้ MySQL มาก่อนอาจสงสัยว่าคำสั่งเหมือนกันหรือไม่ ในความเป็นจริง ระบบฐานข้อมูลตัวนี้ยังคงรองรับคำสั่ง MySQL เดิมทั้งหมด แต่มีคำสั่งใหม่เพิ่มเติม เช่น คำสั่ง mysql ยังใช้ได้เป็น Alias ของ mariadb ส่วน mysqldump ใช้ได้เหมือน mariadb-dump และ mysqladmin ใช้ได้เหมือน mariadb-admin ทำให้ Script เก่าที่เขียนไว้สำหรับ MySQL สามารถทำงานได้โดยไม่ต้องแก้ไข

สรุป

การติดตั้ง MariaDB บน Cloud VPS ไม่ใช่เรื่องยาก แต่ต้องใส่ใจเรื่องความปลอดภัยตั้งแต่แรก สิ่งสำคัญที่ต้องทำหลังติดตั้งคือตั้ง Authentication ให้ถูกต้อง สร้าง User แยกตามหน้าที่ ปรับ Configuration ให้เหมาะกับขนาดเซิร์ฟเวอร์ ตั้ง Firewall ให้เปิดเฉพาะ IP ที่จำเป็น เปิด SSL/TLS สำหรับการเชื่อมต่อจากภายนอก และตั้ง Backup อัตโนมัติ เมื่อทำตามขั้นตอนเหล่านี้แล้ว ฐานข้อมูลจะพร้อมสำหรับการพัฒนาและใช้งานจริง

แนะนำบริการ DE

การรันฐานข้อมูลนี้ใน Production ต้องการเซิร์ฟเวอร์ที่มี RAM เพียงพอสำหรับ InnoDB Buffer Pool และ SSD ที่มีความเร็วสูงสำหรับ Disk I/O Cloud VPS ของ DE รองรับการเลือก RAM และ SSD NVMe ตามความต้องการ พร้อม Root Access เต็มรูปแบบสำหรับติดตั้งจาก Official Repository และปรับแต่ง Configuration ได้อย่างอิสระ

สำหรับโปรเจกต์ที่ต้องการฐานข้อมูลร่วมกับเว็บแอปพลิเคชันและไม่ต้องการจัดการเซิร์ฟเวอร์เอง Cloud Hosting ของ DE เป็นทางเลือกที่สะดวกพร้อม Managed Infrastructure และระบบ Backup อัตโนมัติให้ใช้งานได้ทันที