Cài đặt và Cấu hình MySQL 8 trên Ubuntu: Hướng Dẫn Chi Tiết Từ A-Z

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

Suốt hơn nửa năm qua, MySQL 8 đã trở thành xương sống cho nhiều ứng dụng web mình đang phát triển và duy trì trong môi trường production. Từ những hệ thống nhỏ đến các dự án có lượng người dùng lớn, MySQL luôn là lựa chọn hàng đầu cho việc lưu trữ và quản lý dữ liệu quan hệ. Nó không chỉ mạnh mẽ, đáng tin cậy mà còn liên tục được cải tiến với nhiều tính năng mới, giúp nâng cao hiệu suất đáng kể.

Nếu bạn là lập trình viên, kỹ sư DevOps hay quản trị hệ thống đang cần thiết lập một máy chủ cơ sở dữ liệu trên Ubuntu, việc nắm vững cách cài đặt và cấu hình MySQL 8 là một kỹ năng nền tảng thiết yếu. Mình tin rằng sau bài viết này, bạn sẽ tự tin triển khai MySQL 8 cho các dự án của mình một cách an toàn và hiệu quả.

Khái niệm cốt lõi: MySQL và RDBMS là gì?

Trước khi bắt tay vào thực hành, chúng ta sẽ tìm hiểu MySQL là gì và cách nó hoạt động. Về cơ bản, MySQL là một Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS – Relational Database Management System) mã nguồn mở, sử dụng ngôn ngữ SQL (Structured Query Language) để quản lý dữ liệu.

Cốt lõi của RDBMS là việc tổ chức dữ liệu thành các bảng (tables) có quan hệ với nhau qua các khóa (keys). Chẳng hạn, bạn có thể có một bảng users chứa thông tin người dùng và một bảng posts lưu trữ các bài viết. Một cột trong bảng posts sẽ liên kết với ID người dùng trong bảng users. Mô hình này giúp dữ liệu nhất quán và dễ quản lý.

MySQL hoạt động theo mô hình client-server. Điều này có nghĩa là một chương trình máy chủ (server) chạy trên hệ thống của bạn để quản lý cơ sở dữ liệu. Các chương trình ứng dụng (clients) sẽ kết nối đến máy chủ này, gửi các câu lệnh SQL và nhận kết quả. Ubuntu, với sự ổn định và cộng đồng hỗ trợ lớn, là nền tảng lý tưởng để chạy MySQL server.

Thực hành: Cài đặt và Cấu hình MySQL 8 trên Ubuntu

Đây là phần quan trọng nhất, nơi mình sẽ hướng dẫn bạn từng bước để đưa MySQL 8 vào hoạt động trên hệ thống Ubuntu. Mình giả định bạn đang dùng Ubuntu Server 20.04 LTS hoặc 22.04 LTS, nhưng các bước này cũng tương tự với các phiên bản Ubuntu gần đây.

Bước 1: Cập nhật hệ thống

Luôn bắt đầu bằng việc cập nhật hệ thống. Đây là bước quan trọng khi triển khai bất kỳ dịch vụ nào, đảm bảo bạn có các gói phần mềm mới nhất và các bản vá bảo mật quan trọng.


sudo apt update
sudo apt upgrade -y

Bước 2: Cài đặt MySQL Server

Sau khi hệ thống được cập nhật, chúng ta có thể tiến hành cài đặt gói MySQL server. Ubuntu thường có sẵn MySQL 8 trong kho lưu trữ chính thức của mình.


sudo apt install mysql-server -y

Trong quá trình cài đặt, có thể bạn sẽ được yêu cầu thiết lập mật khẩu cho người dùng root của MySQL. Hãy chọn một mật khẩu mạnh và ghi nhớ cẩn thận. Nếu không được hỏi, bạn sẽ thiết lập nó ở bước cấu hình bảo mật sau.

Bước 3: Cấu hình bảo mật ban đầu với mysql_secure_installation

Bước này cực kỳ quan trọng để bảo vệ máy chủ MySQL của bạn khỏi các truy cập trái phép. Công cụ mysql_secure_installation sẽ hướng dẫn bạn qua một loạt câu hỏi để tăng cường bảo mật.


sudo mysql_secure_installation

Công cụ sẽ hỏi bạn những điều sau:

  • VALIDATE PASSWORD COMPONENT? (Thành phần kiểm tra độ mạnh mật khẩu). Mình thường chọn Y để đảm bảo mật khẩu được đặt đủ mạnh.

    • Bạn sẽ được chọn mức độ mạnh của mật khẩu (Low, Medium, Strong). Mình khuyên dùng Medium hoặc Strong.
  • Change the password for root? (Đổi mật khẩu cho người dùng root?). Nếu bạn đã đặt mật khẩu ở bước cài đặt trước đó, hãy chọn N. Nếu chưa, chọn Y và đặt một mật khẩu mạnh.

  • Remove anonymous users? (Xóa người dùng ẩn danh?). Luôn chọn Y. Người dùng ẩn danh có thể truy cập cơ sở dữ liệu mà không cần mật khẩu, điều này rất nguy hiểm.

  • Disallow root login remotely? (Không cho phép người dùng root đăng nhập từ xa?). Mình luôn chọn Y. Việc hạn chế root chỉ được truy cập từ localhost giúp ngăn chặn các cuộc tấn công brute-force vào tài khoản root từ bên ngoài.

  • Remove test database and access to it? (Xóa cơ sở dữ liệu test và quyền truy cập?). Chọn Y. Cơ sở dữ liệu test không cần thiết cho môi trường production và có thể bị lạm dụng.

  • Reload privilege tables now? (Tải lại bảng đặc quyền ngay bây giờ?). Luôn chọn Y để các thay đổi bảo mật có hiệu lực ngay lập tức.

Bước 4: Kiểm tra trạng thái MySQL Server

Sau khi cài đặt và cấu hình bảo mật, hãy đảm bảo rằng MySQL server đang chạy ổn định. Bạn có thể kiểm tra trạng thái bằng lệnh:


systemctl status mysql

Nếu thấy trạng thái active (running) là tốt. Trường hợp không chạy, bạn có thể khởi động lại bằng lệnh:


sudo systemctl start mysql

Và kích hoạt để tự động khởi động cùng hệ thống:


sudo systemctl enable mysql


Bước 5: Đăng nhập vào MySQL và kiểm tra phiên bản

Bây giờ bạn có thể đăng nhập vào MySQL client với người dùng root để kiểm tra.


sudo mysql -u root -p

Nhập mật khẩu root đã thiết lập. Sau khi đăng nhập thành công, bạn sẽ thấy dấu nhắc mysql>. Để kiểm tra phiên bản, chạy câu lệnh:


SELECT VERSION();

Output sẽ hiển thị phiên bản MySQL, ví dụ: 8.0.36.

Bước 6: Tạo người dùng và cơ sở dữ liệu mới cho ứng dụng

Trong môi trường production, mình không bao giờ dùng tài khoản root để kết nối từ các ứng dụng. Điều này tiềm ẩn rất nhiều rủi ro. Thay vào đó, bạn nên tạo một cơ sở dữ liệu và một người dùng riêng biệt với các quyền hạn cần thiết. Đây là cách làm an toàn hơn.


-- Tạo một cơ sở dữ liệu mới
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Tạo người dùng mới và chỉ cho phép truy cập từ localhost
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'MatKhauCucManhCuaBan!';

-- Cấp quyền cho người dùng mới trên cơ sở dữ liệu myapp_db
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';

-- Áp dụng các thay đổi về quyền
FLUSH PRIVILEGES;

Lưu ý: Thay MatKhauCucManhCuaBan! bằng mật khẩu mạnh của riêng bạn. Nếu ứng dụng cần kết nối từ máy chủ khác (không phải localhost), hãy thay 'localhost' bằng địa chỉ IP hoặc '%' (cho phép từ mọi nơi, nhưng cần đặc biệt cẩn trọng về bảo mật).

Bước 7: Cấu hình truy cập từ xa (Tùy chọn)

Mặc định, MySQL server chỉ chấp nhận kết nối từ localhost. Nếu bạn cần các ứng dụng từ máy chủ khác kết nối đến, bạn cần thay đổi cấu hình này.

Đầu tiên, chỉnh sửa file cấu hình MySQL:


sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Tìm dòng bind-address và thay đổi nó như sau:


[mysqld]
# ... các cấu hình khác ...
# bind-address = 127.0.0.1
bind-address = 0.0.0.0 # Cho phép kết nối từ mọi địa chỉ IP
# Hoặc chỉ cho phép từ một IP cụ thể, ví dụ: bind-address = 192.168.1.100

Lưu và đóng file (Ctrl+X, Y, Enter). Sau đó, khởi động lại MySQL:


sudo systemctl restart mysql

Cuối cùng, bạn cần mở cổng MySQL (mặc định là 3306) trên tường lửa của Ubuntu (UFW).


sudo ufw allow 3306/tcp
sudo ufw status

Hãy đảm bảo rằng ufw đã được bật và cổng 3306/tcp đã được cho phép.

Cảnh báo quan trọng: Việc mở cổng truy cập từ xa làm tăng rủi ro bảo mật. Luôn đảm bảo bạn đã cấu hình mật khẩu mạnh và chỉ cấp quyền cho các địa chỉ IP đáng tin cậy.

Bước 8: Tối ưu cấu hình cơ bản từ kinh nghiệm thực tế

Cấu hình mặc định của MySQL 8 khá tốt cho nhiều trường hợp. Tuy nhiên, khi hệ thống của bạn bắt đầu có tải trọng cao, việc tối ưu là không thể tránh khỏi. Mình nhớ hồi mới làm dự án đầu tiên, khi table users chạm ngưỡng 10 triệu dòng, các câu truy vấn bắt đầu chậm kinh khủng. Điều này ảnh hưởng trực tiếp đến trải nghiệm người dùng. Đó là lúc mình nhận ra cấu hình MySQL mặc định không thể nào đáp ứng được tải lớn, và việc tối ưu index cùng các tham số hệ thống là tối quan trọng.

Một trong những tham số quan trọng nhất là innodb_buffer_pool_size. Đây là vùng bộ nhớ cache mà InnoDB (engine lưu trữ mặc định của MySQL 8) dùng để lưu trữ dữ liệu và index thường xuyên được truy cập. Việc cấp phát đủ RAM cho innodb_buffer_pool_size có thể cải thiện hiệu suất đọc lên đáng kể. Mình thường đặt nó khoảng 70-80% tổng dung lượng RAM của máy chủ nếu đó là máy chủ chỉ chạy MySQL (ví dụ, máy chủ 4GB RAM có thể đặt innodb_buffer_pool_size là 3GB).

Để chỉnh sửa, bạn cũng vào file mysqld.cnf:


sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Thêm hoặc chỉnh sửa dòng dưới mục [mysqld]:


[mysqld]
# ... các cấu hình khác ...
innodb_buffer_pool_size = 2G # Ví dụ đặt 2GB, điều chỉnh theo RAM thực tế của server

Sau đó, khởi động lại MySQL để áp dụng thay đổi:


sudo systemctl restart mysql

MySQL 8 đã loại bỏ query_cache. Thay vào đó, bạn có thể cân nhắc các cơ chế caching ở tầng ứng dụng hoặc sử dụng các công cụ như ProxySQL để tối ưu kết nối và cache truy vấn. Việc theo dõi slow query log cũng là một công cụ đắc lực để tìm ra các câu lệnh SQL cần tối ưu hiệu suất.

Kết luận

Với các bước hướng dẫn chi tiết trên, bạn đã cài đặt và cấu hình thành công một máy chủ MySQL 8 trên Ubuntu. Từ việc thiết lập bảo mật ban đầu đến tạo người dùng, cơ sở dữ liệu và những điều chỉnh tối ưu cơ bản, bạn đã có một nền tảng vững chắc để triển khai các ứng dụng của mình.

Hãy nhớ rằng, cài đặt chỉ là bước khởi đầu. Việc duy trì, giám sát hiệu suất và liên tục tối ưu MySQL là một quá trình liên tục, đặc biệt khi hệ thống của bạn phát triển. Luôn ưu tiên bảo mật và đừng ngần ngại tìm hiểu sâu hơn về các tính năng mạnh mẽ khác mà MySQL 8 cung cấp. Chúc bạn thành công với các dự án sử dụng MySQL!

Share: