Tối ưu my.cnf cho MySQL 8: Đừng để Server ‘nghẹt thở’ vì cấu hình mặc định

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

Tại sao cấu hình mặc định của MySQL 8 là chưa đủ?

Cài xong MySQL 8 rồi để đó chạy luôn là “cái bẫy” mà nhiều sysadmin mới vào nghề hay mắc phải. Bạn cần biết rằng, các thông số mặc định được thiết kế để chạy được trên cả những máy tính yếu nhất như Raspberry Pi. Khi đưa lên server production 16GB hay 64GB RAM, MySQL sẽ chỉ dùng một phần nhỏ tài nguyên. Hệ quả là website bị chậm, thậm chí treo cứng khi lượng truy cập tăng cao.

Thú thật, mình từng quản lý một hệ thống thương mại điện tử chạy trên server 32GB RAM nhưng database cứ ì ạch. Kiểm tra ra mới thấy innodb_buffer_pool_size vẫn để mặc định 128MB. Lúc đó, Disk I/O luôn chạm ngưỡng 100% vì MySQL phải đọc ghi liên tục từ ổ cứng thay vì trên RAM. Sau khi nâng thông số này lên 20GB, tốc độ phản hồi của site tăng gấp 5 lần ngay lập tức.

Quick Start: Cấu hình mẫu cho server 8GB RAM

Nếu bạn cần một bộ khung chuẩn để chạy ngay, hãy mở file cấu hình tại /etc/mysql/my.cnf. Nhớ backup file gốc trước khi ghi đè đoạn mã dưới đây vào nhé.

[mysqld]
# 1. Bộ nhớ đệm (Quan trọng nhất)
innodb_buffer_pool_size = 5G

# 2. Quản lý kết nối
max_connections = 500
max_user_connections = 450

# 3. Tối ưu ghi đĩa
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 4. Bảng tạm và Sắp xếp
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 2M

# 5. Đặc thù MySQL 8
innodb_dedicated_server = OFF

Áp dụng thay đổi bằng cách restart dịch vụ:

sudo systemctl restart mysql

Phân tích các tham số “sống còn”

1. innodb_buffer_pool_size: Linh hồn của hiệu suất

Đây là nơi MySQL giữ dữ liệu và index trong RAM. Truy xuất từ RAM nhanh hơn hàng nghìn lần so với ổ cứng SSD.

  • Nguyên tắc: Càng lớn càng tốt, nhưng đừng để server bị tràn RAM (swap).
  • Cách chia: Nếu server chạy chung với Nginx/PHP, hãy dành 40-50% RAM cho MySQL. Với server database riêng biệt, con số này có thể lên tới 75-80%.

MySQL 8 có tính năng innodb_dedicated_server = ON giúp tự động tính toán thông số này. Tuy nhiên, mình khuyên bạn chỉ bật nó khi server không chạy thêm bất kỳ ứng dụng nặng nào khác.

2. Đừng lạm dụng max_connections

Thấy lỗi “Too many connections” không có nghĩa là bạn nên nâng nó lên 2000 hay 5000. Đây là sai lầm chết người. Mỗi kết nối đều chiếm một lượng RAM nhất định cho buffer.

Giả sử mỗi kết nối chiếm 2MB, 5000 kết nối sẽ ngốn sạch 10GB RAM chỉ để… duy trì trạng thái chờ. Thay vì tăng số lượng, hãy tối ưu code để đóng kết nối ngay sau khi dùng. Nếu hệ thống thực sự lớn, hãy dùng ProxySQL để quản lý connection pool hiệu quả hơn.

3. Cân bằng giữa an toàn và tốc độ với ghi Log

Tham số innodb_flush_log_at_trx_commit quyết định cách dữ liệu được ghi xuống đĩa:

  • Giá trị = 1: An toàn tuyệt đối nhưng chậm nhất vì phải đợi đĩa cứng xác nhận mỗi khi có giao dịch.
  • Giá trị = 2: Lựa chọn tối ưu cho đa số hệ thống. Dữ liệu được ghi vào cache OS mỗi giây. Nếu MySQL crash, bạn không mất gì cả. Bạn chỉ mất khoảng 1 giây dữ liệu nếu server bị sập nguồn đột ngột.
  • Giá trị = 0: Tốc độ bàn thờ nhưng cực kỳ rủi ro. Chỉ dùng cho dữ liệu nháp hoặc log không quan trọng.

Lưu ý về Sort và Join Buffer

Nhiều người có thói quen set sort_buffer_size lên vài trăm MB để chạy query cho nhanh. Đừng làm vậy! Buffer này được cấp phát trên mỗi kết nối. Nếu bạn có 500 user và set 128MB, server sẽ sập vì hết RAM chỉ trong vài phút cao điểm. Hãy giữ mức 1MB – 4MB và tập trung đánh Index chuẩn cho câu lệnh SQL.

Quy trình tinh chỉnh của một chuyên gia

Đừng bao giờ thay đổi 10 tham số cùng một lúc. Hãy làm theo trình tự để kiểm soát rủi ro:

  1. Chỉnh sửa tối đa 2 thông số mỗi lần.
  2. Theo dõi CPU, RAM và Slow Query Log trong ít nhất 24 giờ.
  3. Dùng công cụ mysqltuner.pl để lấy gợi ý thực tế từ dữ liệu đang chạy.

Bạn có thể chạy script này rất đơn giản:

wget http://mysqltuner.pl/ -O mysqltuner.pl
perl mysqltuner.pl

Nó sẽ chỉ ra chính xác bảng nào đang thiếu index hoặc buffer nào đang quá thấp. Tối ưu MySQL là một hành trình tinh chỉnh liên tục, không phải là một công thức cố định. Hãy bắt đầu từ RAM và I/O, bạn sẽ thấy hệ thống vận hành mượt mà hơn hẳn.

Share: