DevOps

Cài MariaDB hoặc MySQL, hardening và tạo user/schema cho app 2026

cài MariaDB hoặc MySQL

Nếu bài Cài PHP-FPM và nối Nginx với PHP bằng FastCGI giúp VPS chạy được ứng dụng PHP thật, thì bài Cài MariaDB hoặc MySQL, hardening và tạo user/schema cho app là bước tiếp theo để ứng dụng đó có nơi lưu dữ liệu bền vững.

Với stack LEMP, database không chỉ là một service cài thêm cho đủ bộ. Đây là nơi lưu user, bài viết, đơn hàng, session, cấu hình, log nghiệp vụ và gần như mọi dữ liệu quan trọng của ứng dụng. Cài xong database mà dùng luôn bằng tài khoản root, mở port 3306 ra internet, không tách user theo app, không kiểm tra quyền sau khi cấp là những lỗi rất phổ biến trên VPS tự host.

Bài này đi theo hướng production-ready tối thiểu: cài MariaDB hoặc MySQL bằng APT trên Ubuntu 24.04 LTS, hardening các mặc định nguy hiểm, tạo database riêng, tạo user riêng cho app, cấp quyền vừa đủ, kiểm tra kết nối, và chuẩn bị nền tốt cho các bài tiếp theo về deploy, SSL, backup, monitoring và troubleshooting.

1. Hiểu đúng về database server trước khi cài MariaDB hoặc MySQL

1.1. MariaDB và MySQL dùng để làm gì trong stack LEMP

Trong LEMP, chữ M thường được hiểu là MariaDB hoặc MySQL. Nginx nhận HTTP request, PHP-FPM thực thi mã PHP, còn MariaDB hoặc MySQL lưu dữ liệu quan hệ cho ứng dụng.

Ví dụ với WordPress, database sẽ lưu bài viết, trang, user, plugin settings, theme settings, comment, metadata và nhiều cấu hình nội bộ khác. Với một app PHP tự viết, database có thể lưu tài khoản, token, dữ liệu nghiệp vụ, trạng thái đơn hàng hoặc bất kỳ dữ liệu nào cần truy vấn lại.

Điểm quan trọng là database server không nên được xem như “một chỗ để app ghi tạm”. Nó là một service lõi. Khi database lỗi, ứng dụng thường không chỉ chậm mà có thể ngừng hoạt động hoàn toàn. Vì vậy, ngay từ bài đầu tiên về database, bạn nên học theo hướng an toàn: tách quyền, kiểm tra log, không mở remote bừa bãi và luôn nghĩ đến backup.

1.2. Nên chọn MariaDB hay MySQL trong năm 2026

Với phần lớn VPS tự host website PHP, blog WordPress, Laravel nhỏ, landing page hoặc app nội bộ, MariaDB từ repository mặc định của Ubuntu 24.04 LTS là lựa chọn gọn, ổn định và đủ thực dụng. MariaDB tương thích rất tốt với đa số ứng dụng PHP phổ biến, dễ cài bằng APT và thường được dùng rộng rãi trong môi trường Linux server.

MySQL phù hợp hơn nếu ứng dụng, tài liệu deploy, yêu cầu của team hoặc hệ sinh thái production của bạn chỉ định rõ MySQL. Một số phần mềm SaaS, hệ thống enterprise hoặc quy trình replication/backup cụ thể có thể yêu cầu MySQL chính thức thay vì MariaDB.

Quy tắc thực chiến rất đơn giản:

  • Nếu đang học LEMP, tự host WordPress, blog, app PHP nhỏ: bắt đầu với MariaDB.
  • Nếu app ghi rõ chỉ hỗ trợ hoặc khuyến nghị MySQL: dùng MySQL.
  • Không cài cả MariaDB và MySQL lên cùng một VPS chỉ để thử. Hai hệ thống này có thể đụng port, client package, service name và đường dẫn cấu hình.

1.3. App không nên đăng nhập database bằng root

Lỗi nhập môn nguy hiểm nhất là lấy tài khoản root của database cho thẳng vào file cấu hình app. Làm vậy có thể nhanh lúc test, nhưng rất xấu cho vận hành lâu dài.

Một app bình thường không cần quyền tạo user database, không cần quyền quản trị toàn server database, không cần quyền đọc mọi schema khác. App chỉ nên có quyền trên database của chính nó. Nếu sau này source code bị lộ, file .env bị đọc nhầm, hoặc app có lỗ hổng SQL injection, phạm vi thiệt hại sẽ nhỏ hơn nhiều nếu user database được cấp quyền tối thiểu.

2. Chuẩn bị môi trường trước khi cài database server

2.1. Bạn nên có gì trước khi bắt đầu

Trước khi làm bài này, VPS nên đã có các bước nền sau:

  • Ubuntu 24.04 LTS đã update package.
  • User admin dùng sudo, không thao tác mọi thứ bằng root trực tiếp.
  • UFW đã bật và cho phép SSH an toàn.
  • Nginx đã chạy ổn.
  • PHP-FPM đã nối được với Nginx.
  • Có ít nhất một cửa sổ SSH đang mở để tránh mất quyền thao tác giữa chừng.

Kiểm tra nhanh trạng thái nền:

lsb_release -a || cat /etc/os-release
whoami
sudo -v
sudo ufw status verbose
systemctl status nginx --no-pager
systemctl status php*-fpm --no-pager

Nếu Nginx hoặc PHP-FPM còn lỗi, nên xử lý trước khi cài database. Cài thêm service mới trong khi các service cũ chưa ổn sẽ làm troubleshooting khó hơn.

2.2. Chọn tên database, user và host ngay từ đầu

Trong bài này, ví dụ sẽ dùng:

  • Database name: appdb
  • Database user: appuser
  • Database host: localhost

Với production thật, nên đặt tên dễ nhận diện theo domain hoặc app, ví dụ:

devnook_wp
devnook_user
clientcrm_db
clientcrm_app

Không nên đặt user database là admin, root2, test hoặc tên quá chung chung. Khi VPS có nhiều site, cách đặt tên rõ ràng giúp bạn audit quyền nhanh hơn.

2.3. Mặc định nên để database chỉ nghe local

Với một VPS đơn chạy Nginx, PHP-FPM và database trên cùng máy, app nên kết nối database qua localhost. Không có lý do tốt để mở MySQL/MariaDB public ra internet trong giai đoạn này.

Port database mặc định là 3306. Nếu chỉ chạy local, port này không nên xuất hiện như một dịch vụ public cho mọi IP bên ngoài. Khi thật sự cần remote database, hãy ưu tiên private network, VPN, allowlist IP cụ thể và cấu hình TLS. Đừng mở 3306/tcp cho toàn internet chỉ vì muốn kết nối bằng GUI từ laptop.

3. Cài MariaDB trên Ubuntu 24.04 LTS

3.1. Kiểm tra package trước khi cài

Trước khi cài, hãy update danh sách package và xem APT đang chuẩn bị cài gì:

sudo apt update
apt policy mariadb-server
apt policy mysql-server

Bước này giúp bạn biết server đang lấy package từ repository nào. Với VPS production, tránh copy lệnh thêm repository ngoài khi chưa hiểu vì sao cần làm vậy. Repository mặc định của Ubuntu thường là lựa chọn an toàn nhất cho người mới vì được tích hợp tốt với hệ thống update của Ubuntu.

3.2. Cài MariaDB server

Cài MariaDB bằng APT:

sudo apt install -y mariadb-server

Sau khi cài xong, bật service và kiểm tra trạng thái:

sudo systemctl enable --now mariadb
sudo systemctl status mariadb --no-pager

Kiểm tra version và binary đang dùng:

mariadb --version
which mariadb
which mysql || true

Trên nhiều hệ thống, lệnh mysql vẫn có thể tồn tại như client tương thích, nhưng khi đã chọn MariaDB thì nên dùng rõ mariadb trong tài liệu nội bộ để tránh nhầm lẫn.

3.3. Kiểm tra database đang lắng nghe ở đâu

Kiểm tra port và socket:

sudo ss -ltnp | grep -E '3306|mysqld|mariadbd' || true
sudo ls -la /run/mysqld/

Với mô hình VPS đơn, bạn thường muốn thấy database lắng nghe ở local hoặc dùng Unix socket. Nếu thấy service lắng nghe trên 0.0.0.0:3306, nghĩa là nó đang nhận kết nối từ mọi network interface. Đây là trạng thái cần xem lại ngay trước khi đưa server ra production.

3.4. Đăng nhập MariaDB lần đầu

Trên Ubuntu, tài khoản root của MariaDB thường có thể đăng nhập qua cơ chế xác thực local bằng sudo. Thử đăng nhập:

sudo mariadb

Trong MariaDB shell, chạy vài lệnh kiểm tra:

SELECT VERSION();
SHOW DATABASES;
SELECT user, host, plugin FROM mysql.user;
EXIT;

Đừng vội tạo database cho app ở bước này. Trước hết, hãy hardening cài đặt mặc định.

4. Hardening MariaDB sau khi cài

4.1. Chạy mariadb-secure-installation

MariaDB cung cấp script mariadb-secure-installation để dọn một số mặc định không phù hợp cho production, như anonymous user, remote root login và test database.

Chạy:

sudo mariadb-secure-installation

Gợi ý trả lời cho VPS production mới cài:

Enter current password for root: nhấn Enter nếu chưa đặt
Switch to unix_socket authentication: Y nếu được hỏi và bạn muốn root local qua sudo
Change the root password: N nếu đã dùng unix_socket; Y nếu chính sách của bạn cần password root DB
Remove anonymous users: Y
Disallow root login remotely: Y
Remove test database and access to it: Y
Reload privilege tables now: Y

Điểm cần hiểu: hardening không phải là cứ đặt root password thật phức tạp là xong. Với server Linux hiện đại, root database local qua sudo và Unix socket là mô hình rất phổ biến. Quan trọng hơn là không cho root đăng nhập từ xa, không giữ anonymous user, không giữ test database và không dùng root cho ứng dụng.

4.2. Kiểm tra lại user và host sau hardening

Đăng nhập lại:

sudo mariadb

Kiểm tra danh sách user:

SELECT user, host, plugin FROM mysql.user ORDER BY user, host;

Bạn nên đặc biệt chú ý các dòng có:

  • User rỗng: thường là anonymous user, không nên còn.
  • root với host không phải localhost: cần xem lại.
  • User lạ không nhớ đã tạo: cần audit trước khi tiếp tục.

Thoát MariaDB shell:

EXIT;

4.3. Kiểm tra firewall và port 3306

Database local không cần mở port 3306 trên UFW. Kiểm tra:

sudo ufw status verbose
sudo ss -ltnp | grep 3306 || true

Nếu UFW đang có rule kiểu này, hãy xem lại thật kỹ:

3306/tcp ALLOW Anywhere

Với hầu hết website PHP chạy cùng VPS, rule đó không cần thiết. Không mở port database ra internet là một trong những hardening hiệu quả nhất.

5. Tạo database, user và schema cho app

5.1. Tạo database dùng utf8mb4

Đăng nhập MariaDB:

sudo mariadb

Tạo database:

CREATE DATABASE appdb
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

utf8mb4 là lựa chọn nên dùng cho ứng dụng web hiện đại vì hỗ trợ đầy đủ Unicode, bao gồm tiếng Việt, emoji và nhiều ký tự đặc biệt. Đừng dùng utf8 cũ theo thói quen nếu bạn không có lý do tương thích thật rõ.

Kiểm tra database vừa tạo:

SHOW CREATE DATABASE appdb\G

5.2. Tạo user riêng cho app

Tạo user chỉ được đăng nhập từ local:

CREATE USER 'appuser'@'localhost'
  IDENTIFIED BY 'CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD';

Mật khẩu nên dài, ngẫu nhiên và chỉ lưu trong secret manager hoặc file môi trường có quyền chặt chẽ. Không dùng lại mật khẩu SSH, mật khẩu WordPress admin hoặc mật khẩu email.

Ví dụ tạo mật khẩu ngẫu nhiên từ Linux shell:

openssl rand -base64 32

Sau đó thay chuỗi CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD bằng mật khẩu thật khi chạy SQL.

5.3. Cấp quyền tối thiểu cho app

Với app PHP thông thường hoặc WordPress, user app thường cần quyền đọc, ghi, cập nhật, xóa dữ liệu và thay đổi cấu trúc bảng trong lúc cài đặt, update hoặc chạy migration.

Cấp quyền ở phạm vi đúng database:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP
ON appdb.*
TO 'appuser'@'localhost';

Kiểm tra quyền:

SHOW GRANTS FOR 'appuser'@'localhost';

Reload privilege table nếu cần:

FLUSH PRIVILEGES;

Thoát:

EXIT;

Điểm quan trọng nằm ở dòng ON appdb.*. User này chỉ có quyền trên database appdb, không phải toàn bộ server database. Không dùng *.* cho app trừ khi bạn đang tạo tài khoản quản trị có mục đích rất rõ.

5.4. Test đăng nhập bằng user app

Đăng nhập bằng user vừa tạo:

mariadb -u appuser -p appdb

Nhập mật khẩu, rồi chạy:

SELECT DATABASE();
SELECT USER();
CREATE TABLE healthcheck (
  id INT AUTO_INCREMENT PRIMARY KEY,
  message VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO healthcheck (message) VALUES ('database ok');
SELECT * FROM healthcheck;
DROP TABLE healthcheck;
EXIT;

Nếu các lệnh trên chạy thành công, user app có đủ quyền cơ bản để ứng dụng cài đặt và vận hành. Nếu lỗi Access denied, hãy quay lại kiểm tra CREATE USER, host localhost, mật khẩu và SHOW GRANTS.

6. Kết nối app PHP với MariaDB

6.1. Cài extension PHP cho MySQL/MariaDB

PHP cần extension để nói chuyện với MySQL/MariaDB. Nếu đã cài từ bài PHP-FPM trước, có thể extension này đã có. Kiểm tra:

php -m | grep -i mysql || true

Nếu chưa có, cài:

sudo apt install -y php-mysql
sudo systemctl restart php*-fpm

Kiểm tra lại:

php -m | grep -i mysql
sudo journalctl -u php*-fpm --since "10 minutes ago"

6.2. Ví dụ cấu hình môi trường cho app

Với nhiều app PHP hiện đại, cấu hình database nằm trong file .env. Ví dụ:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=appdb
DB_USERNAME=appuser
DB_PASSWORD=CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD

Với WordPress, thông tin tương tự nằm trong wp-config.php:

define('DB_NAME', 'appdb');
define('DB_USER', 'appuser');
define('DB_PASSWORD', 'CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');

Không commit file .env hoặc file chứa mật khẩu database lên Git repository public. Nếu app deploy bằng Git, hãy dùng .env.example cho mẫu cấu hình và giữ file thật trên server.

6.3. Test nhanh bằng PHP PDO

Có thể tạo một file test tạm thời để kiểm tra PHP-FPM kết nối được MariaDB:

sudo nano /var/www/example.com/public/db-test.php

Nội dung:

<?php
$dsn = 'mysql:host=127.0.0.1;dbname=appdb;charset=utf8mb4';
$user = 'appuser';
$pass = 'CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD';

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);

    $row = $pdo->query('SELECT DATABASE() AS db, VERSION() AS version')->fetch();

    header('Content-Type: text/plain; charset=utf-8');
    echo "Database OK\n";
    echo "DB: " . $row['db'] . "\n";
    echo "Version: " . $row['version'] . "\n";
} catch (Throwable $e) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Database connection failed\n";
}

Test:

curl -i http://example.com/db-test.php

Nếu thấy Database OK, đường đi Nginx → PHP-FPM → MariaDB đã hoạt động. Sau khi test xong, xóa file ngay:

sudo rm /var/www/example.com/public/db-test.php

Không để file test database trên production. Dù file không in mật khẩu, nó vẫn tiết lộ thông tin môi trường không cần thiết.

7. Khi nào nên cài MySQL thay vì MariaDB

7.1. Cài MySQL bằng APT

Nếu app yêu cầu MySQL chính thức, hãy cài MySQL thay vì MariaDB trên một server sạch:

sudo apt update
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo systemctl status mysql --no-pager

Kiểm tra version:

mysql --version

Đăng nhập:

sudo mysql

Các bước tạo database, tạo user và cấp quyền ở mức cơ bản gần giống MariaDB:

CREATE DATABASE appdb
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

CREATE USER 'appuser'@'localhost'
  IDENTIFIED BY 'CHANGE_THIS_TO_A_LONG_RANDOM_PASSWORD';

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP
ON appdb.*
TO 'appuser'@'localhost';

SHOW GRANTS FOR 'appuser'@'localhost';
EXIT;

7.2. Không chuyển qua lại tùy hứng trên production

MariaDB và MySQL có mức tương thích cao ở nhiều use case phổ thông, nhưng không nên xem chúng là một thứ giống hệt nhau trong mọi tình huống. Khi dữ liệu đã chạy thật, việc chuyển engine cần backup, restore drill, kiểm thử app và kế hoạch rollback.

Nếu mới học hoặc dựng VPS lần đầu, hãy chọn một hướng và đi hết bài. Đừng cài MariaDB hôm nay, xóa đi cài MySQL ngày mai, rồi lại import database cũ mà không có backup rõ ràng.

8. Kiểm tra vận hành sau khi cấu hình

8.1. Kiểm tra service

Với MariaDB:

sudo systemctl status mariadb --no-pager
sudo journalctl -u mariadb --since "1 hour ago"

Với MySQL:

sudo systemctl status mysql --no-pager
sudo journalctl -u mysql --since "1 hour ago"

Không chỉ nhìn dòng active (running). Hãy xem journal để biết service có warning, crash, restart loop hoặc lỗi permission nào không.

8.2. Kiểm tra port và process

sudo ss -ltnp | grep 3306 || true
ps aux | grep -E 'mariadbd|mysqld' | grep -v grep

Nếu database chỉ dùng local, hãy đảm bảo nó không vô tình lắng nghe public interface. Nếu thật sự cần remote access, hãy cấu hình có kiểm soát thay vì mở toàn internet.

8.3. Kiểm tra dung lượng disk

Database sẽ lớn dần theo thời gian. Kiểm tra dung lượng hiện tại:

df -h
sudo du -sh /var/lib/mysql
sudo du -sh /var/log/mysql 2>/dev/null || true

Disk đầy là một trong những nguyên nhân làm database lỗi rất khó chịu. Khi disk chạm 100%, app có thể không ghi được dữ liệu, database có thể crash, backup có thể fail và log cũng không ghi thêm được.

8.4. Kiểm tra backup tối thiểu

Ngay cả ở bài B4, bạn cũng nên biết lệnh backup logic cơ bản:

mysqldump -u appuser -p appdb > appdb-$(date +%F).sql

Kiểm tra file:

ls -lh appdb-$(date +%F).sql
head -n 20 appdb-$(date +%F).sql

Đây chưa phải chiến lược backup hoàn chỉnh. Bài backup riêng sẽ đi sâu hơn về snapshot, auto backup, Borg/Restic và restore drill. Nhưng ngay từ lúc tạo database, bạn nên nhớ: database không có backup thì chưa được xem là an toàn.

9. Lỗi thường gặp khi cài MariaDB hoặc MySQL

9.1. Access denied for user

Lỗi này thường do sai mật khẩu, sai host hoặc user chưa được cấp quyền đúng database.

Kiểm tra bằng root local:

sudo mariadb

Rồi chạy:

SELECT user, host FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'appuser'@'localhost';

Lưu ý rằng 'appuser'@'localhost''appuser'@'%' là hai account khác nhau. Cùng username nhưng khác host vẫn là hai định danh khác nhau trong MySQL/MariaDB.

9.2. Unknown database

Lỗi Unknown database 'appdb' thường có nghĩa là database chưa được tạo, tạo sai tên hoặc app đang đọc nhầm file cấu hình.

Kiểm tra:

sudo mariadb -e "SHOW DATABASES;"

Với app PHP, hãy kiểm tra lại .env, wp-config.php hoặc file config tương ứng. Sau khi sửa .env, một số framework cần clear config cache hoặc restart PHP-FPM.

9.3. Connection refused

Connection refused thường là dấu hiệu service database chưa chạy, app kết nối sai host/port, hoặc database không lắng nghe ở địa chỉ đó.

Kiểm tra:

sudo systemctl status mariadb --no-pager
sudo ss -ltnp | grep 3306 || true
sudo journalctl -u mariadb --since "30 minutes ago"

Nếu app và database cùng máy, hãy ưu tiên localhost hoặc 127.0.0.1. Nếu app ở máy khác, cần cấu hình bind address, firewall, user host và bảo mật network cẩn thận.

9.4. PHP không có driver MySQL

Nếu app báo lỗi kiểu could not find driver, thường là PHP thiếu extension.

Cài và restart PHP-FPM:

sudo apt install -y php-mysql
sudo systemctl restart php*-fpm
php -m | grep -i mysql

9.5. Sai charset khiến lỗi tiếng Việt hoặc emoji

Nếu database, table hoặc connection không dùng utf8mb4, bạn có thể gặp lỗi ký tự tiếng Việt, emoji bị mất hoặc dữ liệu hiển thị thành ký tự lạ.

Kiểm tra database:

sudo mariadb -e "SHOW CREATE DATABASE appdb\G"

Với app mới, hãy tạo database bằng utf8mb4 ngay từ đầu. Với database cũ đã có dữ liệu, đừng convert bừa trên production. Hãy backup, test restore và kiểm tra dữ liệu trước.

10. Checklist thực hành

10.1. Trước khi cài database

  • VPS đang chạy Ubuntu 24.04 LTS ổn định.
  • Nginx và PHP-FPM không còn lỗi nền.
  • Đã chọn MariaDB hoặc MySQL, không cài cả hai cùng lúc.
  • Đã có tên database và user app rõ ràng.
  • Đã xác định app dùng database local hay remote.

10.2. Sau khi cài database

  • Service mariadb hoặc mysql đang active.
  • Đã chạy hardening bằng mariadb-secure-installation hoặc quy trình tương đương.
  • Không còn anonymous user.
  • Root database không đăng nhập remote.
  • Port 3306 không bị mở public nếu không cần.

10.3. Sau khi tạo user/schema cho app

  • Database dùng utf8mb4.
  • App có user riêng, không dùng root.
  • User chỉ có quyền trên database của app.
  • Đã kiểm tra bằng SHOW GRANTS.
  • Đã test đăng nhập bằng user app.
  • Đã test PHP kết nối database nếu app chạy bằng PHP.
  • Đã xóa file test sau khi kiểm tra.

11. FAQ

11.1. Nên dùng MariaDB hay MySQL cho WordPress?

Với WordPress tự host trên VPS Ubuntu 24.04 LTS, MariaDB là lựa chọn rất phổ biến và phù hợp cho đa số trường hợp. Nếu môi trường của bạn yêu cầu MySQL chính thức hoặc cần đồng bộ với hệ thống đang chạy MySQL, hãy dùng MySQL. Điều quan trọng hơn là không dùng root cho WordPress và luôn có backup.

11.2. Có nên mở port 3306 để kết nối bằng app trên máy cá nhân không?

Không nên mở public chỉ để tiện quản trị. Nếu cần dùng GUI như TablePlus, DBeaver hoặc MySQL Workbench, hãy ưu tiên SSH tunnel. Cách đó giúp database vẫn chỉ nghe local trên server, còn kết nối quản trị đi qua SSH đã được bảo vệ.

11.3. Có cần tạo một user database riêng cho mỗi website không?

Có. Nếu VPS host nhiều website, mỗi website nên có database và user riêng. Cách này giúp giới hạn phạm vi rủi ro. Một site bị lỗi hoặc lộ credential sẽ không tự động có quyền đọc database của site khác.

11.4. Có nên cấp ALL PRIVILEGES cho user app không?

Với app nhỏ hoặc môi trường học, nhiều tutorial dùng GRANT ALL PRIVILEGES ON appdb.* cho nhanh. Tuy nhiên, production nên cấp quyền theo nhu cầu. Với app cần migration, bộ quyền như SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP thường thực tế hơn so với cấp toàn bộ mọi quyền.

11.5. Có cần chạy FLUSH PRIVILEGES sau GRANT không?

Trong nhiều trường hợp hiện đại, quyền từ GRANT có hiệu lực ngay. Tuy vậy, chạy FLUSH PRIVILEGES sau khi thao tác user/privilege vẫn là thói quen dễ hiểu cho người mới và không gây hại trong kịch bản cơ bản. Điều quan trọng hơn là phải kiểm tra lại bằng SHOW GRANTS.

11.6. Sau bài này nên học tiếp gì?

Sau khi database đã chạy, lộ trình hợp lý là hoàn thiện LEMP bằng một demo app thật, sau đó bật HTTPS với Let’s Encrypt, rồi mới đi sâu vào backup, monitoring, logging và tuning hiệu năng. Database là nơi giữ dữ liệu, nên các bài backup và restore sau này sẽ đặc biệt quan trọng.

12. Kết luận

Cài MariaDB hoặc MySQL trên Ubuntu 24.04 LTS không khó. Phần khó hơn là cài sao cho sạch, an toàn và dễ vận hành về sau.

Hãy nhớ bốn nguyên tắc chính của bài này. Một là chọn MariaDB hoặc MySQL theo nhu cầu thật, không cài lẫn lộn. Hai là hardening ngay sau khi cài, đặc biệt là anonymous user, remote root login và port 3306. Ba là app luôn dùng database user riêng, không dùng root. Bốn là mọi thay đổi quan trọng đều phải kiểm tra lại bằng service status, log, SHOW GRANTS và một kết nối thật từ app.

Khi database đã được dựng đúng, stack LEMP của bạn không còn chỉ là Nginx phục vụ file và PHP xử lý script nữa. Nó đã có đủ nền để chạy một ứng dụng web hoàn chỉnh, có dữ liệu thật, có quyền tách biệt và sẵn sàng bước sang giai đoạn deploy, HTTPS, backup và vận hành production.

Đừng bỏ lỡ

Theo dõi bản tin mới nhất tại đây

Chào bạn 👋
Rất vui được làm quen.

Đăng ký để nhận nội dung hấp dẫn mỗi tháng qua email.

Bằng việc đăng ký, bạn đồng ý với Chính sách bảo mật của DevNook.

Tác giả

Tuấn Lê

Tại DevNook, mình chia sẻ kiến thức thực chiến, kinh nghiệm làm sản phẩm và những công cụ hữu ích giúp bạn làm việc hiệu quả hơn mỗi ngày.