Như một phần tử thiết yếu của bất kỳ hệ thống quản trị cơ sở dữ liệu nào, nhật ký (log) đóng vai trò ghi lại toàn bộ quá trình vận hành, các thao tác truy cập và những sự cố kỹ thuật phát sinh. Trong hệ sinh thái MySQL, việc theo dõi các tệp nhật ký không chỉ hỗ trợ công tác giám sát mà còn là chìa khóa để tối ưu hóa hiệu suất và khôi phục dữ liệu.
Hệ thống nhật ký của MySQL được phân loại thành bốn nhóm chính, mỗi nhóm phục vụ một mục đích cụ thể:
- Nhật ký nhị phân (Binary Log): Lưu trữ dưới dạng nhị phân các lệnh thay đổi cấu trúc (DDL) và dữ liệu (DML), nhưng thường không bao gồm lệnh đọc dữ liệu đơn thuần.
- Nhật ký lỗi (Error Log): Ghi nhận các trạng thái khởi động, tắt máy, cùng các ngoại lệ hoặc lỗi nghiêm trọng xảy ra trong suốt vòng đời của server.
- Nhật ký truy vấn chung (General Query Log): Lưu giữ mọi hoạt động từ client, bao gồm thông tin kết nối và toàn bộ câu lệnh SQL được gửi đến server.
- Nhật ký truy vấn chậm (Slow Query Log): Tập trung ghi lại các lệnh thực thi vượt quá ngưỡng thời gian quy định nhằm hỗ trợ tìm kiếm điểm nghẽn về hiệu năng.
Tuy nhiên, việc kích hoạt tất cả các loại nhật ký này có đánh đổi đáng kể về hiệu suất và dung lượng lưu trữ. Mặc dù giúp ích cho việc kiểm tra sau sự kiện, nhưng chúng làm tiêu tốn tài nguyên hệ thống. Do đó, chiến lược kích hoạt cần dựa trên nhu cầu thực tế của từng ứng dụng.
Cấu Hình Nhật Ký Lỗi (Error Log)
Là nguồn thông tin quan trọng nhất khi server gặp sự cố, nhật ký lỗi thường mặc định được bật. Nó được định vị trong thư mục dữ liệu với tên quy ước là [hostname].err. Tham số cấu hình chính bao gồm log_error để chỉ định đường dẫn/tên file, và log_warnings để quyết định có ghi cảnh báo hay không.
Để điều chỉnh, người quản trị thêm đoạn cấu hình vào file my.cnf hoặc my.ini:
[mysqld]
log-error=/var/log/mysql/error.log
Sau khi sửa đổi, dịch vụ phải khởi động lại. Để xác minh vị trí tập tin đang sử dụng hiện tại, ta dùng câu lệnh:
SHOW VARIABLES LIKE 'log_error';
Kết quả trả về sẽ hiển thị đường dẫn tuyệt đối tới file nhật ký. File này có thể mở bằng bất kỳ trình soạn thảo văn bản nào để phân tích các dòng ghi lại như khởi động InnoDB, tạo socket, hoặc tải các sự kiện.
Một kỹ thuật phổ biến để giải phóng không gian đĩa là xoay vòng (rotate) nhật ký lỗi thông qua mysqladmin:
mysqladmin -u root -p flush-logs
Lệnh này tự động tạo file mới và chuyển đổi file cũ sang đuôi -old thay vì xóa hẳn.
Xử Lý Nhật Ký Truy Vấn Chung
Nhật ký truy vấn chung cung cấp một bản ghi chi tiết mọi tương tác với server. Tuy nhiên, do mức độ ghi chép dày đặc, nó gây ảnh hưởng lớn đến tốc độ xử lý nên thường bị tắt ở chế độ mặc định.
Trạng thái bật/tắt có thể kiểm tra qua biến general_log.
SHOW VARIABLES LIKE 'general_log';
Kích hoạt bằng cách đặt tham số trong file cấu hình:
[mysqld]
log = /var/log/mysql/general.log
Hoặc động (runtime) thông qua câu lệnh SET:
SET GLOBAL general_log = ON;
Để dừng hoạt động ghi mà không cần restart lại service, hãy sử dụng lệnh set ngược lại:
SET GLOBAL general_log = OFF;
Giống như nhật ký lỗi, dữ liệu trong đây cũng được chứa dưới dạng văn bản thuần. Người dùng cần chú ý dọn dẹp thường xuyên vì file này tăng trưởng rất nhanh nếu database chịu nhiều yêu cầu giao dịch.
Tối Ưu Hóa Qua Nhật Ký Truy Vấn Chậm
Giải pháp này được thiết kế dành cho việc phân tích hiệu năng, giúp liệt kê các truy vấn tiêu tốn nhiều thời gian xử lý. Nó thường được khuyến khích chỉ bật trong môi trường staging hoặc khi cần debug hiệu năng.
Tính năng này dựa trên hai biến tham chiếu chính: slow_query_log để bật tính năng và long_query_time để định nghĩa ngưỡng (đơn vị giây).
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
Bảng dữ liệu dưới đây minh họa cách kích hoạt trực tiếp mà không cần restart:
USE monitoring_db;
SELECT account_id, balance FROM accounts WHERE status = 'active';
Dữ liệu ghi lại trong nhật ký chậm bao gồm thời gian thực thi (Query_time), thời gian khóa (Lock_time) và số hàng đã quét (Rows_examined). Việc giảm giá trị long_query_time xuống thấp (ví dụ 0.01s) hữu ích cho giai đoạn thử nghiệm để thu thập đầy đủ dữ liệu thô.
Phương thức xóa dữ liệu cũ cũng tương tự như các loại nhật ký khác: dùng lệnh PURGE MASTER LOGS hoặc lệnh flush-logs đi kèm mysqladmin để đóng file cũ và mở file mới.
Vận Hành Nhật Ký Nhị Phân (Binary Log)
Đây là loại nhật ký cốt lõi cho việc sao lưu và nhân bản dữ liệu. Nó ghi lại mọi lệnh DDL (tạo bảng, xóa cấu trúc) và DML (thêm, sửa, xóa dữ liệu) theo thứ tự thời gian.
Trước khi xem xét khả năng bật tính năng này, cần kiểm tra biến hệ thống:
SHOW VARIABLES LIKE 'log_bin';
Mặc định, tùy chọn này thường bị vô hiệu hóa. Để bật, chỉnh sửa file cấu hình:
[mysqld]
log-bin=mysql-bin
File cấu hình sẽ tạo ra tập tin mysql-bin.index lưu danh sách các segment nhật ký hiện có. Tên file mặc định thường mang đuôi số thứ tự liên tục (ví dụ .000001, .000002).
Do định dạng nhị phân, không thể xem nội dung trực tiếp bằng Notepad. Công cụ mysqlbinlog được sử dụng để giải mã:
mysqlbinlog /var/lib/mysql/mysql-bin.000001
Chức năng xóa hoặc quản lý vòng đời nhật ký này có các tùy chọn nâng cao:
- Xóa toàn bộ: Sử dụng
RESET MASTER. Lưu ý lệnh này mất sạch dữ liệu backup. - Xóa theo vị trí file:
PURGE MASTER LOGS TO 'mysql-bin.000003'sẽ xóa các file đứng trước số này. - Xóa theo ngày tháng: Thiết lập biến
expire_logs_daystrong file cấu hình để tự động xóa các log cũ sau N ngày.
Trong trường hợp không muốn một số lệnh nghiệp vụ cụ thể ghi vào nhật ký (ví dụ các thủ tục hệ thống ít quan trọng), có thể tạm ẩn bằng biến phiên:
SET SQL_LOG_BIN = 0;
Một mẹo bảo mật quan trọng là tách biệt vị trí lưu trữ vật lý giữa dữ liệu chính (Data Directory) và nhị phân log. Cách này đảm bảo khả năng phục hồi ngay cả khi ổ cứng chứa dữ liệu gốc gặp sự cố.