Cài Đặt & Quản Lý Database Trên VPS 2026 - MySQL, PostgreSQL, MongoDB, Tối Ưu & Backup Tự Động
1. Tại Sao Nên Tự Quản Lý Database Trên VPS?
Dùng managed database như AWS RDS hay DigitalOcean Managed DB thì tiện — nhưng chi phí có thể gấp 5-10 lần so với tự chạy trên VPS. Một VPS 4GB RAM chạy PostgreSQL tự quản chỉ ~200K/tháng, trong khi managed database cùng cấu hình có giá $15-30/tháng (~375K-750K).
Hơn nữa, tự quản lý database cho bạn:
- Toàn quyền kiểm soát: Cấu hình tùy chỉnh mọi tham số, không bị giới hạn bởi plan
- Học được kỹ năng thực tế: Hiểu sâu về database engine, có giá trị lớn trong công việc
- Không vendor lock-in: Dễ dàng migrate giữa các provider
- Tiết kiệm dài hạn: Với dự án chạy >6 tháng, tự quản tiết kiệm 60-80%
2. Chọn Database Engine Phù Hợp
| Database | Loại | Phù Hợp Cho | RAM Tối Thiểu | Độ Khó Cài |
|---|---|---|---|---|
| MySQL 8.0 | SQL / Relational | Web app truyền thống, WordPress, Laravel, CMS | 512MB | ⭐ Dễ |
| MariaDB | SQL / Relational | Thay thế MySQL, hiệu năng tốt hơn, open source hơn | 512MB | ⭐ Dễ |
| PostgreSQL | SQL / Relational | App phức tạp, GIS, time-series, JSON query, phân tích dữ liệu | 1GB | ⭐⭐ Trung bình |
| MongoDB | NoSQL / Document | App real-time, IoT, schema linh hoạt, dữ liệu phi cấu trúc | 1GB | ⭐⭐ Trung bình |
| Redis | In-Memory / Key-Value | Cache, session store, queue, pub/sub, rate limiting | 256MB | ⭐ Dễ |
| SQLite | SQL / Embedded | App nhỏ, mobile, single-user, testing | 0 (embedded) | ⭐ Dễ |
3. Cài Đặt MySQL 8.0 Trên Ubuntu 22.04
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài MySQL Server
sudo apt install mysql-server -y
# Chạy secure installation
sudo mysql_secure_installation
# Trả lời: Y (validate password), 2 (STRONG), Y (đổi root password)
# Y (xóa anonymous users), Y (cấm root remote login)
# Y (xóa test database), Y (reload privileges)
# Kiểm tra trạng thái
sudo systemctl status mysql
# Đăng nhập
sudo mysql
# Tạo database và user cho ứng dụng
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'StrongPass2026!';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3.1. Cấu Hình MySQL Cho Hiệu Năng
# Chỉnh sửa /etc/mysql/mysql.conf.d/mysqld.cnf
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Thêm/sửa các dòng sau:
[mysqld]
# InnoDB buffer pool - 70% RAM cho VPS chạy MySQL
innodb_buffer_pool_size = 2G # VPS 4GB RAM
innodb_buffer_pool_instances = 4
# Log file size - tăng cho write-heavy workload
innodb_log_file_size = 512M
# Query cache (chỉ MySQL <8.0, tắt từ 8.0+)
# query_cache_type = 0
# Connection pool
max_connections = 200
max_connect_errors = 100
# Slow query log - debug query chậm
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# Character set
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# Binary log (cần cho replication)
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
# Restart MySQL
sudo systemctl restart mysql
innodb_buffer_pool_size là tham số quan trọng nhất. Đặt = 70-80% RAM nếu VPS chạy chủ yếu MySQL. Sai tham số này là nguyên nhân #1 gây chậm database. Sau khi thay đổi, theo dõi bằng SHOW ENGINE INNODB STATUS\G.
4. Cài Đặt PostgreSQL 16 Trên Ubuntu 22.04
# Thêm PostgreSQL repository
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
# Cài PostgreSQL 16
sudo apt update
sudo apt install postgresql-16 postgresql-client-16 -y
# Khởi động
sudo systemctl enable postgresql
sudo systemctl start postgresql
# Tạo user và database
sudo -u postgres psql
CREATE USER myapp WITH PASSWORD 'StrongPass2026!';
CREATE DATABASE myapp OWNER myapp;
GRANT ALL PRIVILEGES ON DATABASE myapp TO myapp;
# Cho phép kết nối từ xa (nếu cần)
# Sửa /etc/postgresql/16/main/postgresql.conf
# listen_addresses = '*'
# Sửa /etc/postgresql/16/main/pg_hba.conf
# host all all 0.0.0.0/0 scram-sha-256
sudo systemctl restart postgresql
\q
4.1. Tối Ưu PostgreSQL
# /etc/postgresql/16/main/postgresql.conf
# Sử dụng pgtune.leopard.in.ua để tính toán chính xác theo RAM
shared_buffers = 1GB # 25% RAM (VPS 4GB)
effective_cache_size = 3GB # 75% RAM
work_mem = 16MB # Cho query sort/hash
maintenance_work_mem = 256MB # Cho VACUUM, CREATE INDEX
wal_buffers = 16MB
checkpoint_completion_target = 0.9
random_page_cost = 1.1 # SSD/NVMe
effective_io_concurrency = 200 # NVMe
# Autovacuum - cực kỳ quan trọng!
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = 1min
autovacuum_vacuum_scale_factor = 0.05
# Logging
log_min_duration_statement = 1000 # Log query >1s
log_checkpoints = on
log_connections = on
sudo systemctl restart postgresql
5. Cài Đặt MongoDB 7 Trên Ubuntu 22.04
# Import MongoDB GPG key
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
# Thêm repo
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] http://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
# Cài MongoDB
sudo apt update
sudo apt install mongodb-org -y
# Khởi động
sudo systemctl enable mongod
sudo systemctl start mongod
# Kết nối
mongosh
# Tạo admin user
use admin
db.createUser({
user: "admin",
pwd: "StrongAdminPass2026!",
roles: [{ role: "root", db: "admin" }]
})
# Tạo database và user cho ứng dụng
use myapp
db.createUser({
user: "myapp",
pwd: "StrongAppPass2026!",
roles: [{ role: "readWrite", db: "myapp" }]
})
# Bật authentication trong /etc/mongod.conf
# security:
# authorization: enabled
sudo systemctl restart mongod
6. Chiến Lược Backup Database Tự Động
"Không backup là tự sát" — câu này đúng gấp đôi với database. Một lệnh DROP DATABASE sai, một cuộc tấn công ransomware, hoặc đơn giản là ổ cứng die — và toàn bộ data của bạn biến mất vĩnh viễn.
6.1. Backup MySQL/MariaDB
# Tạo script backup hàng ngày
cat > /usr/local/bin/backup-mysql.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=14
mkdir -p $BACKUP_DIR
# Backup từng database
mysql -e "SHOW DATABASES;" | grep -v "Database\|information_schema\|performance_schema\|sys" | while read db; do
mysqldump --single-transaction --routines --triggers --events \
$db | gzip > "$BACKUP_DIR/${db}_${DATE}.sql.gz"
done
# Xóa backup cũ >14 ngày
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $(date)"
EOF
chmod +x /usr/local/bin/backup-mysql.sh
# Cron chạy 2AM mỗi ngày
echo "0 2 * * * /usr/local/bin/backup-mysql.sh >> /var/log/mysql-backup.log 2>&1" | crontab -
6.2. Backup PostgreSQL
cat > /usr/local/bin/backup-pgsql.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=14
mkdir -p $BACKUP_DIR
# Backup toàn bộ cluster
sudo -u postgres pg_dumpall | gzip > "$BACKUP_DIR/full_${DATE}.sql.gz"
# Hoặc backup từng database
for db in $(sudo -u postgres psql -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;"); do
sudo -u postgres pg_dump -Fc $db > "$BACKUP_DIR/${db}_${DATE}.dump"
done
find $BACKUP_DIR -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $(date)"
EOF
6.3. Backup MongoDB
cat > /usr/local/bin/backup-mongo.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backups/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=14
mkdir -p $BACKUP_DIR
mongodump --username admin --password "StrongAdminPass2026!" \
--out "$BACKUP_DIR/$DATE" --gzip
tar -czf "$BACKUP_DIR/mongo_${DATE}.tar.gz" -C "$BACKUP_DIR" "$DATE"
rm -rf "$BACKUP_DIR/$DATE"
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $(date)"
EOF
6.4. Off-Site Backup (Cực Kỳ Quan Trọng!)
# Sync backup lên Google Drive bằng rclone
# Cài rclone: curl https://rclone.org/install.sh | sudo bash
# Cấu hình: rclone config
# Script sync
cat > /usr/local/bin/sync-backup.sh << 'EOF'
#!/bin/bash
rclone sync /backups gdrive:db-backups \
--max-age 30d \
--progress \
--log-file=/var/log/rclone-sync.log
echo "Sync completed: $(date)"
EOF
# Cron sync sau backup 1 tiếng
# 0 3 * * * /usr/local/bin/sync-backup.sh
7. Monitoring Database
Theo dõi sức khỏe database để phát hiện vấn đề trước khi user phàn nàn:
7.1. Netdata — Real-Time Monitoring
Cài Netdata (xem bài cài Netdata trên VPS) để có dashboard real-time:
- Queries/second, connections, locks
- InnoDB buffer pool hit rate
- Slow queries count
- Disk I/O cho database files
- Alert tự động khi query chạy >5s
7.2. PMM (Percona Monitoring & Management)
Giải pháp monitoring chuyên sâu cho MySQL/PostgreSQL/MongoDB:
# Cài PMM Client trên VPS database
curl -fsSL https://www.percona.com/get/pmm | sudo bash
sudo pmm-admin config --server-insecure-tls --server-url=https://admin:admin@pmm-server-url
# Thêm MySQL vào monitoring
sudo pmm-admin add mysql --username=pmm --password=pmm_pass --query-source=perfschema
# Thêm PostgreSQL
sudo pmm-admin add postgresql --username=pmm --password=pmm_pass
# Thêm MongoDB
sudo pmm-admin add mongodb --username=pmm --password=pmm_pass
8. Replication & High Availability Cơ Bản
Với ngân sách hạn chế, bạn có thể setup basic replication bằng 2 VPS:
8.1. MySQL Replication (Master-Slave)
# Trên Master (/etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = myapp
# Tạo replication user trên Master
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass2026!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
# Trên Slave
[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
read_only = 1
# Bắt đầu replication
CHANGE MASTER TO
MASTER_HOST='master-ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass2026!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1234;
START SLAVE;
SHOW SLAVE STATUS\G
9. Bảng So Sánh Chi Phí: Tự Quản vs Managed
| Giải Pháp | MySQL 4GB RAM | PostgreSQL 4GB RAM | MongoDB 4GB RAM | Backup | Tổng/Năm |
|---|---|---|---|---|---|
| TrumVPS tự quản | - | - | - | - | ~2.4M |
| TrumVPS (200K/tháng) | VPS 4GB RAM chạy database + backup script | - | |||
| AWS RDS (db.t3.medium) | $57/tháng | $57/tháng | - | $5/tháng | ~18.6M |
| DigitalOcean Managed DB | $15/tháng | $15/tháng | $30/tháng | Free | ~4.5-9M |
| MongoDB Atlas (M10) | - | - | $0.08/giờ | Free | ~17.5M |
10. Câu Hỏi Thường Gặp
VPS 40K có đủ chạy MySQL cho WordPress không?
Có, hoàn toàn đủ. WordPress + MySQL chạy tốt trên VPS 2GB RAM nếu bạn tối ưu MySQL buffer pool ~512MB và dùng caching plugin. Khoảng 5.000-10.000 visit/ngày không vấn đề.
Nên chọn MySQL hay PostgreSQL?
MySQL nếu bạn làm web app truyền thống, WordPress, Laravel, hoặc cần replication đơn giản. PostgreSQL nếu bạn cần JSON query phức tạp, full-text search tốt hơn, GIS/spatial data, hoặc app phân tích dữ liệu. Xu hướng 2026: PostgreSQL đang dẫn đầu về tính năng và adoption mới.
Bao lâu nên backup database một lần?
Tối thiểu 1 lần/ngày cho production. Với app có nhiều transaction (e-commerce, trading), backup mỗi 4-6 tiếng + enable binary log/WAL archiving cho point-in-time recovery. Luôn test restore ít nhất 1 lần/tháng — backup mà không test restore là vô nghĩa.
Làm sao biết database bị tấn công?
Theo dõi các dấu hiệu: CPU/RAM đột ngột tăng cao, query chậm bất thường, connections tăng vọt, file cấu hình bị thay đổi, port mở ra ngoài không cần thiết. Dùng fail2ban chặn brute-force, firewall giới hạn IP được phép kết nối vào port database.
Thuê VPS Chạy Database Ngay!
VPS NVMe từ 40.000đ/tháng — cấu hình mạnh mẽ, cài database 5 phút.
Thuê VPS Database Ngay →