Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

31. Cài đặt MySQL / MariaDB cho production

ICT

1. Vì sao cơ sở dữ liệu là thành phần “nhạy cảm” nhất?

Trong kiến trúc Web Server, Database là lớp:

  • Lưu trữ dữ liệu nghiệp vụ

  • Phục vụ mọi request động

  • Khó mở rộng nhanh nếu cấu hình sai

  • Rất dễ trở thành điểm nghẽn hoặc điểm sập

Khác với Nginx hay PHP:

  • Database không nên restart thường xuyên

  • Lỗi database thường gây ảnh hưởng diện rộng

  • Khôi phục dữ liệu tốn thời gian và rủi ro

Vì vậy:

Cài đặt Database cho production không được làm theo kiểu “mặc định cho chạy”.


2. Chọn MySQL hay MariaDB?

2.1. MariaDB – lựa chọn khuyến nghị

Trong đa số hệ thống web hiện nay, MariaDB là lựa chọn phù hợp vì:

  • Tương thích MySQL

  • Hiệu năng tốt

  • Cộng đồng mạnh

  • Được Ubuntu hỗ trợ tốt

Khuyến nghị:

Dùng MariaDB cho hệ thống mới, trừ khi có yêu cầu bắt buộc MySQL.


2.2. Khi nào cần MySQL chính thống?

Chỉ nên dùng MySQL khi:

  • Ứng dụng yêu cầu version MySQL cụ thể

  • Có ràng buộc license / vendor

  • Môi trường đồng bộ với hệ thống khác


3. Nguyên tắc cài đặt Database cho production

Trong loạt bài này, database được triển khai theo các nguyên tắc:

  1. Cài bản ổn định từ repository chính thống

  2. Không expose database ra Internet

  3. Không dùng user root cho ứng dụng

  4. Mỗi website có database và user riêng

  5. Cấu hình bảo mật ngay từ đầu

Nguyên tắc:

Database phải “im lặng” với Internet và chỉ nói chuyện với backend.


4. Cài đặt MariaDB trên Ubuntu Server

4.1. Cài đặt package

 
sudo apt update
sudo apt install mariadb-server mariadb-client -y

Sau khi cài:

  • MariaDB service sẽ tự khởi động

Kiểm tra trạng thái:

 
sudo systemctl status mariadb

Trạng thái mong đợi:

  • active (running)


5. Bảo mật MariaDB ngay sau khi cài (bắt buộc)

5.1. Chạy script bảo mật

 
sudo mysql_secure_installation

Các lựa chọn khuyến nghị:

  • Set root password → Yes

  • Remove anonymous users → Yes

  • Disallow root login remotely → Yes

  • Remove test database → Yes

  • Reload privilege tables → Yes

Nguyên tắc:

Không để database ở trạng thái mặc định trên production.


6. Kiểm tra kết nối database nội bộ

Đăng nhập MariaDB:

 
sudo mariadb

Hoặc:

 
mysql -u root -p 

Thoát:

 
EXIT;

Nếu đăng nhập được:

  • Database đã sẵn sàng ở mức cơ bản


7. Không expose database ra Internet

7.1. Kiểm tra bind-address

Mở file cấu hình:

 
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Đảm bảo có dòng:

 
bind-address = 127.0.0.1 

Điều này đảm bảo:

  • Database chỉ lắng nghe local

  • Không thể truy cập từ bên ngoài


7.2. Firewall không mở port database

Không mở:

  • 3306 ra Internet

Database chỉ nên được truy cập:

từ chính server hoặc mạng nội bộ tin cậy.


8. Tạo database và user cho website (chuẩn production)

8.1. Tạo database riêng

Ví dụ website site1:

 
CREATE DATABASE site1_db  CHARACTER SET utf8mb4  COLLATE utf8mb4_unicode_ci;

8.2. Tạo user riêng cho website

 
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'strong_password';

8.3. Cấp quyền tối thiểu

 
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost'; FLUSH PRIVILEGES;

Nguyên tắc:

Không dùng user root cho ứng dụng web.


9. Kiểm tra kết nối bằng user ứng dụng

 
mysql -u site1_user -p site1_db

Nếu kết nối thành công:

  • User và database đã sẵn sàng cho backend


10. Charset và collation – đừng bỏ qua

Khuyến nghị:

  • utf8mb4

  • utf8mb4_unicode_ci

Lý do:

  • Hỗ trợ đầy đủ Unicode

  • Tránh lỗi tiếng Việt, emoji

  • Phù hợp cho CMS hiện đại

Không dùng:

utf8 (phiên bản rút gọn, không đầy đủ)


11. Những sai lầm phổ biến khi cài database

  • Dùng user root cho website

  • Mở port 3306 ra Internet

  • Không chạy mysql_secure_installation

  • Dùng charset mặc định không kiểm soát

  • Dùng chung database cho nhiều website

Những sai lầm này:

Không gây lỗi ngay, nhưng tạo rủi ro rất lớn.


12. Checklist Database cho production

  •  Database service chạy ổn định

  •  Đã chạy mysql_secure_installation

  •  bind-address = 127.0.0.1

  •  Mỗi website có DB & user riêng

  •  Charset utf8mb4

  •  Không mở port DB ra Internet


13. Bài tiếp theo

Trong Bài 32, chúng ta sẽ đi sâu vào kết nối backend:

Quản lý user, quyền và kết nối Database cho ứng dụng

Bài này sẽ giúp:

  • Kết nối PHP ↔ Database an toàn

  • Tránh lộ thông tin DB

  • Chuẩn hóa cấu hình backend cho production